十二、整合MyBatis
步骤:
-
导入相关jar包:
- Junit
- mybatis
- mysql数据库
- spring相关
- AOP织入
- mybatis-spring【注意】
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.23</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <!--spring操作数据库,需要一个spring-jdbc--> <groupId>org.springframework</groupId> <artifactId>spring-jcl</artifactId> <version>5.3.4</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> </dependencies>
-
编写配置文件
-
测试
1.mybatis-spring
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession
并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException
。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
步骤
-
编写数据源配置
<!--DataSource:使用spring的数据源替换mybatis的配置--> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&userUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="mysqladmin"/> </bean>
-
SQLSessionFactory
<!--sqlSessionFactory:可以将mybatis-config.xml中的配置移到此处--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!--绑定mybatis配置文件--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/lzt/mapper/*.xml"/> </bean>
-
sqlSessionTemplate
SqlSessionTemplate
是 MyBatis-Spring 的核心。作为SqlSession
的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的SqlSession
。SqlSessionTemplate
是线程安全的,可以被多个 DAO 或映射器所共享使用。<!--sqlSessionTemplate:就是我们使用的sqlSession--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--只能使用构造器注入,因为它没有set方法--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
以上三步完成spring-dao.xml
的配置,将mybatis关于类的全部操作(创建,配置,new等等)交给spring来做,可以作为模板
<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--DataSource:使用spring的数据源替换mybatis的配置-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&userUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="mysqladmin"/>
</bean>
<!--sqlSessionFactory:可以将mybatis-config.xml中的配置移到此处-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--绑定mybatis配置文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:com/lzt/mapper/*.xml"/>
</bean>
<!--sqlSessionTemplate:就是我们使用的sqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--只能使用构造器注入,因为它没有set方法-->
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
-
需要给接口加实现类
public class UserMapperImpl implements UserMapper{ //我们所有操作都由sqlSession来执行,现在它叫做SQLSessionTemplate SqlSessionTemplate sqlSession; //set方法,用来注入spring public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } //直接在实现类中操作mybaits要做的事情 public List<User> selectUser() { UserMapper mapper = sqlSession.getMapper(UserMapper.class); return mapper.selectUser(); } }
-
将自己写的实现类注入到spring中【applicationContext.xml】
<?xml version="1.0" encoding="UTF8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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.xsd"> <!--导入需要的配置文件--> <import resource="spring-dao.xml"/> <bean id="userMapper" class="com.lzt.mapper.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean> </beans>
-
测试使用
@Test public void test() { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper userMapper = context.getBean("userMapper", UserMapper.class); List<User> users = userMapper.selectUser(); for (User user : users) { System.out.println(user); } }
SqlSessionDaoSupport【简化操作】
SqlSessionDaoSupport
是一个抽象的支持类,用来为你提供 SqlSession
。调用 getSqlSession()
方法你会得到一个 SqlSessionTemplate
,之后可以用于执行 SQL 方法,如下:
//SqlSessionDaoSupport将SqlSessionTemplate的创建也封装起来了
//不需要单独再声明一个SqlSessionTemplate,只需要继承SqlSessionDaoSupport,然后通过getSqlSession()方法就可以获得SqlSessionTemplate
public class UserMapperImplTwo extends SqlSessionDaoSupport implements UserMapper {
public List<User> selectUser() {
return getSqlSession().getMapper(UserMapper.class).selectUser();
}
}
spring配置:
<!--SqlSessionDaoSupport声明了SqlSessionFactory,并有set方法,所以这里需要注入SqlSessionFactory
相对应的,SqlSessionTemplate则不需要在spring中配置-->
<bean id="userMapperTwo" class="com.lzt.mapper.UserMapperImplTwo">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>