【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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!