Spring boot 瞭解(四)(整合mybatis和事務管理)
對於SpringBoot 整合mybatis和事務管理的記錄
(學習地址:https://www.majiaxueyuan.com/front/couinfo/36)
目錄
1.整合mybatis
1.新增依賴
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.42</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency>
第一個是連結資料庫的依賴包
第二個是mybatis 的包
2.建立資料庫
我用的 navicat
然後去連線自己的資料庫,我的是用的learnboot資料庫的user表:
3.訪問資料庫
程式的依賴和資料庫都建好了後就可以通過程式碼去訪問資料庫了
application.properties中新增屬性:
spring.datasource.url=jdbc:mysql://localhost:3306/learnboot?characterEncoding=utf-8 spring.datasource.username=yourname spring.datasource.password=yourpwd spring.datasource.driver-class-name=com.mysql.jdbc.Driver
和我以前訪問資料庫的方法不一樣,以前用的是自己寫的DButils類去訪問
(比如我以前的:https://blog.csdn.net/qq_28198181/article/details/82501031)
現在需要使用@Mapper註解就幾乎實現了,在這之前,我需要一個實體類User
User類程式碼如下:
public class User { private int id; private String username; private String gender; ....//getter setter方法 @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", gender='" + gender + '\'' + '}'; } }
這個時候就可以建立一個mapper包,裡面放置一個UserMappers介面:
接口裡的方法(最簡單的查詢方法):
@Component
@Mapper
public interface UserMappers {
@Select("select * from user where id = #{id}")
public User SelectUser(@Param("id") Integer id);
}
@Component 是將這個類(介面)載入到容器裡
@Mapper 使用Mapper註解讓系統自己掃包到這裡
@Select("SQL 語句") 使用資料庫語句
新建了一個UsersController類,然後 自動載入UserMappers, 寫一個根據id查詢user資料的方法,返回一個json串
@Component
@RestController
@RequestMapping("/user")
public class UsersController {
@Autowired
UserMappers userMappers;
@RequestMapping("/getuser")
public Object getUserById(Integer id) {
return userMappers.SelectUser(id);
}
}
資料庫裡我已經模擬了幾條資料如下:
這個時候我可以去啟動程式了QAQ,訪問路徑是users/getusers?id=1
我在改下訪問為id=2和3,可以看看
id=2是沒有資料,id為3可以看到資料,因為資料庫裡id=2的資料被我刪掉了
基本流程就是如上.
試試基本的增刪改查操作:
1).插入資料
UserMapper裡新增方法(我是資料庫有自增的,所以插入命令沒有寫完)
完整的應該是在Insert裡面寫
insert into user(id,username,gender) values(#{id},#{username},#{gender})
@Insert("INSERT INTO user VALUES(null,#{username},#{gender})")
public int InsertUser(@Param("username")String username,@Param("gender")String gender);
UsersController裡新增方法
@RequestMapping("/addusers")
public Integer addUser(String username, String gender) {
return userMappers.InsertUser(username, gender);
}
結果:
2).檢視資料
略
3).修改資料
UserMappers:
@Update("UPDATE user SET username = #{username} WHERE id = #{id}")
int UpdateUserNameById(@Param("username") String username, @Param("id") Integer id);
UsersController:
@RequestMapping("/updateusers")
public Integer updateUserNameById(String username, Integer id) {
return userMappers.UpdateUserNameById(username, id);
}
結果:
->
4).刪除資料
UserMappers:
@Delete("DELETE from user where id = #{id}")
int DeleteUserById(@Param("id")Integer id);
UsersController:
@RequestMapping("/deluser")
public Integer DeleteUser(Integer id) {
return userMappers.DeleteUserById(id);
}
結果:
補充:
@RequestMapping 是一個通用的註解
對於get和set方法應該分的細一點
get方法(也就是直接在位址列輸入數值)應該用@GetMapping
post方法(數值隱藏在body裡面的)應該用@PostMapping
單純舉個例子:
查詢 用@Getting註解
新增 用@Posttingz註解
@GetMapping("/getusers")
public Object getUserById(Integer id) {
return userMappers.SelectUser(id);
}
@PostMapping("/addusers")
public Integer addUser(String username, String gender) {
return userMappers.InsertUser(username, gender);
}
關於整合mybatis的一些簡單操作如上。
2.事務管理
1.事務特點
什麼是事務:
.多個SQL作為單一邏輯單元進行執行的操作
特性:ACID
原子性 多個SQL要麼一併執行 要麼不執行
一致性 事務完成,必須使所有資料保持一致
隔離性 只當前事務的修改必須與其他事物隔離開,不能同時操作同一個資料
永續性 事務執行完畢 對資料的影響是永久的
@Transcational 整合的事務註解
2.實現一個事務流程的處理方法
需要service層去處理業務,如果處理成功就將資料一次性寫入資料庫,如果失敗則回滾
需要用到紅色標註的註解@Transcational
舉個例子:使用事務模式 我先修改一個物件的名字,然後刪除這個物件的下一個物件,
1.新建一個serviceimpl包,裡面放了一個userServiceImpl類去實現userservice包下的一個userService介面
userService介面內容:
@Component
public interface UserService {
//執行事務
public void transfor();
}
實現類:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
@Transactional //整合好的事務註解
public void transfor() {
...................
}
}
包的路徑
然後完善實現類裡的方法:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserMapper userMapper;
@Override
@Transactional //整合好的事務註解
public String transfor(String username, Integer id) {
Integer n = userMapper.update(username, id);
System.out.println("更新了:" + n + " 行");
//這裡模仿在執行事務時出現錯誤
n = n / 0;
Integer m = userMapper.delete(id + 1);
System.out.println("刪除了" + m + " 行");
return "更新也刪除了";
}
}
在Controller方法中加入相關方法
@Autowired
UserService userService;
@GetMapping("/trans")
public String Trans(String username, Integer id) {
return userService.transfor(username, id);
}
執行程式
結果為:
發生異常,那麼執行的更新也是沒成功的
如果我把模擬異常的那個去掉
//n = n/0;
再次執行檢視
後臺資料庫顯示:
3號下的4號被刪除了 說明整個事務成功執行了
如果我把@Transcational刪掉
那麼這個就不是事務 即便中間有問題,前面寫入資料庫的也寫進去了,這樣就不滿足事務的特點了。
關於事務如上。