场景:使用spring的TransactionTemplate操作数据库事务
1.事务操作过程
/**事务操作过程*/
@SuppressWarnings("unchecked")
public static void doTransaction(){
/**1.创建事务管理器*/
DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource);
/**2.创建事务模板*/
TransactionTemplate template = new TransactionTemplate(manager);
/**3.调用事务模板执行函数,传入事务回调对象并重写回调函数*/
Object rtnObj = template.execute(new TransactionCallback(){
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
try{
/**第一条插入语句表真实存在*/
logger.info("执行insert...开始");
insert();
logger.info("执行insert...结束");
/**第二条插入语句表不存在,即sql会执行失败*/
logger.info("执行insert2...开始");
insert2();
logger.info("执行insert2...结束");
return "成功";
}catch(Exception e){
/** 事务回滚的关键,必须加上*/
transactionStatus.setRollbackOnly();
e.printStackTrace();
logger.info("数据库,部分sql操作不正确,事务回滚.");
return "失败";
}
}
});
/**4.查看结果*/
if(rtnObj instanceof String){
String rtn = rtnObj.toString();
if("成功".equals(rtn)){
logger.info("操作成功!");
}else{
logger.info("操作失败,请检查入参是否正确");
}
}
}
2.测试完整代码
public class OperateTransactionTemplate {
private static Logger logger = LoggerFactory.getLogger(OperateTransactionTemplate.class);
/**数据库连接需要字符串*/
public static final String username = "root";
public static final String password = "123456";
public static final String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/zbzdb";
public static final String driverName = "com.mysql.jdbc.Driver";
/**数据源*/
public static DataSource dataSource = getDataSource();
/**JdbcTemplate操作模板*/
public static JdbcTemplate jdbcTemplate = getJdbcTemplate();
/**获取数据源*/
public static DataSource getDataSource(){
if(dataSource !=null){
return dataSource;
}
DruidDataSource dataSource = new DruidDataSource();
// 设置数据源属性参数
dataSource.setPassword(password);
dataSource.setUrl(jdbcUrl);
dataSource.setUsername(username);
dataSource.setDriverClassName(driverName);
return dataSource;
}
/**获取操作数据库模板*/
public static JdbcTemplate getJdbcTemplate() {
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
/**事务操作过程*/
@SuppressWarnings("unchecked")
public static void doTransaction(){
/**1.创建事务管理器*/
DataSourceTransactionManager manager = new DataSourceTransactionManager(dataSource);
/**2.创建事务模板*/
TransactionTemplate template = new TransactionTemplate(manager);
/**3.调用事务模板执行函数,传入事务回调对象并重写回调函数*/
Object rtnObj = template.execute(new TransactionCallback(){
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
try{
/**第一条插入语句表真实存在*/
logger.info("执行insert...开始");
insert();
logger.info("执行insert...结束");
/**第二条插入语句表不存在,即sql会执行失败*/
logger.info("执行insert2...开始");
insert2();
logger.info("执行insert2...结束");
return "成功";
}catch(Exception e){
/** 事务回滚的关键,必须加上*/
transactionStatus.setRollbackOnly();
e.printStackTrace();
logger.info("数据库,部分sql操作不正确,事务回滚.");
return "失败";
}
}
});
/**4.查看结果*/
if(rtnObj instanceof String){
String rtn = rtnObj.toString();
if("成功".equals(rtn)){
logger.info("操作成功!");
}else{
logger.info("操作失败,请检查入参是否正确");
}
}
}
/**插入语句表真实存在*/
public static void insert(){
/**1.组装sql*/
String sql = "INSERT INTO t_city (CITY_NAME,LAND_AREA,POPULATION,GROSS,AREA_NUMBER ) VALUE('泉州',11014.78, 865, 7548.01, '350500' ) ";
/**2.调用update*/
jdbcTemplate.update(sql);
}
/**插入语句表不存在*/
public static void insert2(){
/**1.组装sql*/
String sql = "INSERT INTO t_city2 (CITY_NAME,LAND_AREA,POPULATION,GROSS,AREA_NUMBER ) VALUE('泉州',11014.78, 865, 7548.01, '350500' ) ";
/**2.调用update*/
jdbcTemplate.update(sql);
}
public static void main(String []args){
logger.info("测试开始......");
doTransaction();
logger.info("测试结束......");
}
}
3.建表语句
CREATE TABLE `t_city` (
`CITY_NAME` VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '城市名',
`LAND_AREA` DOUBLE DEFAULT NULL COMMENT '城市面积',
`POPULATION` BIGINT(16) DEFAULT NULL COMMENT '城市人口',
`GROSS` DOUBLE DEFAULT NULL COMMENT '生产总值',
`AREA_NUMBER` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '行政区划代码',
`POSTAL_CODE` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '邮政编码',
`TELEPHONE_CODE` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '电话区号',
`CAR_CODE` VARCHAR(64) COLLATE utf8_bin DEFAULT NULL COMMENT '车牌代码',
`CITY_DESCRIBE` VARCHAR(512) COLLATE utf8_bin DEFAULT NULL COMMENT '城市描述'
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='城市信息表'
以上,TKS.