Mybatis-Plus是一個以Mybatis爲基礎,目的是爲了開發者更簡單的使用Mybatis,簡化開發,提高效率。意願是成爲Mybatis最好的搭檔,就像魂鬥羅中的1P、2P
特點(節選自官網)
- 無侵入:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑
- 啓動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
- 強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
- 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
- 支持主鍵自動生成:支持多達 4 種主鍵策略(內含分佈式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式調用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
- 支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 內置代碼生成器:採用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
- 內置分頁插件:基於 MyBatis 物理分頁,開發者無需關心具體操作,配置好插件之後,寫分頁等同於普通 List 查詢
- 分頁插件支持多種數據庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數據庫
- 內置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啓用該功能,能快速揪出慢查詢
- 內置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
第一個demo
首先我們需要在MySql(也可以是其他)中創建一張user測試表,表結構如下
id | name | age | gender |
---|---|---|---|
1 | Lil Lei | 20 | 1 |
2 | Han Meimei | 18 | 0 |
3 | Jim | 20 | 1 |
4 | LinTao | 21 | 1 |
5 | Lucy | 18 | 0 |
6 | Lily | 18 | 0 |
DDL 如下
CREATE TABLE `user` (
`id` bigint NOT NULL COMMENT '主鍵',
`name` varchar(32) DEFAULT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年齡',
`gender` int DEFAULT NULL COMMENT '性別 0-女; 1-男',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用戶表';
接下來需要創建springboot項目,引入以下相關maven依賴
<!-- web模塊 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Mybatis-Plus starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!-- guava-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
<!-- springboot test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
在entity包中創建entity
@Data
@ToString
public class User {
private Long id;
private String name;
private Byte age;
private Byte gender;
}
在mapper包中創建mapper,需要繼承Mybatis-Plus的BaseMapper
@Repository
public interface IUserMapper extends BaseMapper<User> {
}
在SpringBoot啓動類上標註mapper掃描路徑
@SpringBootApplication
@MapperScan("com.beemo.mybatisplus.mapper")
public class MybatisplusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisplusApplication.class, args);
}
}
編寫測試方法
@SpringBootTest
class MybatisplusApplicationTests {
@Autowired
private IUserMapper userMapper;
@Test
void testDemo() {
List<User> users = Optional.ofNullable(userMapper.selectList(null)).orElse(Lists.newArrayList());
users.stream().forEach(System.out::println);
}
}
控制檯輸出
User(id=1, name=Li Lei, age=20, gender=1)
User(id=2, name=Han Meimei, age=18, gender=0)
User(id=3, name=Jim, age=20, gender=1)
User(id=4, name=Lin Tao, age=21, gender=1)
User(id=5, name=Lucy, age=18, gender=0)
User(id=6, name=Lily, age=18, gender=0)
我們的第一個demo就成功了
打印SQL信息
剛纔的例子中,我們並不能觀察到SQL信息,雖然查詢結果符合預期,但是無法確認SQL是否是正確,使得我們調試非常不方便,此時可以添加以下配置,來顯示SQL信息
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在運行我們上述的demo,在控制檯就可以看到執行的SQL信息了
常用註解
- @TableName
該註解表示一個實體類對應的表名,如表名與實體名相同(或滿足駝峯式命名規則對應)
舉例,表名叫sys_admin,實體類叫Admin
@TableName("sys_admin")
public class Admin {
// ...
}
- @TableId
標註該屬性爲主鍵,其中value值指定數據庫的主鍵列名,type指定主鍵生成策略,其中有
值 | 描述 |
---|---|
AUTO | 數據庫ID自增 |
NONE | 無狀態,該類型爲未設置主鍵類型(註解裏等於跟隨全局,全局裏約等於 INPUT) |
INPUT | insert前自行set主鍵值 |
ASSIGN_ID | 分配ID(主鍵類型爲Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默認實現類爲DefaultIdentifierGenerator雪花算法) |
ASSIGN_UUID | 分配UUID,主鍵類型爲String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默認default方法) |
同ASSIGN_ID | |
同ASSIGN_UUID | |
同ASSIGN_ID |
具體的類型還需根據程序來選擇,如爲微服務等,選擇ASSIGN_ID;如爲單機,那麼選擇自增就可以
舉例:
@TableId(value = "u_id", type = IdType.ASSIGN_ID)
private Long id;
- @TableField
該字段同@TableId,但是爲映射非主鍵字段,同時屬性也比較豐富
value:指定數據庫的列名
exists:標識該字段是否爲數據庫表列
fill:自動填充策略,見後續說明
select:是否爲查詢項。有時候一些信息我們不想每次都進行查詢,比如創建時間,創建用戶等,此時我們可以標註select爲false
舉例:
將數據庫添加新列
ALTER TABLE `user` ADD COLUMN create_time DATETIME DEFAULT NULL COMMENT '創建時間';
更新創建時間
UPDATE `user` SET create_time = now();
在實體類中添加新字段
// 表示該字段不是數據庫表字段
@TableField(exist = false)
private String genderName;
// 表示查詢時不查詢此字段
@TableField(select = false)
private LocalDateTime createTime;
修改測試方法
@Test
void testDemo() {
List<User> users = Optional.ofNullable(userMapper.selectList(null)).orElse(Lists.newArrayList());
users.stream().forEach(u -> {
u.setGenderName(convertGenderName(u.getGender()));
System.out.println(u);
});
}
private String convertGenderName(Byte gender) {
gender = Optional.ofNullable(gender).orElse((byte)-1);
switch (gender) {
case 0: return "女";
case 1: return "男";
default: return "未知";
}
}
在運行方法,觀察控制檯
可以看出,createTime字段爲數據庫對應列名,但是查詢的列中並不包含該列,證明我們的設置select = false生效;genderName不爲數據庫字段,程序沒有報錯,證明我們的設置exist = false生效