Spring 集成Mybatis

引言:MyBatisSpring进行整合,主要解决的问题就是将 SqISessionFactory对象交由 Spring来管理。所以,该整合只需要将SqISessionFactory的对象生成器SqlSessionFactoryBean注册在Spring容器中,再将其注入给Dao的实现类即可完成整合。

实现思路: 实现Spring与MyBatis的整合常用的方式:扫描的Mapper动态代理。Spring像插线板一样, mybatis 框架是插头,可以容易的组合到一起。插线板spring插上mybatis,两个框架就是一个整体。

2.实现步骤

2.1创建数据库

  • 使用的mysq1库,使用学生表 student(stuid int主键列,自动增长,stuname varchar (45),stusex int ,stunum varchar (45))

2.2创建maven项

2.3 加入依赖

  • spring依赖,mybatis依赖,mysq1驱动。 junit依赖mybatis- spring依赖(mybatis网站 上提供的,用来在spring项目中,创建mybatis对 象)spring有关事务的依赖。mybatis和spring整合的时候,事 务是自动提交的。

 <!--1. spring所需要的jar包:(8+2) -->
        <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>

        <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>
     
     <!-- spring事务依赖jar包 -->
        <dependency>
		      <groupId>org.springframework</groupId>
		      <artifactId>spring-expression</artifactId>
		      <version>5.0.2.RELEASE</version>
	    </dependency>

        <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>

<!-- spring所需要的jar包:2个在这里 -->
          <dependency>
		       <groupId>aopalliance</groupId>
		       <artifactId>aopalliance</artifactId>
		       <version>1.0</version>
	       </dependency>

	       <dependency>
		       <groupId>org.aspectj</groupId>
		       <artifactId>aspectjweaver</artifactId>
		       <version>1.8.10</version>
	       </dependency>


<!-- 2.mybatis所需要使用的jar包:3个 -->
           <dependency>
			  <groupId>org.mybatis</groupId>
			  <artifactId>mybatis</artifactId>
			  <version>3.4.5</version>
		   </dependency>

           <dependency>
			    <groupId>commons-logging</groupId>
			    <artifactId>commons-logging</artifactId>
			    <version>1.2</version>
		   </dependency>

           <dependency>
			    <groupId>log4j</groupId>
			    <artifactId>log4j</artifactId>
			    <version>1.2.17</version>
		   </dependency>
<!-- 3.spring整合mybatis的中间jar包:4个 -->

      <!-- 数据库启动jar包 -->
          <dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.45</version>
		  </dependency>

      <!-- mybatis支持spring整合的中间件 jar包 -->
          <dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.2</version>
	      </dependency>

      <!--数据源支持 jar包 -->
          <dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.3.0</version>
		  </dependency>

		  <dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
			<version>2.3</version>
		 </dependency>
<!-- 4.1 测试类jar包:1个 -->
         <dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.6</version>
			<scope>test</scope>
		 </dependency>

2.4 创建实体类student

  • 根据数据表student的字段,在com.po包下创建持久化类Student,代码来喽:

package com.po;

public class Student {	
	private int stuid;
	private String stuname;
	private String stusex;
	private String stunum;
	public int getStuid() {
		return stuid;
	}
	public void setStuid(int stuid) {
		this.stuid = stuid;
	}
	public String getStuname() {
		return stuname;
	}
	public void setStuname(String stuname) {
		this.stuname = stuname;
	}
	public String getStusex() {
		return stusex;
	}
	public void setStusex(String stusex) {
		this.stusex = stusex;
	}
	public String getStunum() {
		return stunum;
	}
	public void setStunum(String stunum) {
		this.stunum = stunum;
	}
	@Override
	public String toString() {
		return "Student [stuid=" + stuid +",stuname=" + stuname + ",stusex=" + stusex +",stunum=" + stunum+"]";
	}
}

2.5 创建Dao接口和mapper文件写sql语句

  • 在com.dao包下创建用于执行业务功能的接口StudentDao,代码来咯:

package com.dao;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import com.po.Student;

@Repository("studentDao")
@Mapper
public interface StudentDao {	
	public List<Student> selectAllStudent();
	public int addStudent(Student student);
	public int updateStudent(Student student);
	public int deleteStudent(Integer stuid);
}
  • 在com.dao包下创建接口StudentDao,对应的Mapper文件StudentMapper.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="com.dao.StudentDao">
	<!-- 查询所有用户信息 -->
	<select id="selectAllStudent" resultType="com.po.Student">
		select * from student
	</select>
	<!-- 添加一个用户 ,#{uname}为com.po.MyUser的属性值 -->
	<insert id="addStudent" parameterType="com.po.Student">
		insert into student
		(stuname,stusex,stunum) values(#{stuname},#{stusex},#{stunum})
	</insert>
	<!-- 修改一个用户 -->
	<update id="updateStudent" parameterType="com.po.Student">
		update student set
		stuname = #{stuname},stusex = #{stusex},stunum = #{stunum} where stuid
		= #{stuid}
	</update>
	<!-- 删除一个用户 -->
	<delete id="deleteStudent" parameterType="Integer">
		delete from student where stuid = #{stuid}
	</delete>
</mapper>

2.6 写mybatis主配置文件

  • 配置Mybatis,在src/main/resource下创建log4j.properties文件,代码来喽:

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.dao=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
  • 创建mybatis-config.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>	
	<mappers>
		<!-- 映射文件的位置 -->
		<mapper resource="com/dao/StudentMapper.xml" />		
	</mappers>
</configuration>

2.7 创建实现类

  • 在com.controller包下创建控制器类StudentController(等价于service实现类),代码来喽:

package com.controller;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.dao.StudentDao;
import com.po.Student;

@Controller("studentController")
public class StudentController {
	@Autowired
	public StudentDao studentdao;	
	public void AddStudent()
	{
		Student stu = new Student();		
		stu.setStuname("张三");
		stu.setStusex("1");
		stu.setStunum("1234567890");
		int row = studentdao.addStudent(stu);		
		System.out.println("添加了"+row+"条记录");
	}
	public void DeleteStudent(int  stuid)
	{
		studentdao.deleteStudent(stuid);
	}
	public void UpdateStudent(Student student)
	{
		studentdao.updateStudent(student);	
	}
	public void SelectAllStudent()
	{
		List<Student> list = studentdao.selectAllStudent();		
		for (Student student : list) {
			System.out.println(student);
		}	
	}
}

2.8 创建spring的配置文件

  • 申明数据源DataSource,使用jdbc

  • 声明Sql SessionFac toryBean类,在这个类内部创建的是sqlSess ionFactory对象。

  • 声明MapperscannerConf iguration类,在内部创建dao代理对象,

创建的对象都放在spring容器中。

  • 声明Service对象, 把Dao赋值给service属性

在src/main/resource下创建applicationContext.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"
	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">
	 
	<!-- 配置数据源 -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver" />
		<property name="url"
			value="jdbc:mysql://localhost:3306/dbmis1?characterEncoding=utf8&useSSL=false" />
		<property name="username" value="root" />
		<property name="password" value="123456" />
		<!-- 最大连接数 -->
		<property name="maxTotal" value="30" />
		<!-- 最大空闲连接数 -->
		<property name="maxIdle" value="10" />
		<!-- 初始化连接数 -->
		<property name="initialSize" value="5" />
	</bean>
	<!-- 添加事务支持 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- 开启事务注解 -->
	<tx:annotation-driven	transaction-manager="txManager" />	 
</beans>

2.9 测试Dao访问数据库

  • 在src/test/java下新建com.controller包,新建TestStudentController类,代码来咯:

package com.controller;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestStudentController {
	@Test
	public void AddStudent()
	{
		ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
		StudentController suc = (StudentController)appCon.getBean("studentController");
		suc.AddStudent();		
	}
	@Test
	public void SelectAllStudent()
	{
		ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
		StudentController suc = (StudentController)appCon.getBean("studentController");
		suc.SelectAllStudent();		
	}
}
在TestStudentController类上点击右键,选择Run As->Junit Test运行测试代码