[Spring 05] Mybatis-spring整合 事务支持

Spring_05 Mybatis-Spring

6. Mabatis-Spring

1. 环境搭建:

数据库: Mybatis.user(id int(20), name varchar(30), pwd varchar(30))

pojo类: User @Data

核心配置:mybatis-config.xml,

UserMapper接口, UserMapper.xml实现类, 测试类(读配置文件,连接数据库,openSession()等等)


2. Spring整合Mybatis的方法一:注册SqlSessionTemplate的bean

  1. 原有的mybatis-config.xml:

环境:四个属性;mappers:映射接口的实现类UserMapper.xml的位置

保留: AliasType别名管理、Setting设置管理,其他的都放置到Spring-dao.xml配置中。

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
</environments>

<mappers>
    <mapper resource="com/roy/mapper/UserMapper.xml"/>
</mappers>
  1. 改变为: spring-dao.xml(本质是一个Spring的配置文件),可以注册Beans

其中,需要注册:数据源的类, SqlSessionFactory的类(可以连接mybatis-config.xml的地方), SqlSessionTemplate的类(以前的SqlSession)

<?xml version="1.0" encoding="UTF-8"?>
<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-->
    <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?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
        <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-config中的各种配置: 如把配置连接过来、取别名,注册Mappers等-->
<!--        通常情况下,在mybatis-config中留下别名管理和设置管理,其他的都写在这个配置文件中-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/roy/mapper/*.xml"/>
    </bean>
<!--    获取SqlSession, spring中,用SqlSessionTemplate对象获取-->
<!--    这个类中没有setter方法,只能用constructor-args注入-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory"/>
    </bean>
</beans>
  1. 添加一个UserMapperImpl.java实现类:

    原因: 这个类需要在Spring的配置文件中注册bean,所以必须要有对应的实现类,

    ​ 同时,要使用set注入,所以要添加一个SqlSessionTemplate私有属性和set方法。

public class UserMapperImpl implements UserMapper{
    private SqlSessionTemplate sqlSessionTemplate;
    public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
    public List<User> getUser() {
        UserMapper mapper = sqlSessionTemplate.getMapper(UserMapper.class);
        return mapper.getUser();
    }
}
  1. 添加一个applicationContext.xml配置文件,把之前的spring-dao.xml文件导入,实现数据库管理和dao层bean管理的分离
<?xml version="1.0" encoding="UTF-8"?>
<beans Spring头文件>
    <import resource="spring-dao.xml"/>
    <bean id="userMapperImpl" class="com.roy.mapper.UserMapperImpl">
        <property name="sqlSessionTemplate" ref="sqlSession"/>
    </bean>
</beans>
  1. 测试类(相当于service层的调用)
@Test
public void test() throws IOException {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserMapper userMapperImpl = context.getBean("userMapperImpl", UserMapper.class);
    for (User user : userMapperImpl.getUser()) {
        System.out.println(user);
    }
}

3. Spring整合Mybatis的方法二:实现类继承SqlSessionDaoSupport并实现原有接口

实现的UserMapper.java:

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

applicationContext.xml注册文件为: (注入的为: SSFactory, 不用写SqlSessionTemplate)

<bean id="userMapperImpl" class="com.roy.mapper.UserMapperImpl">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

4. 流程:

流程:

  1. pom.xml: 依赖_(junit, spring-webmvc,数据库的: mysql-connector-java, mybatis, spring-jdbc, mybatis-spring, aspectjweaver), 配置build使java文件夹下的xml文件可以正常编译
  2. mybatis-config.xml配置typealias,setting;(mybatis的头文件)
  3. spring-mybatis.xml配置datasource, SqlSessionFactory(包括接入mybatis-config.xml的配置)(Spring头文件)
  4. applicationContext.xml, import配置文件spring-mybatis.xml; 管理注册的bean(Spring头文件)
  5. pojo, UserMapper接口,UserMapper.xml(mybatis头文件)
  6. UserMapper类,继承SqlSessionDaoSupport类并实现UserMapper接口,注入SqlSessionFactory, 只实现接口但注入时用SqlSessionTemplate。(对应上述两种方式)
  7. 在applicationContext.xml中注册UserMapping的bean
  8. 写测试类,CPX获取bean并执行

7. 声明式事务

两种方式:

  1. AOP声明式事务
  2. 编程式事务

1的步骤:

  • 配置一个声明式事务,id, class为固定的DataSourceTransactionManager,是用有参构造注入
  • 配置一个事务通知,相当于AOP中写一个Aspect和其中的Advice
  • 配置切面位置(使得某个方法为事务方法)
<!--配置声明式事务(官网)-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <constructor-arg ref="dataSource" />
</bean>
<!--配置事务通知(类似于在aop中写一个aspect和advice-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>
<!--    配置事务切入点-->
<aop:config>
    <aop:pointcut id="txPointCut" expression="execution(* com.roy.mapper.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
posted @ 2021-12-30 15:37  Roy2048  阅读(43)  评论(0)    收藏  举报