MybatisPlus中相关细节
1、Mybatisplus特性:
(1)无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
(2)损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
(3)强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
(4)支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
(5)支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
(6)支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
(7)支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
(8)内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
(9)内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
(10)分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
(11)内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
(12)内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
2、快速开始
①创建springboot 项目,然后导入三个依赖:
<!--mybatis-plus启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1<ersion>
</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>
②配置yml文件:
spring:
#配置数据源信息
datasource:
#配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
#配置连接数据库的各个信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybaits_plus?characterEncoding=utf-8&useSSL=false
#如果是8版本的驱动还需要加上时区的配置
username: root
password: 981015
③创建实体类,Mapper接口、MapperScan扫描器
④测试:queryWrapper 是用来指定查询条件的,如果没有查询条件则填null
3、添加日志功能
①yml中添加配置:
②效果:
4、继承BaseMapper<T> 中所能够使用的sql方法:
5、自定义 sql 方式
①在mapper 接口中写出要自定义方法。
②在resource 下创建mapper 文件夹,并创建相对应的mapper.xml文件
③在mapper.xml 文件中namespace绑定mapper接口,实现自定义sql。
6、service CRUD 接口:
①说明:
(1)通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页前缀命名方式区分 Mapper 层避免混淆、
(2)泛型 T 为任意实体对象
(3)建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
(4)对象 Wrapper 为 条件构造器
②IService 中的部分方法:
③具体实现:
7、MybatisPlus 是根据Mapper 接口中 BaseMapper<T> 中的泛型T ,来找到数据库中相对应的表来进行自动映射的。如果数据库中的表名为 t_user ,而basemapper 中的泛型T 为 User,则MybatisPlus 并不能将其关联映射起来。
8、将实体类与 数据库表 建立 关联的两种方式:
①在实体类上加 @TableName 注解。
@TableName("t_user")
②如果数据库中的表都用一个统一的前缀 tbl_。 则可以在yml全局配置文件中指明,指明后各个实体类中不需要再加注解。
#设置实体类所对应的表的统一前缀
mybatis-plus:
global-config:
db-config:
table-prefix: tbl_
9、MybatisPlus 插件是默认将 id 作为主键,如果表中的主键不叫 id ,而叫 uid ,则并不会建立起主键映射。可以在实体类的主键属性,用 @TableId 来标识。这样MybatisPlus则会把 这个属性所对应的字段指定为主键。
10、 @TableId 注解的 value 属性用于指定主键的字段。(当实体类中的属性与 数据库中的字段不匹配的时候用到),而 @TableId 注解的 type 属性用于设置主键的生成策略(默认是 type=IdType.ASSIGN_ID 雪花策略)。
11、MybatisPlus 主键 默认使用 雪花算法 自动递增。如果不需要用,则需要声明 @TableId( type = IdType.AUTO ),或者在全局配置yml中设置:
#设置实体类所对应的表的统一前缀
mybatis-plus:
global-config:
db-config:
id-type:auto
12、雪花算法(非常适用于分布式的架构)
①背景:需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。数据库的扩展方式主要包括:业务分库、主从复制,数据库分表。
②雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性(后添加的数据id 值肯定比之前添加数据的 id 值要大)。
③优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。
13、MybatisPlus 针对于驼峰命名法,不需要进行额外的配置,自动识别。
14、如果实体属性名与数据库字段名不一致,可以使用 @TableField( value = "字段名“ ) 注解来进行映射。
@TableField(vaule="user_name")
private String name;
15、@TableLogic 注解
①物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
②逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为"被删除状态”,之后在数据库中仍旧能看到此条数据记录
③使用场景:可以进行数据恢复
④实现逻辑删除:
(1)数据库中添加字段 is_deleted ,int 默认为0。
(2)实体类中添加属性 isDeleted,再当前属性上添加注解 @TableLogic
16、条件构造器 Wrapper
①queryWrapper:可以使用链式法则
(1)查询条件
(2)排序条件
(3)删除条件
(4)修改条件:update(user,queryWrapper) 方法中第一个参数user 来指明要修改的字段, 第二个参数queryWrapper 用来指明修改条件。
(5)查询指定条件:
(6)子查询:
(7)自定义查询条件:判断用户从前台传过来的查询条件都是什么
②updateWrapper:
(1)修改指定用户信息:第一个wrapper 用来指定要修改的用户条件,第二个wrapper用来说明修改哪些信息。(updateWrapper 不用像queryWrapper 那样重新new 一个实体。)
③LambdaQueryWrapper
(1)条件查询:(作用:防止数据库字段名写错,用 User ::getXXX 方式代替 “XXX” 方式表示数据库字段)
④LambdaUpdateWrapper
17、条件优先级:lambda 中的条件优先执行。
18、使用condition组装条件(同test09)
第一个参数是一个boolean类型的判断,第二个参数是数据库字段、第三个参数是需要判断的前台传入数据。
19、分页插件
①配置步骤:(1)创建MybatisPlusConfig 配置类 (2)创建 MybatisPlusInterceptor 拦截器方法,并添加分页拦截器,指定要进行分页的数据库类型。
②效果:
③page 对象中封装的方法:
④自定义查询条件分页
(1)在mapper中先定义方法,指明自定义的条件
(2)在mapper.xml中完善sql 语句
(3)测试方法
20、乐观锁插件
①乐观锁实现流程:
(1)数据库中添加version字段
(2)取出记录时,获取当前version
(3)更新时,version+1 ,如果where 语句中version 版本不对,则更新失败。
②MybatisPlus 实现乐观锁
(1)需要把数据库字段version ,所对应的实体类字段version ,上面添加注解@Version
(2)并且需要在MybatisPlusConfig 配置类中添加乐观锁拦截器。
interceptor.addInnerInterceptor(new optimisticLockerInnerInterceptor());
21、通用枚举
①数据库中添加sex字段
②创建SexEnum 类,标明枚举类型,并且在属性上添加 @EnumValue 注解。并在User 实体类中添加sex 属性。
③在配置类yml 开启扫描通用枚举
④测试
22、代码生成器
①引入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
②快速生成:创建FastAutoGeneratorTest 类。复制官方代码。
23、mybatisX插件(基于IDEA 插件)
①使用mybatisX 插件生成代码之前,需要在IDEA 中连接上相应操作的数据库。
②操作: