Spring-MyBatis整合
4.1 整合概述
-
将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。
-
使用技术:IOC
4.2 复习MyBatis步骤
mybatis使用步骤:
- 创建dao接口 StudentDao
- 定义mapper文件 StudentDao.xml
- 定义mybatis的主配置文件 mybatis.xml
- 创建dao的代理对象 StudentDao dao = SqlSession.getMapper(StudentDao.class)
- 测试 List students = dao.selectStudents()
4.3 MyBatis和Spring整合分析
要使用dao对象 需要使用getMapper()方法,如何使用getMapper()方法,需要哪些条件:
-
获取SqlSession对象,需要使用SqlSessionFactory的openSession()方法
-
创建SqlSessionFactory对象,通过读取mybatis的主配置文件,能创建SqlSessionFactory对象
需要SqlSessionFactory对象,使用Factory能获取SqlSession, 有了SqlSession就能有dao,目的就是获取dao对象
Factory需要读取主配置文件
-
主配置文件包含:
- 数据库信息
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/springdb"/> <property name="username" value="root"/> <property name="password" value="12345678"/> </dataSource> </environment>
- mapper文件位置
<mappers> <mapper resource="com/st/dao/StudentDao.xml"/> </mappers>
-
使用独立的连接池对象替换mybatis默认自带的,把连接池类也交给spring创建
通过以上的说明,我们需要让spring创建一下对象
- 独立的连接池对象,使用阿里云druid连接池
- SqlSessionFactory对象
- 创建dao对象
需要学习的就是以上三个对象的创建方法,使用xml的bean标签。
4.4 整合步骤
步骤:
- MySQL创建数据库,新建表
- 新建maven项目,加入依赖
- spring依赖
- mybatis依赖
- mysql驱动
- spring事务的依赖
- mybatis和spring集成的依赖:mybatis官方提供的,用来在spring创建mybatis的SqlSessionFactory,dao对象的
- 创建实体类
- 创建dao接口和mapper文件
- 创建mybatis主配置文件
- 创建Service的接口和实现类,属性是dao
- 创建spring的配置文件:声明mybatis的对象交给spring创建
- 数据源 DataSource
- SqlSessionFactory
- Dao对象
- 声明自定义的service
- 创建测试类,获取Service对象,通过service调用dao完成数据库的访问
4.4.1 MySQL新建表
4.4.2 新建maven项目,加入依赖
-
添加spring以外的依赖
-
Spring事务依赖
-
jdbc
-
mybatis
-
mybatis和spring集成的依赖:mybatis官方提供的,用来在spring创建mybatis的SqlSessionFactory,dao对象
-
数据库驱动
-
druid连接池
-
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.20</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<!--mybatis和spring集成的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--阿里云数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
<build>
<resources>
<resource> <directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include> </includes> <filtering>false</filtering>
</resource>
</resources>
</build>
4.4.3 创建实体类Student
@Data
@ToString
public class Student {
private Integer id;
private String name;
private String email;
private Integer age;
public Student() {
}
public Student(Integer id, String name, String email, Integer age) {
this.id = id;
this.name = name;
this.email = email;
this.age = age;
}
}
4.4.4 创建dao接口和mapper文件
创建StudentDao接口:
public interface StudentDao {
int insertStudent(Student student);
List<Student> selectStudents();
}
创建StudentDao对应的mapper文件:
<?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.st.dao.StudentDao">
<insert id="insertStudent" >
insert into student values (#{id}, #{name}, #{email}, #{age})
</insert>
<select id="selectStudents" resultType="com.st.domain.Student">
select id, name, email, age from student order by id desc
</select>
</mapper>
4.4.5 创建mybatis主配置文件
不需要在配置文件中定义DataSource等,只需将mapper文件配置好即可,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>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<mappers>
<!--<mapper resource="com/st/dao/StudentDao.xml"/>-->
<package name="com.st.dao"/>
</mappers>
</configuration>
4.4.6 创建Service的接口和实现类,属性是dao
调用service --> 调用dao --> 实现持久化
StudentService接口:
public interface StudentService {
int addStudent(Student student);
List<Student> queryStudent();
}
接口实现类,StudentServiceImpl:
public class StudentServiceImpl implements StudentService {
private StudentDao studentDao;
public void setStudentDao(StudentDao studentDao){
this.studentDao = studentDao;
}
@Override
public int addStudent(Student student) {
int nums = studentDao.insertStudent(student);
return nums;
}
@Override
public List<Student> queryStudent() {
List<Student> students = studentDao.selectStudents();
return students;
}
}
4.4.7 创建spring的配置文件
创建spring的配置文件:声明mybatis的对象交给spring创建
- 数据源 DataSource,作用是连接数据库的
SqlSessionFactoryBean
,SqlSessionFactory获取- dataSource属性,set注入数据库连接池赋值给datasource
- configLocation属性,mybatis主配置文件的位置 ,configLocation是Resource类型,用来读取配置文件,它的赋值使用value指定文件的路径,使用classpath表示文件的位置
MapperScannerConfigurer
, 创建dao对象,使用SqlSession的getMapper,- sqlSessionFactoryBeanName属性,指定sqlSessionFactory的id
- basePackage属性,指定包名,包名是dao接口所在的包名,MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行一次getMapper方法,得到每个接口的dao对象 ,创建好的dao对象放入到spring的容器中,名字是:接口名的首字母小写
- 声明自定义的service
applicatiaonContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--0. 外部配置文件 -->
<context:property-placeholder location="jdbc.properties"/>
<!--1. 声明数据源-->
<bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!--set注入给DruidDataSource提供连接数据库信息-->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--2. 声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/>
<property name="configLocation" value="classpath:mybatis.xml"/>
</bean>
<!--3. 创建dao对象,使用SqlSession的getMapper-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.st.dao"/>
</bean>
<!--4. 声明service-->
<bean id="studentService" class="com.st.Service.StudentServiceImpl">
<property name="studentDao" ref="studentDao"/>
</bean>
</beans>
4.4.8 创建测试类
创建测试类,获取Service对象,通过service调用dao完成数据库的访问。MyTest代码:
public class MyTest {
@Test
public void test01(){
String config = "applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
String[] names = ctx.getBeanDefinitionNames();
for(String na:names){
System.out.println("容器中对象名称:" + na + "|" + ctx.getBean(na));
}
}
@Test
public void testServiceInsert(){
String config = "applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
StudentService service = (StudentService) ctx.getBean("studentService");
Student student = new Student();
student.setId(2003);
student.setName("testService");
student.setEmail("testService");
student.setAge(25);
//spring和mybatis整合在一起时,事务是自动提交的 不必手动提交事务SqlSession.commit()
int nums = service.addStudent(student);
System.out.println(nums);
}
@Test
public void testServiceSelect(){
String config = "applicationContext.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
StudentService service = (StudentService) ctx.getBean("studentService");
List<Student> students = service.queryStudent();
students.forEach(student -> System.out.println(student));
}
}