SpringBoot中Mybatis-Plus組件的使用

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方法)
ID_WORKER 同ASSIGN_ID
UUID 同ASSIGN_UUID
ID_WORKER_STR 同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生效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章