MybatisPlus学习要点记录(更新中)
一、MybatisPlus是什么?
MybatisPlus官网:https://baomidou.com/
由官网定义可知:
1、MP不是为了取代Mybatis,是Mybatis的搭档,是协作完成需求;
2、MP是为了简化Mybatis的开发,提高效率。
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
二、快速入门
(一)创建一个SpringBoot项目MPDemo
(二)导入MP的起步依赖
注:引入MP的起步依赖,实则已经包含了Mybatis的起步依赖。
<!-- 导入MybatisPlus的起步依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.10.1</version>
</dependency>
<!-- 导入lombook起步依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- 导入mysql的起步依赖-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
(三)创建测试数据库
数据库脚本如下:
# 创建数据库mpdemo
create database mpdemo;
# 使用数据库mpdemo
use mpdemo;
DROP TABLE IF EXISTS `user`;
# 创建表user
CREATE TABLE `user`
(
id BIGINT NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
# 为user表插入数据
INSERT INTO `user` (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
(四)配置application.yml
数据库连接配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mpdemo
username: root
password: root
(五)创建实体类User
@Data
@TableName("`user`")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
(六)创建数据访问层UserMapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
(七)创建测试类SampleTest
@SpringBootTest
public class SampleTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
Assert.isTrue(5 == userList.size(), "");
userList.forEach(System.out::println);
}
}
(八)MP结果验证
三、MP常见注解
MP的原理:MP通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
(1)实体类名驼峰转下划线作为表名;
(2)名为id的字段作为主键;
(3)变量名驼峰转下划线作为表的字段名。
(一)@TableName注解
@TableName注解,用来指定表名。
(二)@TableId注解
@TableId注解,用来指定表中的主键字段信息。
@TableId(value = "id", type = ""),value为命名,type的类型有:
(1)IdType.AUTO:数据库自增长。
(2)IdType.INPUT:通过set方法自定输入。
(3)IdType.ASSIGN_ID:分配ID,接口IdentifierGenerator的方法nextId来生成id,默认实现类为DefaultIndentifierGenerator雪花算法。
(三)@TableFiled注解
@TableFiled注解,用来指定表中的普通字段信息。
常见的场景有:
(1)成员变量名与数据库字段名不一致;
(2)成员变量名以is开头,且是布尔值;
(3)成员变量名与数据库关键字冲突;
(4)成员变量不是数据库字段。
(四)示例
数据库表信息
实体类信息
/**
* MP常用注解示例
*/
@TableName("tb_user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("username")
private String name;
@TableField("is_married")
private Boolean isMarried;
@TableField("'order'")
private Integer order;
@TableField(exist = false)
private String address;
}
(五)常见配置
MP的配置项继承了Mybatis原生配置,当然也有自身的新特性配置,例如:
# myabtis-plus信息配置
mybatis-plus:
type-aliases-package: com.yassels.mpdemo.pojo # 别名扫描包
mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值
configuration:
map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射
cache-enabled: false # 是否开启二级缓存
global-config:
db-config:
id-type: assign_id # id为雪花算法生成
update-strategy: not_null # 更新策略,值更新非空字段
四、MP使用的基本流程
(1)导入MP的地步依赖;
(2)Mapper继承BaseMapper<User>;
(3)通过注解处理实体类与数据库表信息保持一致;
(4)Application.yml配置MP信息。
五、核心功能
(一)条件构造器
MP支持各种复杂的where条件:
条件构造器的用法:
(1)QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分;
(2)UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊时才使用;
(3)尽量使用LambdaUpdateWrapper和LambdaQueryWrapper,避免硬编码。
(二)自定义SQL
利用MP的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。