標籤:wan 姓名 spring private cep 使用方法 aac 事務 span
在實際開發中,其實很少會用到事務,一般情況下事務用的比較多的是在金錢計算方面。
mybatis與spring整合後,其事務該怎麼做?其實很簡單,直接在上一節代碼的基礎上在相應的方法(通常是service層)上加上@Transactional註解即可。
1、com.xxx.firstboot.exception.UserException
package com.xxx.firstboot.exception;import org.springframework.dao.DataAccessException;/** * 自訂異常,用於測試事務 */public class UserException extends DataAccessException{ private static final long serialVersionUID = 8901479830692029025L; public UserException(String msg) { super(msg); }}
View Code
說明:這是一個自訂註解,繼承了DataAccessException類。
2、com.xxx.firstboot.dao.UserDao
public int insertUser(String username, String password){ return userMapper.insertUser(username, password); } public void testTransactional(String username){ throw new UserException("測試事務"); }
View Code
說明:該類中對於事務的測試只使用到了兩個方法,第二個方法testTransactional拋出自訂的異常。
3、com.xxx.firstboot.service.UserService
@Transactional2 public void testTransaction(String username, String password){3 System.out.println(userDao.insertUser(username, password));4 userDao.testTransactional(username);5 }
View Code
說明:在該方法中調用了上述的userDao的兩個方法。
第一個方法向資料庫插入一條資料,第二個方法拋出我們的自訂異常,如果事務配置成功,那麼第一個方法插入資料庫會復原,否則,插入資料成功。
4、com.xxx.firstboot.controller.UserController
@ApiOperation("測試事務") @ApiImplicitParams({ @ApiImplicitParam(paramType="query",name="username",dataType="String",required=true,value="使用者的姓名",defaultValue="zhaojigang"), @ApiImplicitParam(paramType="query",name="password",dataType="String",required=true,value="使用者的密碼",defaultValue="wangna") }) @ApiResponses({ @ApiResponse(code=400,message="請求參數沒填好"), @ApiResponse(code=404,message="請求路徑沒有或頁面跳轉路徑不對") }) @RequestMapping(value="/testTransaction",method=RequestMethod.GET) public void testTransaction(@RequestParam("username") String username, @RequestParam("password") String password) { userService.testTransaction(username, password); }
View Code
測試:
使用maven命令啟動服務-->swagger運行URL-->查看資料庫是否插入成功
疑問:查了很多資料,mybatis與springboot整合後(資料來源採用了druid),為了添加事務,很多人會在上一節的MyBatisConfig這個類中做兩件事請
- 在MyBatisConfig類上添加@EnableTransactionManagement註解,該註解啟用了註解式交易管理 <tx:annotation-driven />,這樣在方法上的@Transactional註解就起作用了,但是實際測試中不加這句,@Transactional註解依然有用
- 在MyBatisConfig類中添加了擷取交易管理員的方法
/**2 * 配置交易管理員3 */4 @Bean5 @Primary6 public DataSourceTransactionManager transactionManager() throws Exception{7 return new DataSourceTransactionManager(getDataSource());8 }
View Code
添加這句的作用:在使用@Transactional註解的地方使用方法中的交易管理員進行交易管理。
第六章 springboot + 事務