【Spring】学习笔记10-整合MyBatis
1.需要的相关maven依赖
1 <dependency> 2 <groupId>mysql</groupId> 3 <artifactId>mysql-connector-java</artifactId> 4 <version>5.1.46</version> 5 </dependency> 6 <dependency> 7 <groupId>org.mybatis</groupId> 8 <artifactId>mybatis</artifactId> 9 <version>3.5.2</version> 10 </dependency> 11 <!-- Spring操作数据库的话,还需要Spring-JDBC这个包--> 12 <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> 13 <dependency> 14 <groupId>org.springframework</groupId> 15 <artifactId>spring-jdbc</artifactId> 16 <version>5.3.21</version> 17 </dependency> 18 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> 19 <dependency> 20 <groupId>org.mybatis</groupId> 21 <artifactId>mybatis-spring</artifactId> 22 <version>2.0.4</version> 23 </dependency> 24 <dependency> 25 <groupId>org.aspectj</groupId> 26 <artifactId>aspectjweaver</artifactId> 27 <version>1.9.4</version> 28 <scope>provided</scope> 29 </dependency> 30 <dependency> 31 <groupId>org.springframework</groupId> 32 <artifactId>spring-web</artifactId> 33 <version>5.2.0.RELEASE</version> 34 </dependency>
2.什么是MyBatis-Spring?
MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 Mapper 和 SqlSession 并注入到 Bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis。
3.Spring整合MyBatis步骤
3.1编写数据源配置
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="username" value="root"/> <property name="password" value="WGYwgy@981019"/> <property name="url" value="jdbc:mysql://localhost/mysql"/> </bean>
3.2SqlSessionFactory
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="datasource"/> <property name="configLocation" value="classpath:Mybatis-config.xml"/> <property name="mapperLocations" value="classpath:com/wang/mapper/*.xml"/> <!-- property:mapperLocations取代了Mybatis-config.xml文件中mappers的配置, 配置了该属性后,需注释掉MyBatis-config.xml中的mappers标签元素即可 此时MyBatis-config.xml只需配置<settings>,<typeAliases> --> </bean>
3.3SqlSessionTemplate
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
SqlSessionTemplate相对于SqlSession的优点
SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession。 SqlSessionTemplate 是线程安全的,可以被多个 DAO 或映射器所共享使用。
当调用 SQL 方法时(包括由 getMapper() 方法返回的映射器中的方法),SqlSessionTemplate 将会保证使用的 SqlSession 与当前 Spring 的事务相关。 此外,它管理 session 的生命周期,包含必要的关闭、提交或回滚操作。另外,它也负责将 MyBatis 的异常翻译成 Spring 中的 DataAccessExceptions。
由于模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题。
3.4需要给Mapper接口添加实现类,并将实现类注入到Spring中
UserMapper接口实现类
package com.wang.mapper; import com.wang.pojo.User; import org.mybatis.spring.SqlSessionTemplate; import java.util.List; public class UserMapperImpl implements UserMapper{ //wo men suo you cao zuo dou shi yong SqlSessionTemplate private final SqlSessionTemplate template; public UserMapperImpl(SqlSessionTemplate template) { this.template = template; } @Override public List<User> selectUser() { System.out.println("UserMapperImpl"); return template.getMapper(UserMapper.class).selectUser(); } }
注入Spring中
<bean id="userMapperImpl" class="com.wang.mapper.UserMapperImpl"> <constructor-arg index="0" ref="sqlSessionTemplate"/> </bean>
3.5单元测试
@Test public void test04(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml"); UserMapper mapperImpl = context.getBean("userMapperImpl", UserMapper.class); mapperImpl.selectUser().forEach(System.out::println); }
//测试结果:
User(id=2, name=??, pwd=333333)
User(id=3, name=小花, pwd=123456)
User(id=4, name=小微, pwd=111111)
User(id=5, name=小微, pwd=123456)
User(id=11, name=小军, pwd=123456)
User(id=13, name=??, pwd=123456)
4.SqlSessionDaoSupport
SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,简化了我们在Spring中注入SqlSessionTemplate的相关步骤
4.1定义一个SqlSessionDaoSupport抽象类的实现类
package com.wang.mapper; import com.wang.pojo.User; import org.apache.ibatis.session.SqlSession; import org.mybatis.spring.support.SqlSessionDaoSupport; import java.util.List; public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper { @Override public List<User> selectUser() { return getSqlSession().getMapper(UserMapper.class).selectUser(); } }
4.2在Spring中注入该实现类
<bean id="userMapperImpl2" class="com.wang.mapper.UserMapperImpl2"> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>
4.3单元测试
@Test public void test05(){ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserMapper userMapperImpl = context.getBean("userMapperImpl2", UserMapper.class); userMapperImpl.selectUser().forEach(System.out::println); }
//测试结果如下:
User(id=2, name=??, pwd=333333)
User(id=3, name=小花, pwd=123456)
User(id=4, name=小微, pwd=111111)
User(id=5, name=小微, pwd=123456)
User(id=11, name=小军, pwd=123456)
User(id=13, name=??, pwd=123456)

浙公网安备 33010602011771号