1. 程式人生 > >Spring boot 瞭解(四)(整合mybatis和事務管理)

Spring boot 瞭解(四)(整合mybatis和事務管理)

對於SpringBoot 整合mybatis和事務管理的記錄

(學習地址:https://www.majiaxueyuan.com/front/couinfo/36

目錄

1.整合mybatis

2.事務管理


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刪掉

那麼這個就不是事務 即便中間有問題,前面寫入資料庫的也寫進去了,這樣就不滿足事務的特點了。

 

關於事務如上。