前言
mybatis plus是一個mybatis的增強工具,在其基礎上隻做增強不做改變。作為開發中常見的第三方元件,學習并應用在項目中可以節省開發時間,提高開發效率。
官方文檔位址:MyBatis-Plus (baomidou.com)
一、特性
1.1損耗小
自動注入基本CRUD,性能無損耗,直接面向對象操作(通過BaseMaper<約定的泛型>);
1.2支援lambda表達式
通過lambda表達式的形式,友善編寫各類查詢條件,無需擔心字段出錯;
1.3支援主鍵自動生成
内含分布式唯一ID生成器-Squence,可自行配置主鍵;
1.4支援ActiveRecord模式
實體類隻需繼承Model類即可進行CRUD操作;
1.5支援分頁插件
基于mybatis實體分頁,配置好插件後自動将資料分頁;
二、快速入門
2.1建立資料庫
2.1.1建表
DROP TABLE IF EXISTS user;CREATE TABLE user(
id BIGINT() NOT NULL COMMENT '主鍵ID',
name VARCHAR() NULL DEFAULT NULL COMMENT '姓名',
age INT() NULL DEFAULT NULL COMMENT '年齡',
email VARCHAR() NULL DEFAULT NULL COMMENT '郵箱', PRIMARY KEY (id)
);
複制
2.1.2初始化項目
- 導入依賴(盡量不要與mybatis一起導入)
- 配置依賴
- 編寫代碼
- 拓展技術能力
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
複制
2.1.3連接配接資料庫
#mysql配置#資料庫使用者名spring.datasource.username=root#登入密碼spring.datasource.password=password123#JDBC位址、編碼、安全連接配接spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8#資料庫驅動spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
複制
2.2編寫代碼
2.2.1實體類
@Data@AllArgsConstructor@NoArgsConstructorpublic class User { //使用者id
private Long id; //使用者名
private String name; //年齡
private Integer age; //郵箱
private String email;
}
複制
2.2.2mapper檔案
@Mapper@Repository//該接口繼承BaseMapper類所有方法public interface UserMapper extends BaseMapper<User> {
}
複制
2.2.3邏輯實作層
@Autowired
private UserMapper userMapper; //建立條件構造器
QueryWrapper<User> wrapper = new QueryWrapper<>();
userMapper.selectList(wrapper);
複制
2.3日志配置
#mybatis-plus日志配置,預設控制台輸出日志,properties檔案mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
複制
2.4CRUD擴充
2.4.1插入操作(insert)
void insert(){ User user = new User();
user.setName("Alex");
user.setAge();
user.setEmail("[email protected]"); //受影響的行數
int result = userMapper.insert(user);
System.out.println(result);
System.out.println(user);
}
複制
主鍵生成政策
實體類聲明資料庫表名,同時設定主鍵id為自增。
//資料庫表名@TableName("user")public class User implements Serializable { //使用者id,主鍵自增
@TableId(value = "id",type = IdType.AUTO)
private Long id;
}
複制
2.4.2更新操作(update)
//更新操作
@Test
void updateTest(){ User user = new User();
user.setId(3L);
user.setName("docker&K8s"); //操作結果條數
int i = userMapper.updateById(user);
System.out.println(i);
}
複制
時間自動填充政策
方式一(資料庫級别):不推薦使用
在資料庫中建立字段并設定為操作的目前時間,且需要在實體類同步屬性:

進而達到自動填充時間的。
private Date createTime; private Date updateTime;
複制
方式二(代碼級别):
- 在實體類屬性加上對應注解,自動填充時間字段:
@TableField(fill = FieldFill.INSERT)
private Date createTime; @TableField(fill = FieldFill.UPDATE)
private Date updateTime;
複制
- 代碼邏輯中建立時間對象擷取目前時間(推薦使用):
user.setUpdateTime(new Date());
複制
2.4.3樂觀鎖處理
在面試中經常會提及悲觀鎖、樂觀鎖的概念,其實這兩個概念非常簡單。
樂觀鎖
樂觀鎖顧名思義十分樂觀,它總是認為不會出現問題,無論幹什麼都不會去上鎖。如果出現問題,就再更新值去測試。
悲觀鎖
悲觀鎖顧名思義十分悲觀,它總是認為會出現問題,無論幹什麼都會去上鎖,然後再去操作。
樂觀鎖機制
- 取出記錄時,擷取目前version
- 更新時帶上該version
- 執行更新時,set version = newVersion where version = oldVersion
- 若version不對,則更新失敗
樂觀鎖:、先去查詢獲得版本号version = --A線程update user set name = "zhuzhiqiang",version = version + where id = and version =
複制
若B線程搶先完成,這時version = ,導緻線程A修改失敗--B線程update user set name = "zhuzhiqiang",version = version + where id = and version =
複制
測試mybatisPlus的樂觀鎖插件
1、在資料庫表中添加version字段:
2、實體類添加對應屬性,并添加@Version注解:
//樂觀鎖字段(注解)
@Version
private Integer version;
複制
3、注冊元件:
@EnableTransactionManagement //事務管理注解@Configurationpublic class MyBatisPlusConfig {
//注冊樂觀鎖插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){ return new OptimisticLockerInterceptor();
}
}
複制
2.4.4分頁查詢處理(本質上還是執行limit)
使用步驟
配置攔截器元件(配置類中):
直接使用Page對象即可:
2.4.5删除操作
邏輯删除
邏輯删除指的是在資料庫中沒有被删除,而是通過一個變量來使其失效:deleted = 0 -> deleted = 1
資料庫表中增加字段:
實體類中添加對應屬性:
properties配置:
測試删除(本質上是一個更新操作):
注:若執行了邏輯删除,那麼再次查詢該條資料時,會在select語句中自動拼接deleted=0,即查詢不到該條語句。
2.4.6條件構造器Wrapper
按照複雜條件進行查詢,本質上等價于使用複雜sql進行查詢。
源碼分析:
測試使用:
複雜條件的SQL查詢
- like模糊查詢
public
void
testLike(){
QueryWrapper<User> wrapper = new
QueryWrapper<>(); //相當于where語句,
wrapper //表示name字段中 不包含e的資料
.notLike("name","e") //右查詢,以t開頭的email字段資料
.likeRight("email", "t");
}
三、進階用法
3.1基本概念
AutoGenerator 是 MyBatis-Plus 的代碼生成器,通過 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個子產品的代碼,極大的提升了開發效率。
3.2建立工具類
public class AutoCodeTool { public static void main(String[] args) { //建構代碼自動生成器對象
AutoGenerator autoCode = new AutoGenerator(); //全局配置生效
autoCode.setGlobalConfig(gc); //資料源生效
autoCode.setDataSource(dsc); //包配置生效
autoCode.setPackageInfo(packageConfig); //其它政策生效
autoCode.setStrategy(strategyConfig); //執行代碼生成器
autoCode.execute();
}
}
複制
3.3全局配置
//1、全局配置GlobalConfig gc = new GlobalConfig();//輸出目錄,将自動生成的代碼生成在以下路徑中String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");//設定作者資訊gc.setAuthor("Created by zhuzqc");//生成代碼後不打開檔案管理器gc.setOpen(false);//是否覆寫原來生成的代碼gc.setFileOverride(false);//主鍵類型gc.setIdType(IdType.ID_WORKER);//時間類型gc.setDateType(DateType.ONLY_DATE);//配置swagger文檔gc.setSwagger2(true);
複制
3.4設定資料源
//2、設定資料源DataSourceConfig dsc = new DataSourceConfig();//資料源具體配置dsc.setUrl("jdbc:mysql://localhost:3306/mubatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("password123");
dsc.setDbType(DbType.MYSQL);
複制
3.5包的配置
//3、包的配置PackageConfig packageConfig = new PackageConfig();//生成包路徑packageConfig.setParent("com.dcone");//生成子產品名packageConfig.setModuleName("common");//生成entitypackageConfig.setEntity("pojo");//生成mapperpackageConfig.setMapper("dao");//生成servicepackageConfig.setService("service");//生成controllerpackageConfig.setController("controller");
複制
3.6其它政策
//4、其它政策StrategyConfig strategyConfig = new StrategyConfig();//設定需要映射的資料庫表strategyConfig.setInclude("user");//駝峰命名strategyConfig.setNaming(NamingStrategy.underline_to_camel);
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);//設定LombokstrategyConfig.setEntityLombokModel(true);//RESTFUL風格strategyConfig.setRestControllerStyle(true);//邏輯删除strategyConfig.setLogicDeleteFieldName("deleted");//自動填充配置(建立和修改時間)TableFill gmtCreate = new TableFill("gmt_create_time", FieldFill.INSERT);TableFill gmtModified = new TableFill("gmt_modified_time", FieldFill.INSERT_UPDATE);
autoCode.setStrategy(strategyConfig);//作為清單元素添加自動填充政策ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategyConfig.setTableFillList(tableFills);//樂觀鎖配置strategyConfig.setVersionFieldName("version");//通路URL下劃線風格strategyConfig.setControllerMappingHyphenStyle(true);
複制
四、總結
4.1優點
- 通過少量配置即可實作單表大部分 CRUD 操作(将簡單查詢封裝),更有強大的條件構造器,滿足各類使用需求;
- 采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支援模闆引擎;
- 支援 ActiveRecord 形式調用,實體類隻需繼承 Model 類即可進行強大的 CRUD 操作。
4.2缺點
- 對資料通路層DAO的上層入侵太強,入侵到service、甚至controller,将層次結構耦合起來;
- 資料查詢代碼複雜,最終SQL過程黑盒,不利于業務性優化,不利于排查問題;
- 一旦項目躍遷到微服務,其難以在複雜高性能大規模服務上應用。