第一節 ORM介紹
第二節 MyBatis-Plus介紹
第三節 MyBatis-Plus增删改查操作
在實際操作中,程式的一些java對象想把它存儲到關系型資料庫的表中,或者想把在資料庫中查詢到的資料,變成程式中的java對象,這個過程我們稱為映射的過程。
ORM就是幫我們把對象和資料庫中的記錄完成映射。這個映射既包含了存儲又包含了讀取,是一種持久化的技術。
下面操作是基于MySQL來完成。
在pom.xml中
首先要告訴MyBatis用什麼連接配接池、需要操作什麼類型資料庫,資料庫位置在哪裡,資料庫賬号及密碼、制定日志輸出格式等資訊。
加@MapperScan注解,告訴程式存放資料庫操作的mapper包在哪裡
項目具體示範過程:首先講Mybatis 的操作,之後再講Plus的操作。
(本機已安裝mysql資料庫,不在此詳細講)
在IDEA中建立一個新的項目mpdemo,SDK為1.8.0;java版本為1.8。
在Web下勾選Spring Web
完成項目建立後,設定Maven及熱啟動(詳細設定參考前面内容)
在項目中pom.xml中的添加依賴,記得點右上角的更新按鈕
<!-- MyBatisplus依賴 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- mysql驅動依賴 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- 資料連接配接池druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
注意:版本号根據本機實際情況,如果輸入了上面的代碼,在IDEA中可能會有感歎号。輕按兩下感歎号,就可以得到最新的版本提示,按提示修改版本号,最後記得點右上角的更新按鈕
添加全局配置
下面進行基本配置,打開application.properties 檔案,輸入如下代碼:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
spring.datasource.password=root
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
注意:本機已在mysql資料庫中建了一個mydb資料庫,并建了一個user表。這裡的資料庫使用者名和密碼根據實際設定。
下面需要加一個@MapperScan注解,用于映射資料庫。
先在com.example.mpdemo包下建立一個名為mapper的包,以後資料庫相關操作就放在mapper這個包下
将@MapperScan注解放到程式啟動類中。
這裡需要全包名,最好不要手動寫。在mapper包中右鍵,點copypath,選最後一項Copy Reference,然後直接将路徑粘貼到注解中。
告訴程式,mapper包所在的位置。這樣基本的配置就做完了。
在com.example.mpdemo包下建立一個名為controller的控制器包
在包下建控制器 UserController類,代碼如下
package com.example.mpdemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user")
public String query(){
return "查詢使用者";
}
}
使用者通路 query方法,肯定需要去找mapper通路資料庫。下面就需要定義mapper下相關元件,建立UserMapper(一般是以資料庫名+Mapper組合)接口。
接口中定義一個查詢的方法,作為查詢方法來說,查詢的結果應該是多使用者的就是集合,這裡可以用List<E>,這個E泛型應該是一個對象。是以可以先定義一個實體類(entity),在entity包下建一個User類,将user資料庫中的字段加入,然後按ALT + Insert 快捷鍵,添加Getter 和 Setter 方法,為友善檢視還可以加toString方法。
代碼如下:
package com.example.mpdemo.entity;
public class User {
private int id;
private String username;
private String password;
private String birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", birthday='" + birthday + '\'' +
'}';
}
}
回到UserMapper類,繼續編寫代碼。
package com.example.mpdemo.mapper;
import com.example.mpdemo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
// 查詢所有使用者
@Select("select * from user")
public List<User> find();
}
下面是解釋:
select * from user 這句SQL語句會自動去找配置檔案裡的資料庫,這裡是mydb,查詢出所有使用者,并将所有查詢出的資料封裝成一個個的對象放到List中去。
@Mapper 告訴程式,這裡是一個Mapper主鍵。
啟動類中@MapperScan注解中,已經寫了要掃描mapper包。
這樣就會從mapper包中找到UserMapper。這樣方法就生效了。
回到程式,繼續。
要使用Mapper,隻需要在UserController控制器中聲明一下。
@Autowired
private UserMapper userMapper;
@Autowired注解非常關鍵,它是Spring的功能,意思就是要去注入userMapper。會自動将這裡的Mapper執行個體出來的對象,在控制器中自動注入,這樣userMapper就有值了。如果沒有加@Autowired注解,那麼userMapper的值為空。
然後用userMapper去調用方法就可以了。完整代碼如下:
package com.example.mpdemo.controller;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public String query(){
List<User> list= userMapper.find();
System.out.println(list);
return "查詢使用者";
}
}
其實就是一個接口,一個注入。運作程式。在浏覽器中輸入http://localhost:8080/user
可以看到 “查詢使用者”。在IDEA中可以看到列印出來的資料庫資訊。這和資料庫中的資訊是一緻的。
查詢出來的結果一般是要轉換為json來供前端使用,前後端分離的項目都是通過json來完成,這裡隻需要将UserController中的将傳回值從String 改為List 就 可以了,我們傳回的對象會自動轉為json。代碼如下
package com.example.mpdemo.controller;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public List query(){
List<User> list= userMapper.find();
System.out.println(list);
return list;
}
}
再次運作程式,浏覽器再次輸入,就可以得到json字元串。一個簡單的使用者查詢接口就完成了。
例如:插入資料
在UserMapper接口中加入如下代碼:
@Insert("insert into user values (#{id},#{username},#{password},#{birthday})")
public int insert(User user);
在UserController控制器中插入如下代碼:
@PostMapping("/user")
public String save(User user){
int i =userMapper.insert(user);
if (i >0){
return "插入成功";
}else {
return "插入失敗";
}
}
用ApiPost測試,可以看到插入成功。
其餘增删改都是類似。
下面講MybatisPlus 的操作
MybatisPlus進行了簡化,下列方法都可以沒有,就讓UserMapper繼承BaseMapper,傳入一個User類,MybatisPlus會自動根據傳入的類去找到資料庫的user表,然後幫你去做增删改查。前提是類的名字和資料庫中表的名字一緻。改進後UserMapper接口代碼如下:(Mapper隻剩下一段接口代碼)
package com.example.mpdemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper <User>{
}
UserController控制器也需要進行修改。find方法已删除,要使用自帶方法selectList(null),這裡需要查詢填查詢條件,如果查詢全部資料沒有條件,就填null。insert方法還可以繼續用。其餘BaseMapper方法可以按住Ctrl 鍵點選UserMapper接口的BaseMapper進行檢視。
package com.example.mpdemo.controller;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user")
public List query(){
List<User> list= userMapper.selectList(null);
System.out.println(list);
return list;
}
@PostMapping("/user")
public String save(User user){
int i =userMapper.insert(user);
if (i >0){
return "插入成功";
}else {
return "插入失敗";
}
}
}
再次啟動系統,在浏覽器中輸入: http://localhost:8080/user,可以查詢出資料庫中資料。
用ApiPost測試,插入成功。
資料庫更新成功,新增了一條新資料。
Mybatisplus 官網位址:https://baomidou.com/ 上面提供了許多注解。例如:如果出現User的類名和資料庫的名不一緻,可以用@TableName注解,這樣就能指向具體的資料庫。格式如下:
這裡的資料庫名為sys_user,程式中類名為User,不一緻。用@TableName注解即可。
@TableId主鍵注解;使用位置:實體類主鍵字段。
在主鍵上标注注解,還需注明id為自增的。
@TableField字段注解(非主鍵)。如果資料庫表裡的字段名稱和類中的屬性名稱不一緻,用該注解。例如下圖:資料表裡字段名為nickname,系統類中屬性名為name不一緻。
具體細節請認真觀看官方注解的文檔。