千家信息网

Spring中@Transactional如何配置

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章将为大家详细讲解有关Spring中@Transactional如何配置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景:spring老版本是使用Trans
千家信息网最后更新 2025年01月23日Spring中@Transactional如何配置

这篇文章将为大家详细讲解有关Spring中@Transactional如何配置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

  • 背景:

    1. spring老版本是使用TransactionProxyFactoryBean来实现对spring的事务进行配置(缺点自己google,一大堆的缺点)

    2. spring2.x引入了AOP(面向切面的编程)

    3. 当初项目也是喜欢用spring xml方式的配置,后来项目使用spring3.x版本,看到了@Transactional注解,个人觉得挺方便和实用。(具体什么原因,说不清)

  • 上代码

    1.                                 classpath:/db.properties                                                                                classpath:/sqlmap-config.xml                                                        classpath*:/sqlmap/*.xml                                                            stat        20        1        60000        1        60000        300000        SELECT 'x'        true        false        false        true        20                                                                    
    2. package com.xun.spring3.src.dao;import com.ibatis.sqlmap.client.SqlMapClient;import org.apache.commons.lang.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;import javax.annotation.PostConstruct;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;/** * 要求每个dao的命名以 Dao结尾 * 泛型 ENTITY - 具体哪个实体 * 泛型 PRIMARYKEY - 具体主键的类型 * @Date : 2014/9/7 0007 20:41 * @From : spring3-test * @Author : hebad90@163.com */public class BaseDao extends SqlMapClientDaoSupport {    @Autowired    private SqlMapClient sqlMapClient;    @PostConstruct    private void initSuper() {        /**         * 初始化父类         */        super.setSqlMapClient( sqlMapClient );    }    private Class entityClass ;    private String ibatisNamespace;    protected BaseDao() {        Type genType = getClass().getGenericSuperclass();        Type[] params = ((ParameterizedType)genType).getActualTypeArguments();        entityClass = (Class)params[0];        /**         * 获取当前 ibatis的命名空间 XxxDao 即命名空间为 xxx         */        this.ibatisNamespace = getIbatisNamespace( getClass() );        System.out.println( "初始化当前环境成功,ibatisNamespace=["+this.ibatisNamespace+"],entityClass=[" + entityClass + "]" );    }    public PRIMARYKEY insert( ENTITY entity ) {        return(PRIMARYKEY)super.getSqlMapClientTemplate().insert( this.ibatisNamespace + ".insert", entity );    }    public int update( ENTITY entity ) {        return super.getSqlMapClientTemplate().update( this.ibatisNamespace + ".update", entity );    }    public ENTITY queryById( PRIMARYKEY primarykey ) {        return ( ENTITY ) super.getSqlMapClientTemplate().queryForObject( this.ibatisNamespace + ".queryById", primarykey);    }    public int delete( ENTITY entity ) {        return super.getSqlMapClientTemplate().delete( this.ibatisNamespace + ".delete", entity);    }    ///##############################    private String getIbatisNamespace( Class clazz ) {        String simpleName = clazz.getSimpleName();        int index = StringUtils.indexOf( simpleName, "Dao" );        return StringUtils.lowerCase( StringUtils.substring( simpleName, 0, index ) );    }}
    3. @Transactional在何处使用?Spring建议我们在业务实现类上使用该注解,因为java的实现不能继承注解。所以,最好是在业务实现类上注解,这样不管中的proxy-target-class为true或者false,业务类都会启用事务机制。

    4. @Transactional的参数怎么使用?




关于"Spring中@Transactional如何配置"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0