配套视频地址: https://www.bilibili.com/video/BV1P24y1675x/
一、 概述
1. MyBatis-Plus是什么
MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官方愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 [魂斗罗] 中的 1P、2P,基友搭配,效率翻倍。
2. 特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
3. 支持数据库
任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库
- MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift
- 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库
4. 框架结构
二、Hello World
1. 前置要求
- 熟悉SSM
- 熟悉SpringBoot
- 熟悉Maven
2. 准备库和表
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES
(1, '张三', 18, '[email protected]'),
(2, '李四', 20, '[email protected]'),
(3, '王五', 28, '[email protected]'),
(4, '赵六', 21, '[email protected]'),
(5, '赵二狗', 24, '[email protected]');
3. SpringBoot项目
-
pom
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
-
yml
spring: datasource: username: root password: 123456 url: jdbc:mysql:///mpdb
-
entity
@Data public class User implements Serializable { private Long id; private String name; private Integer age; private String email; }
-
mapper
@Mapper // 这里如果不加该注解,则可以在启动类上加@MapperScan("cn.lantu") public interface UserMapper extends BaseMapper<User> { }
-
test
@SpringBootTest class HelloMpApplicationTests { @Resource private UserMapper userMapper; @Test void getUsers() { List<User> users = userMapper.selectList(null); users.forEach(System.out::println); } // ID值默认为雪花算法 // 若要使用表自增,则再实体类id字段加@TableId(type = IdType.AUTO) @Test void addUser() { User user = new User(null,"刘大葱",28,"[email protected]"); userMapper.insert(user); } @Test void updateUser() { User user = new User(1L,"张三疯了",28,"[email protected]"); userMapper.updateById(user); } @Test void deleteUser() { userMapper.deleteById(7L); } }
三、注解
@TableName
表名注解,标识实体类对应的表
@TableId
主键注解
其中,IdType主键类型说明
值 | 描述 |
---|---|
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 方法) |
@TableField
字段注解
属性 | 默认值 | 描述 |
---|---|---|
value | “” | 数据库字段名 |
exist | true | 是否为数据库表字段 |
select | true | 是否进行 select 查询 |
@TableLogic
表字段逻辑处理注解(逻辑删除)
属性 | 类型 | 描述 |
---|---|---|
value | String | 逻辑未删除值 |
delval | String | 逻辑删除值 |
使用步骤:
-
yml
mybatis-plus: global-config: db-config: logic-delete-field: deleted # 全局逻辑删除的实体字段名,配置后可不用@TableLogic注解 logic-delete-value: 1 # 逻辑已删除 logic-not-delete-value: 0 # 逻辑未删除
-
entity
@TableLogic private String deleted;
@Version
乐观锁注解,当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
使用步骤:
-
为表新增字段:version,balance
-
config
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; }
-
entity
@Version private Integer version; private Integer balance;
-
断点调试
@SpringBootTest public class LockTest { @Resource private UserMapper userMapper; @Test public void lockA(){ User user = userMapper.selectById(6); user.setBalance(user.getBalance()-10); userMapper.updateById(user); } @Test public void lockB(){ User user = userMapper.selectById(6); user.setBalance(user.getBalance()-20); userMapper.updateById(user); } }
四、查询
1. 分页查询
-
配置分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
-
查询前设置分页参数
IPage page = new Page<>(2, 3); userMapper.selectPage(page, null); List records = page.getRecords(); records.forEach(System.out::println);
2. 条件构造器
-
常规使用
// 查询年龄>20,姓赵,降序 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper .lt("age",25) .likeRight("name","赵") .orderByDesc("id"); List<User> users = userMapper.selectList(wrapper); users.forEach(System.out::println);
-
推荐使用
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper .lt(User::getAge,25) .likeRight(User::getName,"赵") .orderByDesc(User::getId); List<User> users = userMapper.selectList(wrapper); users.forEach(System.out::println);
五、代码生成器
-
pom
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> </dependency>
-
java
FastAutoGenerator.create("jdbc:mysql:///mpdb", "root", "123456") .globalConfig(builder -> { builder.author("lantu") // 设置作者 //.enableSwagger() // 开启 swagger 模式 //.fileOverride() // 覆盖已生成文件 .outputDir("D:\\tmp\\spring\\hello-mybatisplus\\src\\main\\java"); // 指定输出目录 }) .packageConfig(builder -> { builder.parent("com.lantu") // 设置父包名 .moduleName("user") // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\tmp\\spring\\hello-mybatisplus\\src\\main\\resources\\user" )); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude("xxx_user_info,xxx_dept_info") // 设置需要生成的表名 .addTablePrefix("xxx_"); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute();