spring与mybatis四种整合方法
- - 企业架构 - ITeye博客 1、采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数. (1)Spring配置文件:. . . .
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天, 点击查看活动详情
当然,Spring事务回滚的前提是你当前使用的数据库必须支持事务,比如MySQL的Innodb是支持的,但Mysaim则是不支持事务的。
使用 @Transaction
来配置自动回滚,可以配置在类上,也可以配置在方法上(作用域不同),但对final或private修饰的方法无效,且该类必须是受spring所管控的,也就是被已经被注入的类,而不是new出来的类。
@Transaction
,则该方法使用自己的配置,其他方法使用类上的配置。 @Service
@Transactional
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
//some code
//db operation
}
}
若被配置的方法或类抛出了异常,则事务会被自动回滚,除非你在该方法中手动捕获了异常,且没有抛出新的异常。
可以使用 @Transactional(rollbackFor = Exception.class)
来设定针对特定的异常进行事务回滚,如果不设置则默认会回滚 RuntimeException and Error (参考自源码内文档)。
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public void save(User user) {
userMapper.insert(user);
throw new RuntimeException(); // 抛出异常,事务回滚,上面的insert插入失败。
}
}
通过注入 DataSourceTransactionManager
来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚,可控程度更高,可以更灵活的使用。
DataSourceTransactionManager
事务管理对象DefaultTransactionDefinition def = new DefaultTransactionDefinition();
对象TransactionStatus status = transactionManager.getTransaction(def);
来开启一个事务,transactionManager.rollback(status);
来回滚这个事务transactionManager.commit(status);
来提交这个事务 @Service
public class UserServiceImpl implements UserService {
@Autowired
private DataSourceTransactionManager transactionManager;
@Override
@Transactional
public void save(User user) {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
try {
// execute your business logic here
//db operation
} catch (Exception ex) {
transactionManager.rollback(status);
throw ex;
}
}
} // 此代码案例来自Alibaba Coding Guidelines