SSM學習記錄(一)——將Mybatis整合入Spring項目中

2018.4.24

僅爲個人理解 不足之處歡迎指正~



本文所有內容均在

SpringMVC學習記錄(四)——簡單SpringMVC登錄註冊項目

項目基礎上修改


初始項目結構:

原Dao層所採用的數據交互方法爲基本JDBC:

UserDaoImpl.java:

package dao;

import org.springframework.stereotype.Repository;

import pojo.Login;
import pojo.User;

import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.PreparedStatement;  
import java.sql.ResultSet;  
import java.sql.SQLException;  

@Repository("userDao")
public class UserDaoImpl implements UserDao
{
	//獲得連接  
	@Override
	public  Connection getConnection(){  
        String driver ="com.mysql.jdbc.Driver";  
        String url ="jdbc:mysql://localhost:3306/mvcdemo2?useUnicode=true&characterEncoding=utf-8&useSSL=false";  
        String user ="root";  
        String password ="root";  
        Connection connection =null;  
        try {  
            Class.forName(driver);  
            connection =DriverManager.getConnection(url, user, password);  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
        return connection;  
    }  
  //註冊用戶
	@Override
	public void register(User user) 
    {  
        try {  
        	Connection con = getConnection();  
            PreparedStatement preparedStatement = null;  
            String sql=  "insert into user (username,password,phone,email) values(?,?,?,?)";  
            preparedStatement=con.prepareStatement(sql);  
            preparedStatement.setString(1, user.getUsername());  
            preparedStatement.setString(2, user.getPassword());  
            preparedStatement.setString(3, user.getPhone());  
            preparedStatement.setString(4, user.getEmail());  
            preparedStatement.executeUpdate();  
            	}
        catch (Exception e) {  
            // 
        }
    }  
    //驗證用戶登錄
	@Override
	public User validateUser(Login login)
    {
    	User user=new User();
    	String sql="select * from user where username=?";
    	Connection con=getConnection();
    	PreparedStatement pstmt=null;
    	ResultSet rs=null;
    	try
    	{
    		pstmt=con.prepareStatement(sql);
    		pstmt.setString(1, login.getUsername());
    		rs=pstmt.executeQuery();
    		while(rs.next())
    		{
    			user.setUsername(rs.getString(1));
    			user.setPassword(rs.getString(2));
    			user.setPhone(rs.getString(3));
    			user.setEmail(rs.getString(4));
    		}
    	}
    	catch(SQLException e)
    	{
    		e.printStackTrace();
    	}
    	finally
    	{
    		try
    		{
    			if(pstmt!=null) pstmt.close();
        		if(con!=null) con.close();
    		}
    		catch(SQLException e)
    		{
    			e.printStackTrace();
    		}
    	}
    	return user;
    }
}

本次修改目的在於將與數據庫交互的方法改爲Mybatis

實現將Mybatis整合入這個項目



第一步:編寫UserDao.xml

在上一篇文章提到:一個接口對應一個實現

上一篇中的Dao層如下:


而我們知道在Mybatis中 一個實體類對應一個xml

這個xml整合入SpringMVC中仍然起到實現的作用

所以我們可以將UserDaoImpl.java 替換爲UserDao.xml


首先明確需要的操作:

  • 註冊所需的增加用戶
  • 登錄所需的查詢用戶

首先進行增加用戶語句的編寫:



然後進行查詢用戶語句的編寫:



完整UserDao.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="dao.UserDao">
	
		<insert id="addUser" parameterType="pojo.User" >
	        insert into user values (#{username},#{password},#{phone},#{email})    
	    </insert>
	   
	    <select id="getUserByusername" parameterType="string" resultType="pojo.User">
	        select * from   user  where username=#{username}
	    </select>

    </mapper>


注意:


namespace必須對應這個xml所實現的接口


第二步:修改對應的UserDao.java

完整UserDao.java代碼如下:

package dao;

import org.mybatis.spring.annotation.MapperScan;

import pojo.User;

@MapperScan
public interface UserDao
{
	User getUserByusername(String username); //根據用戶名獲取用戶
	void addUser(User user); //註冊用戶
}

注意:

1.

中寫的兩個方法名與xml中的id名對應

返回值與參數列表與 resultType與parameterType對應

2. 

需要加上@MapperScan纔算完成這個接口的實現


第三步:修改對應的Service層

service.java不變

package service;

import pojo.User;

public interface UserService 
{
	void addUser(User user);
	String login(User user);
}

serviceImpl.java 根據調用的方法做微調:

package service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pojo.Login;
import pojo.User;
import dao.UserDao;

@Service
public class UserServiceImpl implements UserService
{
	@Resource
	UserDao userdao;
	@Override
	public void addUser(User user) 
	{
		System.out.println("service:");
		System.out.println(user.getUsername());
		System.out.println(user.getPassword());
		System.out.println(user.getPhone());
		System.out.println(user.getEmail());
		userdao.addUser(user);
		
	}
	@Override
	public String login(User user) 
	{
		String username=user.getUsername();
		User trueuser=userdao.getUserByusername(username);
		if(trueuser.getPassword().equals(user.getPassword()))
		{
			return "登錄成功";
		}
		else
		{
			return "密碼錯誤";
		}
	}
}

第四步:三個配置文件

在整合Mybatis之後 我們理所當然的需要Mybatis的配置文件mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC  
     "-//mybatis.org//DTD Config 3.0//EN"  
     "http://mybatis.org/dtd/mybatis-3-config.dtd">  
 <configuration>
    <typeAliases>
        <typeAlias type="pojo.User" alias="User"/>
    </typeAliases>
     <mappers>
         <mapper resource="dao/UserDao.xml"/>
     </mappers>
 </configuration> 

這個配置文件與我們在Mybatis學習記錄中使用的相比減少了很多東西:

主要體現在:


這是因爲這部分的配置文件將整合進spring的配置文件中


接下來配置Spring的配置文件springConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/tool"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd">
    <!--配置數據源-->
    <bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mvcdemo2?useUnicode=true&characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    <!--配置sessionFactory-->
    <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="jdbcDataSource" />
        <property name="mapperLocations">
            <array>
                <value>classpath:Dao/**/*.xml</value>
            </array>
        </property>
        <property name="typeAliasesPackage" value="com.isea533.mybatis.model"/>
        <!-- MybatisSpringPageInterceptor分頁攔截器 -->
        <!--<property name="plugins">-->
            <!--<bean class="com.wlxk.Util.MybatisSpringPageInterceptor"/>-->
        <!--</property>-->
    </bean>
    <!--配置dao 自動掃描帶有@MapperScan註解的-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="dao"/>
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
    </bean>
    <!--全局異常處理-->

    <!--service 註解掃描-->
    <context:component-scan base-package="service"/>
</beans>

幾點需要注意:

1.

數據源的配置由mybatis的配置文件轉移至spring的配置文件


2.


同樣我們在Mybatis中需要獲取對象時使用的sessionFactory:


在Spring中不再需要

取而代之的是這一段配置代碼


springMVC的配置文件沒有改變:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:annotation-config/>
<context:component-scan base-package="controller" />
    <!-- 視圖頁面配置 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
     <property name="prefix" value="/WEB-INF/views/" />  
        <property name="suffix" value=".jsp" />  
    </bean>
</beans>


其他代碼改動與注意點:

(1)

LoginController.java:

package controller;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import pojo.User;
import service.UserService;
@Controller

public class LoginController 
{
    @Resource
	UserService userService;
	@RequestMapping("/Login")  
     public ModelAndView login
     (@RequestParam("username") String userName, 
       @RequestParam("password") String passWord) 
    {  
            ModelAndView mv = new ModelAndView("welcome");
            User user=new User(userName,passWord,null,null);
            String mes=userService.login(user);
            mv.addObject("name",userName);
            mv.addObject("message", mes);
            return mv;
      }
}



(2)

RegiesterController.java

package controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import pojo.User;
import service.UserService;
import service.UserServiceImpl;

@Controller
public class RegisterController 
{
    @Resource
	UserService userService;
	
	@RequestMapping(value="/register")
	public ModelAndView showRegister(HttpServletRequest request,HttpServletResponse response)
	{
		ModelAndView mav=new ModelAndView("register");
		mav.addObject("user",new User());
		return mav;
	}
	@RequestMapping(value="/reg",method=RequestMethod.POST)
	public ModelAndView addUser(HttpServletRequest request,HttpServletResponse response,
			@RequestParam("username") String userName, 
		    @RequestParam("password") String passWord,
		    @RequestParam("phone") String phone, 
		    @RequestParam("email") String email)
	{
		User user=new User(userName,passWord,phone,email);
		System.out.println("用戶信息如下:");
		System.out.println(user.getUsername());
		System.out.println(user.getPassword());
		System.out.println(user.getPhone());
		System.out.println(user.getEmail());
		userService.addUser(user);
		ModelAndView mv = new ModelAndView("welcome");
		String mes="註冊成功";
        mv.addObject("name", user.getUsername());
        mv.addObject("message", mes);
        return mv;
	}
}

(3)

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>TestMaven</display-name>
    <welcome-file-list>
    <welcome-file>/WEB-INF/views/index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
             <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springContext.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/</url-pattern>
  </servlet-mapping>
  <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springConfig.xml</param-value>
  </context-param>
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>


(4)pom.xml

添加了新的包:mybatis與mybatis-spring 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.tzy</groupId>
  <artifactId>MVCDemo2</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>MVCDemo1 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
      <spring.version>4.3.0.RELEASE</spring.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
    	<groupId>mysql</groupId>
    	<artifactId>mysql-connector-java</artifactId>
    	<version>5.1.34</version>
    </dependency>
	<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.1</version>
	</dependency>
    <dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis</artifactId>
    	<version>3.4.5</version>
    </dependency>
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-jdbc</artifactId>
    	<version>4.3.2.RELEASE</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
    <finalName>TestMaven2</finalName>
  </build>
</project>


完整項目結構與測試:

完整項目結構如下:


index.jsp  welcome.jsp register.jsp並沒有進行任何改動

如有需要請在SpringMVC學習記錄(四)——簡單SpringMVC登錄註冊項目中獲取


運行結果:




總結:

這次將Mybatis整合進入了之前的登錄註冊項目

之後打算進行AOP的模擬——增加一個登錄日誌

在這個項目的整合過程中遇到了一個問題

之間的版本關係似乎有點複雜 總之這是一種可以成功的搭配


謝謝~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章