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的模拟——增加一个登录日志

在这个项目的整合过程中遇到了一个问题

之间的版本关系似乎有点复杂 总之这是一种可以成功的搭配


谢谢~

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