目录
一、概念
1、什么是mybatisplus
2、为什么要使用mybatisplus
二、mybatisplus的使用
1、安装
2、常用注解
3、条件构造器
一、概念
1、什么是mybatisplus
MyBatis-Plus(简称MP)是一个基于MyBatis的增强框架,旨在简化开发、提高效率。
2、为什么要使用mybatisplus
① mybatisplus为我们提供好了基础的增删改查sql,仅仅是针对单表操作的增删改查。
② 为我们提供了一些好用的插件,例如分页插件、乐观锁插件具体使用参考官网
③ 为我们提供了一些好用的功能,比如代码生成、枚举映射、逻辑删除、主键生成等等具体参考官网
二、mybatisplus的使用
1、安装
首先需要引入mybatisplus的起步依赖(其中包含mybatis,基于springboot的起步依赖原理)
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>
其次mapper和service层需要继承basemapper、Iservice,serviceimpl,注意其中的泛型需要指定,泛型的类型就是要操作的数据库表对应的实体类。
2、常用注解
① @TableName
-
描述:表名注解,标识实体类对应的表
-
使用位置:实体类
示例:
@TableName("user")
public class User {
private Long id;
private String name;
}
TableName注解除了指定表名以外,还可以指定很多其它属性:
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 否 | "" | 表名 |
schema | String | 否 | "" | schema |
keepGlobalPrefix | boolean | 否 | FALSE | 是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时) |
resultMap | String | 否 | "" | xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定) |
autoResultMap | boolean | 否 | FALSE | 是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入) |
excludeProperty | String[] | 否 | {} | 需要排除的属性名 @since 3.3.1 |
② @tableId
说明:
-
描述:主键注解,标识实体类中的主键字段
-
使用位置:实体类的主键字段
示例:
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
}
tableId注解支持的两个属性:
属性 | 类型 | 必须指定 | 默认值 | 描述 |
value | String | 否 | "" | 表名 |
type | Enum | 否 | IdType.NONE | 指定主键类型 |
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 方法) |
ID_WORKER | 分布式全局唯一 ID 长整型类型(please use ASSIGN_ID) |
UUID | 32 位 UUID 字符串(please use ASSIGN_UUID) |
ID_WORKER_STR | 分布式全局唯一 ID 字符串类型(please use ASSIGN_ID) |
这里比较常见的有三种:
-
AUTO
:利用数据库的id自增长 -
INPUT
:手动生成id -
ASSIGN_ID
:雪花算法生成Long
类型的全局唯一id,这是默认的ID策略
③ @TableField
说明:
描述:普通字段注解
示例:
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
@TableField("isMarried")
private Boolean isMarried;
@TableField("concat")
private String concat;
}
一般情况下我们并不需要给字段添加@TableField
注解,一些特殊情况除外:
-
成员变量名与数据库字段名不一致
-
成员变量是以
isXXX
命名,按照JavaBean
的规范,MybatisPlus
识别字段时会把is
去除,这就导致与数据库不符。 -
成员变量名与数据库一致,但是与数据库的关键字冲突。使用
@TableField
注解给字段名添加``
转义
支持的其它属性如下:
属性 | 类型 | 必填 | 默认值 | 描述 |
value | String | 否 | "" | 数据库字段名 |
exist | boolean | 否 | TRUE | 是否为数据库表字段 |
condition | String | 否 | "" | 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window) |
update | String | 否 | "" | 字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性) |
insertStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:NOT_NULL insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>) |
updateStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:IGNORED update table_a set column=#{columnProperty} |
whereStrategy | Enum | 否 | FieldStrategy.DEFAULT | 举例:NOT_EMPTY where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if> |
fill | Enum | 否 | FieldFill.DEFAULT | 字段自动填充策略 |
select | boolean | 否 | TRUE | 是否进行 select 查询 |
keepGlobalFormat | boolean | 否 | FALSE | 是否保持使用全局的 format 进行处理 |
jdbcType | JdbcType | 否 | JdbcType.UNDEFINED | JDBC 类型 (该默认值不代表会按照该值生效) |
typeHandler | TypeHander | 否 | 类型处理器 (该默认值不代表会按照该值生效) | |
numericScale | String | 否 | "" | 指定小数点后保留的位数 |
3、条件构造器
① MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
②具体使用
QueryWrapper需要手写字段名,容易错。示例如下:
@Test
public void test1() {
//select id,username,info,balance from user where username like "%o%" and balance >= 1000
List<User> users = userMapper.selectList(new QueryWrapper<User>()
.like("username", "o")
.ge("balance", 1000)
.select("id", "username", "info", "balance")
);
LambdaQueryWrapper使用实体类的Lambda表达式,字段不会错。示例如下:
//select id,username,info,balance from user where username like "%o%" and balance >= 1000
List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>()
.like(User::getUsername, "o")
.ge(User::getBalance, 1000)
.select(User::getId, User::getBalance, User::getInfo, User::getUsername));
System.out.println(userList);
LamdUpdateWrapper 相较于LamdQueryWrapper多了个set方法,用于修改语句 setSql 手写sql语句拼上去
示例如下:
//案例:在原来金额的基础上减去200
userMapper.update(null, new LambdaUpdateWrapper<User>()
.setSql("balance = balance - 200")
.in(User::getId, Arrays.asList(1L, 2L, 4L)));
由于篇幅过长,剩余部分下篇续写。有何问题请各位大佬指出共同进步!