Spring学习笔记
整合MyBatis 步骤:
导入相关jar包
junit
mybatis
mysql数据库
spring相关的
aop植入
mybatis-spring【new】
编写配置文件
测试
回忆MyBatis
编写实体类
编写核心配置文件
编写接口
编写Mapper.xml
测试
Mybatis-Spring MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。
要使用 MyBatis-Spring 模块,只需要在类路径下包含 mybatis-spring-2.0.5.jar 文件和相关依赖即可。如果使用 Maven 作为构建工具,仅需要在 pom.xml 中加入以下代码即可:
1 2 3 4 5 <dependency > <groupId > org.mybatis</groupId > <artifactId > mybatis-spring</artifactId > <version > 2.0.5</version > </dependency >
步骤:
编写数据源
sqlSessionfactory
sqlSessionTemplate
需要接口加实现类
将自己写的实现类注入到spring中测试使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <?xml version="1.0" encoding="UTF-8"?> <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 https://www.springframework.org/schema/beans/spring-beans.xsd" > <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/test1?serverTimezone=UTC" /> <property name ="username" value ="root" /> <property name ="password" value ="root" /> </bean > <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/demo/mapper/*.xml" /> </bean > <bean id ="sqlSession" class ="org.mybatis.spring.SqlSessionTemplate" > <constructor-arg index ="0" ref ="sqlSessionFactory" /> </bean > <bean id ="teacherMapper" class ="com.demo.mapper.TeacherMapperImpl" > <property name ="sqlSession" ref ="sqlSession" /> </bean > </beans >
TeacherMapperImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class TeacherMapperImpl implements TeacherMapper { private SqlSessionTemplate sqlSession; public void setSqlSession (SqlSessionTemplate sqlSession) { this .sqlSession = sqlSession; } @Override public List<Teacher> selectTeacher () { TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class ) ; return mapper.selectTeacher(); } }
SqlSessionDaoSupport SqlSessionDaoSupport 是一个抽象的支持类,用来为你提供 SqlSession。调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法,就像下面这样:
1 2 3 4 5 public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { public User getUser (String userId) { return getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser" , userId); } }
在这个类里面,通常更倾向于使用 MapperFactoryBean,因为它不需要额外的代码。但是,如果你需要在 DAO 中做其它非 MyBatis 的工作或需要一个非抽象的实现类,那么这个类就很有用了。
SqlSessionDaoSupport 需要通过属性设置一个 sqlSessionFactory 或 SqlSessionTemplate。如果两个属性都被设置了,那么 SqlSessionFactory 将被忽略。
假设类 UserMapperImpl 是 SqlSessionDaoSupport 的子类,可以编写如下的 Spring 配置来执行设置:
1 2 3 <bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean>
声明式事务 回顾事务
把一组业务当成一个业务来做,要么都成功,要么都失败
事务在项目开发中十分重要,涉及到数据的一致性问题,不能马虎
确保完整性和一致性
事务的ACID原则:
Spring中事务管理
声明式事务:AOP
编程式事务:需要在代码中,进行事务的管理
一个使用 MyBatis-Spring 的其中一个主要原因是它允许 MyBatis 参与到 Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理。
一旦配置好了 Spring 的事务管理器,你就可以在 Spring 中按你平时的方式来配置事务。并且支持 @Transactional 注解和 AOP 风格的配置。在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚。
事务配置好了以后,MyBatis-Spring 将会透明地管理事务。这样在你的 DAO 类中就不需要额外的代码了。
标准配置 要开启 Spring 的事务处理功能,在 Spring 的配置文件中创建一个 DataSourceTransactionManager 对象:
1 2 3 4 5 6 7 <bean id="transactionManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <constructor-arg ref="dataSource" /> </bean> @Bean public DataSourceTransactionManager transactionManager () { return new DataSourceTransactionManager(dataSource()); }
传入的 DataSource 可以是任何能够与 Spring 兼容的 JDBC DataSource。包括连接池和通过 JNDI 查找获得的 DataSource。
注意:为事务管理器指定的 DataSource 必须 和用来创建 SqlSessionFactoryBean 的是同一个数据源,否则事务管理器就无法工作了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <bean id ="transactionManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <constructor-arg ref ="datasource" /> </bean > <tx:advice id ="txAdvice" transaction-manager ="transactionManager" > <tx:attributes > <tx:method name ="add" propagation ="REQUIRED" /> <tx:method name ="delete" /> <tx:method name ="update" /> <tx:method name ="*" /> </tx:attributes > </tx:advice > <aop:config > <aop:pointcut id ="txPointcut" expression ="execution(* com.demospring.Mapper.*.*(..))" /> <aop:advisor advice-ref ="txAdvice" pointcut-ref ="txPointcut" /> </aop:config >
为什么需要事务?
如果不配置事务,可能存在数据提交不一致情况
如果我们不在Spring中去配置声明事务,我们就需要在代码中手动配置事务
事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题,不能马虎