嗶哩嗶哩b站肉片免費入口在哪里自己可以創(chuàng)建網(wǎng)站嗎
文章目錄
- 一、初識 MyBatis Plus
- 1.1 MyBatis Plus 是什么
- 1.2 MyBatis Plus 和 MyBatis 的區(qū)別
- 二、在 Spring Boot 項目中集成 MyBatis Plus
- 2.1 環(huán)境準備
- 2.2 引入 MyBatis Plus 依賴
- 2.3 定義 Mapper
- 2.4 測試 MyBatis Plus 的使用
- 三、MyBatis Plus 常用注解
- 3.1 為什么需要注解
- 3.2 @TableName
- 3.3 @TableId
- 3.4 @TableField
- 四、MyBatis Plus 常見配置
一、初識 MyBatis Plus
1.1 MyBatis Plus 是什么
MyBatis Plus(簡稱 MyBatis-Plus 或 MP)是一個流行的Java持久層框架,它在 MyBatis 的基礎(chǔ)上進行了擴展,旨在簡化數(shù)據(jù)庫操作和提高開發(fā)效率
。它提供了豐富的功能和工具,使開發(fā)者能夠更輕松地進行數(shù)據(jù)庫操作,包括增刪改查等常見操作。MyBatis Plus 還提供了一套方便的 API 和注解,可以減少編寫重復(fù)性代碼的工作。
MyBatis Plus 的官網(wǎng):https://www.baomidou.com
1.2 MyBatis Plus 和 MyBatis 的區(qū)別
MyBatis Plus 與原始的 MyBatis 框架有以下主要區(qū)別:
-
功能增強:MyBatis Plus 在 MyBatis 的基礎(chǔ)上提供了更多的功能,如通用的 CRUD 操作、分頁查詢、條件構(gòu)造器等。這些功能減少了開發(fā)人員的工作量,提高了開發(fā)效率。
-
注解支持:MyBatis Plus 引入了一系列注解,如
@TableName
、@TableId
、@TableField
等,使得實體類的映射更加靈活和方便,不再需要 XML 映射文件。 -
更強大的條件構(gòu)造器:MyBatis Plus 的條件構(gòu)造器允許我們以更加直觀和鏈式的方式構(gòu)建 SQL 查詢條件,而不必擔心拼接 SQL 字符串。
-
自動代碼生成:MyBatis Plus 提供了代碼生成器,可以根據(jù)數(shù)據(jù)庫表結(jié)構(gòu)自動生成實體類和 Mapper 接口,極大地簡化了開發(fā)過程。
總的來說,MyBatis Plus 是 MyBatis 的增強版,旨在提供更多便捷的特性,減少開發(fā)工作,同時保留了 MyBatis 的靈活性和強大性能。
二、在 Spring Boot 項目中集成 MyBatis Plus
2.1 環(huán)境準備
為了更好的演示 MyBatis Plus 的使用,我首先準備了一個 Spring Boot Demo 示例代碼,其中使用了 MyBatis 實現(xiàn)了對一張 User
表的增刪改查操作:
這個 Demo 的結(jié)構(gòu)如下:
User
表的結(jié)構(gòu)如下:
并且通過單元測試,使用了對 User
表的增刪改查功能的測試:
以上就會整個 Demo 的結(jié)構(gòu),下面將使用 MyBatis Plus 來代替 MyBatis,實現(xiàn)對 User
表的增刪改查操作。
2.2 引入 MyBatis Plus 依賴
MyBatis Plus 提供了 Spring Boot 的自動裝配功能starter
,并且同時實現(xiàn)了 MyBatis 的相關(guān)功能,其 Maven 依賴如下,將其拷貝到 pom,xml
文件下即可:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>
注意,由于 MyBatis Plus 同時包含了 MyBatis 的功能,因此以前的 MyBatis 依賴則可以直接刪除掉:
2.3 定義 Mapper
為了簡化對數(shù)據(jù)庫表的增刪改查操作,MyBatis Plus 提供了一個基礎(chǔ)的BaseMapper
接口,其中以及包含了對單表的增刪改查操作:
因此我們自己定義的Mapper
只需要繼承這個接口,就能夠使用這些方法。例如,改造原來的UserMapper
:
public interface UserMapper extends BaseMapper<User> {
}
此時,原來UserMapper
接口中的方法和 UserMapper.xml
中寫的SQL語句也都可以不要了:
2.4 測試 MyBatis Plus 的使用
最后,我們可以在 UserMapperTest
類中,改造我們的測試方法,將原來增刪改查的方法改成從 BaseMapper
中繼承過來的方法:
@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid testInsert() {User user = new User();user.setId(6L);user.setUsername("Lucy");user.setPassword("123");user.setPhone("11111111111");user.setBalance(200);user.setInfo("{\"age\": 24, \"intro\": \"英文老師\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());// userMapper.saveUser(user);userMapper.insert(user);}@Testvoid testSelectById() {// User user = userMapper.queryUserById(5L);User user = userMapper.selectById(5L);System.out.println("user = " + user);}@Testvoid testQueryByIds() {// List<User> users = userMapper.queryUserByIds(List.of(1L, 2L, 3L, 4L));List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L, 4L));users.forEach(System.out::println);}@Testvoid testUpdateById() {User user = new User();user.setId(5L);user.setBalance(20000);// userMapper.updateUser(user);userMapper.updateById(user);}@Testvoid testDeleteUser() {// userMapper.deleteUser(5L);userMapper.deleteById(5L);}
}
在上面的代碼中,注釋掉的語句是原來通過 MyBatis 來實現(xiàn)的,在這些注釋代碼的下一行則是有 MyBatis Plus 提供的功能。運行這些測試代碼,全部順利通過。至此,是不是覺得 MyBatis Plus 比 MyBatis 好用多了啊。
三、MyBatis Plus 常用注解
3.1 為什么需要注解
在上面的例子中,僅僅是引入了 MyBatis Plus 的依賴,然后在自己的 Mapper
接口中繼承了 BaseMapper
,就實現(xiàn)了對單表的增刪改查操作,那么問題來了:就是 MyBatis Plus 是如何知道對哪張表進行操作的呢?
通過觀察我們自己的 UserMapper
可以發(fā)現(xiàn),繼承的 BaseMapper
是一個泛型接口,我們指定了 user
表對應(yīng)的 PO
類 User
,例如:
此時,泛型中的 User
就是與數(shù)據(jù)庫對應(yīng)的PO
類。Mybatis Plus 就是根據(jù) PO
實體的信息來推斷出表的信息,從而生成具體的 SQL
語句。在默認情況下,MyBatis Plus 會根據(jù) PO
實體進行以下操作:
- Mybatis Plus 會把
PO
實體的類名按照駝峰轉(zhuǎn)下劃線
的規(guī)則將其作為數(shù)據(jù)庫表名; - Mybatis Plus 會把
PO
實體的所有變量名按照駝峰轉(zhuǎn)下劃線
的規(guī)則作為表的字段名,并根據(jù)變量類型推斷字段類型; - Mybatis Plus 會把名為
id
的字段作為該表的主鍵。
但是,在很多的實際情況下都與上面默認的情況不符。比如,數(shù)據(jù)庫表以tb_
開頭、主鍵名不是id
、字段是一些特殊的關(guān)鍵字等等。這些情況在MyBatis中,可以在Mapper.xml
文件中進行解決,但是在 Mybatis Plus中就可以使用下面的注解進行解決了。
3.2 @TableName
@TableName
注解用于指定數(shù)據(jù)庫表的名稱。
默認情況下,MyBatis Plus 會根據(jù)實體類的類名轉(zhuǎn)化為數(shù)據(jù)庫表名,但如果數(shù)據(jù)庫表名與實體類的類名不匹配,就可以使用這個注解來明確指定表名。這對于處理表名以特殊前綴開頭(例如tb_
)的情況非常有用。
示例:
@TableName("user")
public class User {private Long id;private String name;
}
@TableName
注解除了指定表名以外,還可以指定很多其它屬性:
屬性 | 類型 | 必須指定 | 默認值 | 描述 |
---|---|---|---|---|
value | string | 否 | “” | 表名 |
schema | string | 否 | “” | schema |
keepGlobalPrefix | boolean | 否 | false | 是否保持使用全局的 tablePrefix 的值(當全局tablePrefix生效時) |
resultMap | string | 否 | “” | xml 中 resultMap 的 id (用于滿足特定類型的實體類對象綁定) |
autoResultMap | boolean | 否 | false | 是否自動構(gòu)建resultMap 并使用(如果設(shè)置 resultMap 則不會進行 resultMap 的自動構(gòu)建與注入) |
excludeProperty | string[] | 否 | {} | 需要排除的屬性名 @since 3.3.1 |
3.3 @TableId
@TableId
注解用于指定主鍵字段。
默認情況下,MyBatis Plus 會將名為 "id"
的字段作為主鍵,但如果表的主鍵字段名稱不是 "id"
,就可以使用這個注解來指定實體類中的主鍵字段。
示例:
@TableName("user")
public class User {@TableIdprivate Long id;private String name;
}
@TableId
注解支持兩個屬性:
屬性 | 類型 | 必須指定 | 默認值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 表名 |
type | Enum | 否 | IdType.NONE | 指定主鍵類型 |
IdType
支持的類型有:
值 | 描述 |
---|---|
AUTO | 數(shù)據(jù)庫 ID 自增 |
NONE | 無狀態(tài),該類型為未設(shè)置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT) |
INPUT | insert 前自行 set 主鍵值 |
ASSIGN_ID | 分配 ID(主鍵類型為 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默認實現(xiàn)類為DefaultIdentifierGenerator雪花算法) |
ASSIGN_UUID | 分配 UUID,主鍵類型為 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默認 default 方法) |
ID_WORKER | 分布式全局唯一 ID 長整型類型(please use ASSIGN_ID) |
UUID | 32 位 UUID 字符串(please use ASSIGN_UUID) |
ID_WORKER_STR | 分布式全局唯一 ID 字符串類型(please use ASSIGN_ID) |
這里比較常見的有三種:
- AUTO:利用數(shù)據(jù)庫的id自增長
- INPUT:手動生成 id
- ASSIGN_ID:雪花算法生成 Long 類型的全局唯一 id,這是默認的 ID 策略
3.4 @TableField
@TableField
注解用于指定數(shù)據(jù)庫表字段與實體類屬性之間的映射關(guān)系。
如果字段名與屬性名不匹配,或者需要進行特殊的映射,就可以使用這個注解來定義字段名、是否為主鍵、是否為插入或更新時的條件等。
示例:
@TableName("user")
public class User {@TableIdprivate Long id;private String name;private Integer age;@TableField("isMarried")private Boolean isMarried;@TableField("concat")private String concat;
}
在一般情況下并不需要給字段添加@TableField
注解,一些特殊情況除外,例如:
- 成員變量名與數(shù)據(jù)庫字段名不一致
- 成員變量是以
isXXX
命名,按照 JavaBean 的規(guī)范,Mybatis Plus 識別字段時會把is
去除,這就導致與數(shù)據(jù)庫的字段名不符。 - 成員變量名與數(shù)據(jù)庫一致,但是與數(shù)據(jù)庫的關(guān)鍵字沖突。使用
@TableField
注解給字段名添加 `` 轉(zhuǎn)義。
另外,@TableField
注解還支持其他參數(shù):
屬性 | 類型 | 必填 | 默認值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 數(shù)據(jù)庫字段名 |
exist | boolean | 否 | true | 是否為數(shù)據(jù)庫表字段 |
condition | String | 否 | “” | 字段 where 實體查詢比較條件,有值設(shè)置則按設(shè)置的值為準,沒有則為默認全局的 %s=#{%s},參考(opens new window) |
update | String | 否 | “” | 字段 update set 部分注入,例如:當在version字段上注解update=“%s+1” 表示更新時會 set version=version+1 (該屬性優(yōu)先級高于 el 屬性) |
insertStrategy | Enum | 否 | FieldStrategy.DEFAULT | 舉例:NOT_NULL insert into table_a(column) values (#{columnProperty}) |
updateStrategy | Enum | 否 | FieldStrategy.DEFAULT | 舉例:IGNORED update table_a set column=#{columnProperty} |
whereStrategy | Enum | 否 | FieldStrategy.DEFAULT | 舉例:NOT_EMPTY where column=#{columnProperty} |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自動填充策略 |
select | boolean | 否 | true | 是否進行 select 查詢 |
keepGlobalFormat | boolean | 否 | false | 是否保持使用全局的 format 進行處理 |
jdbcType | JdbcType | 否 | JdbcType.UNDEFINED | JDBC 類型 (該默認值不代表會按照該值生效) |
typeHandler | TypeHander | 否 | 類型處理器 (該默認值不代表會按照該值生效) | |
numericScale | String | 否 | “” | 指定小數(shù)點后保留的位數(shù) |
四、MyBatis Plus 常見配置
MyBatis Plus 同樣支持使用 yaml
格式的配置,關(guān)于 MyBatis Plus 的配置可以從起官網(wǎng)中進行了解:使用配置。
下面是關(guān)于 MyBatis Plus 的常用配置:
mybatis-plus:type-aliases-package: com.demo.mp.domain.po # 別名掃描包mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默認值global-config:db-config:id-type: auto # 指定 id 的生成方式configuration:map-underscore-to-camel-case: true # 是否開啟下劃線和駝峰的映射cache-enabled: false # 是否開啟二級緩存
對上述配置的說明:
- 因為 MyBatis Plus 支持 MyBatis ,因此在 MyBatis Plus 中也支持手寫 SQL形式的
Mapper 映射
。因為mapper
文件的讀取地址可以由我們自己配置。 id-type
:可指定在默認情況下 id 的生成方式,比如 auto、 assign_id 等。map-underscore-to-camel-case
:開啟下劃線和駝峰的命名規(guī)則直接的映射轉(zhuǎn)換。cache-enabled
:是否開啟二級緩存。