MyBatis是通过SqlSessionFactory==>SqlSession==>StudentMapper==>CRUD,来对数据库进行操作。
可以发现MyBatis最终是通过SqlSessionFactory来操作数据库,Spring整合MyBatis其实就是将SqlSessionFactory交给Spring。
整合步骤:
1、引入jar包
2、创建类和数据库表
public class Student {
private int stuNum;
private String stuName;
private int stuAge;
3、通过mapper.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">
<!-- namespace是接口的全类名 -->
<mapper namespace="org.yao.mapper.StudentMapper">
<select id="queryStudentByStuNum" parameterType="int" resultType="org.yao.entity.Student">
select * from student where stuNum = #{stuNum}
</select>
<insert id="addStudent" parameterType="org.yao.entity.Student">
insert into student(stuNum,stuName,stuAge) values(#{stuNum},#{stuName},#{stuAge})
</insert>
</mapper>
4、之前使用MyBatis,通过conf.xml文件产生SqlSessionFactory对象。现在整合的时候,需要通过Spring管理SqlSessionFactory,因此产生SqlSessionFactory对象所需要的数据库信息不再放入conf.xml配置文件中,而是放入Spring配置文件中。
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/yq
username=root
password=123456
在spring中引入db.properties
<!-- 加载db配置文件 ,加载属性文件需要通过PreferencesPlaceholderConfigurer来加载 -->
<bean id="config" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
<property name="locations">
<array>
<value>classpath:db.properties</value>
</array>
</property>
</bean>
<!-- 配置数据库信息,替代MyBatis配置文件conf.xm -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<!-- 通过el来获取 -->
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
</bean>
5、使用Spring-MyBatis整合产物开发程序,目标:通过spring产生mybatis最终操作需要的动态mapper对象(StudentMapper对象)。
spring产生动态mapper对象有3种方法:
a、DAO层实现类继承SqlSessionDaoSupport类,该类提供了sqlSession属性。
实现类继承SqlSessionDaoSupport父类
package org.yao.dao.impl;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.yao.entity.Student;
import org.yao.mapper.StudentMapper;
public class StudentDao extends SqlSessionDaoSupport implements StudentMapper{
@Override
public void addStudent(Student student) {
SqlSession session = super.getSqlSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper.addStudent(student);
}
}
在applicationContext.xml中配置
<!-- 在Springioc容器中创建MyBatis的核心类SqlSessioinFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis配置文件
<property name="configLocation" value="classpath:conf.xml"></property>-->
<!-- 加载mapper.xml路径 ,name属性值不可以更改;一次性将该目录里的xml文件都加载进来 -->
<property name="mapperLocations" value="org/yao/mapper/*.xml"></property>
</bean>
<bean id="studentService" class="org.yao.service.impl.StudentServiceImpl">
<property name="studentDao" ref="daos"></property>
</bean>
<!-- 第一种方式:生成mapper对象 -->
<bean id="studentDao" class="org.yao.dao.impl.StudentDao">
将spring配置的sqlSession对象交给dao层
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
b、省略掉第一种方式的实现类,直接使用MyBatis提供的Mapper实现类:org.mybatis.spring.mapper.MapperFactoryBean。缺点是:每一个mapper都需要配置一次。
<!-- 第二种方式生成mapper对象 (缺点:每一个mapper就需要配置一次)-->
<bean id="studentDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
name的属性不能改变,value的值就是studentMapper接口的全类名
<property name="mapperInterface" value="org.yao.mapper.StudentMapper"></property>
不管哪种方式都要配置数据库信息
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
c、可以批量产生多个mapper,不用和第二种一样,每个mapper都配置一次。
<!-- 第三种方式 生成mapper对象(批量产生多个mapper)
批量产生Mapper对在SpringIOC中的id值默认就是首字母小写的接口名
-->
<bean id="daos" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- name值不能改变 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<!-- 指定批量产生哪个包的mapper对象 ,要是有多个包,在value中用逗号隔开即可 -->
<property name="basePackage" value="org.yao.mapper"></property>
</bean>
测试方法
package org.yao.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.yao.entity.Student;
import org.yao.service.impl.StudentServiceImpl;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
StudentServiceImpl studentService = (StudentServiceImpl)context.getBean("studentService");
Student student = new Student();
student.setStuAge(33333);
student.setStuName("zs3d");
student.setstuNum(33);
studentService.addStudent(student);
}
}