(spring-mybatis-mysql整合)纯Java配置类配置事务管理

spring整合mybatis主要需要配置连接池、sessionfactory以及事务管理器这几个方面。其中使用xml方式配置事务管理器需要配置相应的切面等内容,而使用@Transactional注解直接配置时可以不用指明切点表达式,直接作用于需要事务管理的类或者方法。

代码如下:

@Configuration
@ComponentScan(basePackages = "zcc.mms.dao")
@EnableTransactionManagement
public class JDBCConfig implements TransactionManagementConfigurer {
    @Bean(name = "comboPooledDataSourceID")
    public ComboPooledDataSource getC3P0() {
        ComboPooledDataSource ds = new ComboPooledDataSource();
        try {
            ds.setDriverClass("com.mysql.jdbc.Driver");
        } catch (PropertyVetoException e) {
            e.printStackTrace();
            throw new RuntimeException("数据库驱动加载错误!");
        }
        ds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");
        ds.setUser("root");
        ds.setPassword("root");
        return ds;
    }
    @Bean(name = "sqlSessionFactoryBeanID")
    public SqlSessionFactoryBean getSessionFactory(ComboPooledDataSource ds){
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
        factory.setConfigLocation(new ClassPathResource("mybatis.xml"));
        factory.setDataSource(ds);
        return factory;
    }
    @Bean(name = "dataSourceTransactionManagerID")
    public DataSourceTransactionManager getTransactionManager(ComboPooledDataSource ds){
        DataSourceTransactionManager manager = new DataSourceTransactionManager();
        manager.setDataSource(ds);
        return manager;
    }

    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return getTransactionManager(getC3P0());
    }
}

	主要使用@EnableTransactionManagement注解来启用注解驱动的事务管理,而通过实现TransactionManagementConfigurer接口可以提供自定义
的事务管理器bean。
 	简单构造实体类如下:
public class Emp {
    private Integer id;
    private String name;
    private Double sal;
    private String sex;
    public Emp(){}
    public Emp(Integer id, String name, Double sal, String sex) {
        this.id = id;
        this.name = name;
        this.sal = sal;
        this.sex = sex;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getSal() {
        return sal;
    }
    public void setSal(Double sal) {
        this.sal = sal;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}
相关的dao类中使用@Transactional注解,事务按理说是作用与service的,这里为了简便直接注解在dao类上。在类上使用此注解作用于类内的所有方法
,readOnly设为true即将内部的方法的事务隔离级别设置为只读。而针对更新插入等写操作,单独在方法上指定此注解,readOnly默认为false。方法和
类上都使用此注解的,以方法上的为准。
@Component(value = "empDaoID")
@Transactional(readOnly=true)//注解方式设置事务、在类的级别上设置只读事务
public class EmpDao {
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }
    /**
     * 增加员工
     */
    @Transactional(propagation= Propagation.REQUIRED, isolation= Isolation.DEFAULT)
    public void add(Emp emp) throws Exception{
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("empNamespace.add",emp);
        sqlSession.close();
    }
}

mybatis相关的配置文件内容如下:
mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <mappers>
        <mapper resource="zcc/mms/entity/EmpMapper.xml"></mapper>
    </mappers>
</configuration>
EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="empNamespace">

    <resultMap type="zcc.mms.entity.Emp" id="empMap">
        <id property="id" column="eid"/>
        <result property="name" column="ename"/>
        <result property="sal" column="esal"/>
        <result property="sex" column="esex"/>
    </resultMap>

    <!-- 增加员工 -->
    <insert id="add" parameterType="zcc.mms.entity.Emp">
        insert into emps(eid,ename,esal,esex) values(#{id},#{name},#{sal},#{sex});
    </insert>
</mapper>
最后是测试类:
public class EmpDaoTest {
    @Test
    public void testInsert() throws Exception {
        ApplicationContext app = new AnnotationConfigApplicationContext(JDBCConfig.class);
        EmpDao dao = (EmpDao)app.getBean("empDaoID");
        dao.add(new Emp(3, "qw", 1000.12, "wqe"));
    }
}
一开始总是报java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedT的错误,后来发现是mybatis包
和mybatis-spring插件包的版本不匹配所致,一定要使用兼容的版本。



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值