1. 程式人生 > >使用spring的TransactionTemplate操作資料庫事務

使用spring的TransactionTemplate操作資料庫事務

場景:使用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.