一、Mybatis Plus簡介
Mybatis-Plus(簡稱MP)是一個mybtis的增強工具,在 MyBatis 的基礎上只做增強不做改變。MP針對mybatis,做了很多改進,簡單來說就是:hibernate的優點+mybatis的優點=mybatis plus,增強mybatis的更改數據庫時SQL的兼容性(hibernate優點mybatis缺點),以及封裝一些簡單SQL(hibernate優點mybatis缺點),提升mybatis的開發效率,且性能沒有降低。MP兼容mybatis的相關配置和使用方式,除了generator不同。
官方中文文檔:https://mp.baomidou.com/
代碼托管地址:碼云: https://gitee.com/baomidou/my...
??????Github: https://github.com/baomidou/m...
二、MP的特性
- 無侵入:只做增強不做改變,引入它不會對現有工程產生影響
- 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
- 強大的 CRUD 操作:內置通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
- 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔心字段寫錯
- 支持主鍵自動生成:支持多達 4 種主鍵策略(內含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
- 支持 ActiveRecord(AR) 模式:支持 AR 形式調用,實體類只需繼承 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 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
三、環境搭建
涉及軟件:數據庫:MySQL、開發軟件:idea
項目框架:Spring Boot
管理項目工具:maven
第一步:新建數據庫、表,并插入信息,腳本如下:
create database mp;
CREATE TABLE mp.user (
id BIGINT(20) PRIMARY KEY NOT NULL COMMENT '主鍵',
name VARCHAR(30) DEFAULT NULL COMMENT '姓名',
age INT(11) DEFAULT NULL COMMENT '年齡',
email VARCHAR(50) DEFAULT NULL COMMENT '郵箱',
manager_id BIGINT(20) DEFAULT NULL COMMENT '直屬上級id',
create_time DATETIME DEFAULT NULL COMMENT '創建時間',
CONSTRAINT manager_fk FOREIGN KEY (manager_id)
REFERENCES user (id)
) ENGINE=INNODB CHARSET=UTF8;
#初始化數據:
INSERT INTO mp.user (id, name, age, email, manager_id)
VALUES
(1, 'Jack', 20, 'Jack@baomidou.com', NULL),
(2, 'Tom', 28, 'Tom@baomidou.com', 1),
(3, 'Sandy', 21, 'Sandy@baomidou.com', 2),
(4, 'Billie', 24, 'Billie@baomidou.com', 2),
(5, 'Lida', 24, 'Lida@baomidou.com', 2);
第二步:創建Spring Boot項目,并引入依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
第三步: 配置
SpringBoot配置文件:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone = GMT
username: root
password: 990921
啟動類配置
@MapperScan("com.mp.demo1.dao")
@SpringBootApplication
public class Demo1Application {
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
第四步:編碼
實體類 User, 使用注解@Data簡化代碼
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
private String managerId;
private LocalDateTime createTime;
}
Mapper類,UserMapper
public interface UserMapper extends BaseMapper<User> {
}
第五步:測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
Assert.assertEquals(5, userList.size());
userList.forEach(System.out::println);
}
}
控制臺輸出結果
----- selectAll method test ------
2020-03-30 22:33:14.691 INFO 15784 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-03-30 22:33:14.857 INFO 15784 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
User(id=1, name=Jack, age=20, email=Jack@baomidou.com, managerId=null, createTime=null)
User(id=2, name=Tom, age=28, email=Tom@baomidou.com, managerId=1, createTime=null)
User(id=3, name=Sandy, age=21, email=Sandy@baomidou.com, managerId=2, createTime=null)
User(id=4, name=Billie, age=24, email=Billie@baomidou.com, managerId=2, createTime=null)
User(id=5, name=Lida, age=24, email=Lida@baomidou.com, managerId=2, createTime=null)
四、常用注解
注解名 | 應用場景 |
---|---|
@TableName | 表名與實體類中的類名不一致 |
@TableId | 表主鍵與實體類主鍵不一致 |
@TableField | 表字段名與實體類成員名不一致 |
排除實體類中非表字段
- 使用transient關鍵字修飾非表字段,但是被transient修飾后,無法進行序列化。
- 使用static關鍵字,因為我們使用的是lombok框架生成的get/set方法,所以對于靜態變量,我們需要手動生成get/set方法。
- 使用@TableField(exist = false)注解(說明:@TableField(exist = false) 注解加在bean屬性上,表示當前屬性不是數據庫的字段,但在項目中必須使用,這樣在新增等使用bean的時候,mybatis-plus就會忽略這個,不會報錯)
五、利用CURD進行增刪改查
BaseMapper(說明:BaseMapper是MP中自帶的)中封裝了很多關于增刪改查的方法,后期自動生成,我們直接調用接口中的相關方法即可完成相應的操作。
部分源碼:
public interface BaseMapper<T> extends Mapper<T> {
/**
* 插入一條記錄
*
* @param entity 實體對象
*/
int insert(T entity);
/**
* 根據 ID 刪除
*
* @param id 主鍵ID
*/
int deleteById(Serializable id);
/**
* 根據 columnMap 條件,刪除記錄
*
* @param columnMap 表字段 map 對象
*/
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
/**
* 根據 entity 條件,刪除記錄
*
* @param wrapper 實體對象封裝操作類(可以為 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
/**
* 刪除(根據ID 批量刪除)
*
* @param idList 主鍵ID列表(不能為 null 以及 empty)
*/
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
/**
* 根據 ID 修改
*
* @param entity 實體對象
*/
int updateById(@Param(Constants.ENTITY) T entity);
/**
* 根據 ID 查詢
*
* @param id 主鍵ID
*/
T selectById(Serializable id);
......
}
測試
@Test
public void test() {
//增
User user = new User();
user.setAge(21);
user.setManagerId("2");
user.setCreateTime(LocalDateTime.now());
int insert = userMapper.insert(user);
System.out.println("新增條數:"+insert);
//刪
int delete = userMapper.deleteById(1244644545065476098L);
System.out.println("刪除條數"+delete);
//改
User user1 = new User();
user1.setAge(20);
user1.setManagerId("2");
user1.setCreateTime(LocalDateTime.now());
int update = userMapper.updateById(user1);
System.out.println("更新條數:"+update);
//查
User user2 = userMapper.selectById(1);
System.out.println("查詢結果:"+user2);
}
控制臺輸出
2020-03-30 23:24:33.227 INFO 16360 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-03-30 23:24:33.399 INFO 16360 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
新增條數:1
刪除條數1
更新條數:0
查詢結果:User(id=1, name=Jack, age=20, email=Jack@baomidou.com, managerId=null, createTime=null)