整合Mybatis(Mybatis-spring)、声明式事务

12、整合Mybatis

步骤:

  1. 导入相关jar包

    • junit

    • mybatis

    • mysql数据库

    • spring相关

    • aop注入

    • mybatis-spring【new】

  2. 编写配置文件

  3. 测试

 

12.1、回忆mybatis
12.2、Mybatis-spring
  1. 编写数据源配置

  2. sqlSessionFactory

  3. sqlSessionTemplate

  4. 需要给接口加实现类【】

  5. 将自己写的实现类,注入到

12.3、整合Mybatis
方式一

spring-dao.xml

<!--    DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
       我们这里使用Spring提供的JDBC
-->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
       <property name="username" value="root"/>
       <property name="password" value="123456"/>
   </bean>

<!--   sqlSessionFactory-->
   <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/kuang/mapper/*.xml"/>
   </bean>

<!--   SqlSessionTemplate:就是我们使用的sqlSession-->
   <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!--       只能使用构造器注入sqlSessionFactory,因为他没有set方法-->
       <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
   </bean>

</beans>

applicationContext.xml

    <import resource="spring-dao.xml"/>
   <bean id="userMapper" class="com.kuang.mapper.UserMapperImpl">
       <property name="sqlSession" ref="sqlSession"/>
   </bean>

UserMapper.xml

<!--绑定接口-->
<mapper namespace="com.kuang.mapper.UserMapper">
   <select id="selectUser" resultType="user">
      select * from mybatis.user
   </select>
</mapper>

UserMapperImpl实现类

public class UserMapperImpl implements UserMapper{

   //我们的所有操作,原来都是用sqlSession来执行,现在都是用SqlSessionTemplate
   private SqlSessionTemplate sqlSession;

   public void setSqlSession(SqlSessionTemplate sqlSession) {
       this.sqlSession = sqlSession;
//       <bean id="userMapper" class="com.kuang.mapper.UserMapperImpl">
//       <property name="sqlSession" ref="sqlSession"/> 把这里的sqlSession拿过来了
  }
   public List<User> selectUser() {
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       return mapper.selectUser();
  }
}

UserMapper接口

public interface UserMapper {
   List<User> selectUser();
}

测试

public class MyTest {
   @Test
   public void test(){
       ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
       UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
       for (User user : userMapper.selectUser()) {
           System.out.println(user);
      }
  }
}
方式二

applicationContext.xml

    <import resource="spring-dao.xml"/>
   <bean id="userMapper2" class="com.kuang.mapper.UserMapperImpl2">
       <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
   </bean>
</beans>

UserMapperImpl2实现类

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
   public List<User> selectUser() {
//       SqlSession sqlSession = getSqlSession();
//       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//       return mapper.selectUser();
       return getSqlSession().getMapper(UserMapper.class).selectUser();
  }
}

spring-dao.xml 直接拿Factory就行 实现类继承的SqlSessionDaoSupport已经帮我们拿到了sqlSession

<!--    DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
       我们这里使用Spring提供的JDBC
-->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
       <property name="username" value="root"/>
       <property name="password" value="123456"/>
   </bean>

<!--   sqlSessionFactory-->
   <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/kuang/mapper/*.xml"/>
   </bean>

 

13、声明式事务

1、回顾事务
  • 要么都成功,要么都失败!

  • 事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎!

  • 确保完整性和一致性;

 

事务ACID原则:

  • 原子性

  • 一致性

  • 隔离性

    • 多个业务可能操作同一个资源,防止数据损坏

  • 持久性

    • 事务一旦提交,无论系统发生什么问题,结果都不会被影响,被持久化的写到存储器中!

 

2、spring中的事务管理
  • 声明式事务

  • 编程式事务:需要在代码中,进行事务的管理

<!--    DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
       我们这里使用Spring提供的JDBC
-->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
       <property name="username" value="root"/>
       <property name="password" value="123456"/>
   </bean>

<!--   sqlSessionFactory-->
   <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/kuang/mapper/*.xml"/>
   </bean>

<!--   配置声明式事务-->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
   </bean>

<!--   结合AOP实现事务的注入-->
<!--   配置事务通知;-->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--       给哪些方法配置事务-->
<!--       配置事务的传播特性: propagation-->
       <tx:attributes>
           <tx:method name="add" propagation="REQUIRED"/>
           <tx:method name="dlete" propagation="REQUIRED"/>
           <tx:method name="update" propagation="REQUIRED"/>
           <tx:method name="query" read-only="true"/>
           <tx:method name="*" propagation="REQUIRED"/>
       </tx:attributes>
   </tx:advice>

<!--   配置事务切入-->
   <aop:config>
       <aop:pointcut id="txPointcut" expression="execution(* com.kuang.mapper.*.*(..))"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
   </aop:config>
</beans>
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
   public List<User> selectUser() {
       SqlSession sqlSession = getSqlSession();
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       User user = new User(7, "dadf", "156324");
       mapper.addUser(user);
       mapper.deleteUser(4);
       return mapper.selectUser();
//       return getSqlSession().getMapper(UserMapper.class).selectUser();
  }

   public Integer addUser(User user) {
       return getSqlSession().getMapper(UserMapper.class).addUser(user);
  }

   public int deleteUser(int id) {
       return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
  }
}

 

思考:

为什么需要事务?

  • 如果不配置事务,可能存在数据提交不一致的情况

  • 如果我们不再Spring中去配置声明式事务,我们就需要在代码中手动配置事务!

  • 事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题,不容马虎!

  •  

 

 

posted @ 2021-11-04 17:03  敲代码的体育生  阅读(309)  评论(0)    收藏  举报