Mybatis-plus
1.mybatis-plus的概念
- 解决基本crud代码重复的问题
- 不是取代Mybatis,而是增强Mybatis的工具
- 特性:
- 无侵入
- 损耗小
- 提供强大的CRUD操作
- 支持Lambda形式调用
- 支持主键自动生成
- 支持ActiveRecord模式
- 支持自定义全局通用操作
- 内置代码生成器
- 内置分页插件,分页插件支持多种数据库
- 内置性能分析插件
- 内置全局拦截插件
2.mybatis-plus解决了mybatis 哪些缺点
- 提供无sql的crud操作(只是mybatis简单的crud也要提供sql)
- 内置代码生成器,分页插件,性能分析插件等(只是mybatis分页等需要依赖第三方插件)
- 提高功能丰富的条件构造器快速进行无sql开发(只是mybatis需要提供大量的xml文件)
3.mybatis-plus使用
- 创建一个spring-boot项目
- 导入依赖(父依赖等)
- application.properties中配置4要素和sql日志
- domain和mapper
- 启动类和测试类
- mybatis-plus中mapper接口的写法
- 继承一个BaseMapper接口
- 继承的接口中,定义了一些常用的crud的方法,所以我们可以使用里面的方法
- 我们的接口定义的时候需要明确指定操作实体对象.mp底层通过反射解析该实体对象,获取实体对象类名,字段,作为拼接sql语句的表名和字段名,然后根据crud操作,拼接处对应的crud sql语句.所以:我们的的实体类名和表名,必须和数据库的表名和列名一致
- 接口中有一个泛型,泛型是当前mapper要操作的实体类
4.mybaits-plus中的注解使用
4.1 @Tablename
- 表名注解(贴在实体类的对象名字上面),指定映射数据库中的哪一个表名
- 一般使用在数据库中的名字比较特殊(t_xxx等)
4.2 @TableField
- 字段注解(不适用在主键上,贴在你要注解的字段上),指定当前属性映射数据库中的哪一列
- @TableField(value=“xx”,exist=true/false)
使用exist:表示当前属性是否映射到数据库列
4.3 @TableId
- 主键注解(贴在主键上),标记当前属性映射表主键。
- @TableId(value=“id”, type=IdType.AUTO)
其中:type属性指定主键类型
IdType.AUTO 数据库id自增
IdType.NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
IdType.INPUT insert前自行set主键值
IdType.ASSIGN_ID 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
IdType.ASSIGN_UUID 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)
5.mybaits-plus的通用mapper接口
5.1 日志
第一种:
logging.level.xxxxx.mapper=debug
第二种:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
- 第一种日志带有时间,操作人,执行的方法,sql语句等
- 第二种日志只有sql语句
5.2 insert
- 添加一个新对象
5.3 update
5.3.1 updateById
- 使用在全量更新,只要传入对象属性不为bull,都可以进行update更新,条件通过id匹配
步骤: 必须知道id
- 查
- 替换
- 更新
在执行过程中,会将属性为null的字段忽略,不为null的字段拼接到updateById sql语句中
操作方案: - 建议将基本类型使用包装类型进行操作
- 使用update语句
5.3.2 update+UpdateWrapper
- 部分字段更新,通过wrapper对象拼接各种满足要求条件, 更新set的列由wrapper决定
步骤:
- 设置更新条件
- 拼接更新的列
5.3.3 两种方式的区别
- 参数1: 通过对象方式指定要更新的列与数据
- 如果指定了对象,mp会对这个对象里面所有非null的属性,拼接到set语法中
- 参数2: 指定更新查询条件
UpdateWrapper wrapper = new UpdateWrapper<>(); - 使用区别:
- 知道id并且更新所有使用updateById
- 部分字段更新,使用update + wrapper.eq(条件).set(更新字段)
5.4 delete
5.4.1 deleteById(id)
- 通过id删除对应的信息
5.4.2 deleteBatchIds(idList)
- 根据List存放的多个id,删除多个id
5.4.3 deleteByMap(map)
- 通过多个条件删除符合条件的信息
- 创建一个map集合
- 往map集合里面存放条件
- 条件map, key是列名 ,value是条件值
注意: 必须加条件,不然会清空表数据
5.4.4 delete(wrapper)
- 根据条件删除信息
使用QueryWrapper()
5.5 select
5.5.1 selectById(id)
- 根据id来进行查询
5.5.2 selectBatchIds(idList)
- 查询多个id多个信息
5.5.3 selectByMap(map)
- 根据map里面的条件进行查询
5.5.4 selectCount(wrapper)
- 统计符合条件的信息有多少条
5.5.5 selectList(wrapper)
- 查询满足条件的所有信息, 返回List 对象
5.5.6 selectMaps(wrapper)
- 查询满足条件的所有的信息, 返回List<Map<String, Object>> 底层将每条数据封装成HashMap
5.5.7 selectPage(page, wrapper)
- 分页显示数据
步骤:
- 配置一个分页的插件(拦截器)(在启动类中)
//分页
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
paginationInnerInterceptor.setOverflow(true); //合理化
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
步骤2:编写分页代码
- new 一个Page对象.
- 创建出来的对象用接口接收
- 参数1:当前页 参数2:每页显示条数
5.5.8selectOne(wrapper)
- 查出来只取第一条
注意: 如果查出数据条数超过一条报错:Expected one result (or null) to be returned by selectOne(), but found: xxx
5.5.9 selectObjs(wrapper)
- 查询全部记录,无指定返回第一列的数据(id).指定返回指定的列的数据
5.5.10 selectMapsPage(page, wrapper)
- 分页后返回的结果是HashMap
6.条件构造器
- 定义:条件拼接对象,用于sql中的where条件
- 准确的说:mybatis的动态sql(sql语句片段)
6.1 更新操作
6.1.1 UpdateWrapper更新
- set(boolean,column,value)
参数1: 如果为true,才在update sql语句中拼接,当前的column和value
如果传入的新name是null或者"“则为false不拼接这段name.
传入的新name不是null或者”"则进行修改他的name信息 - setSql(String sql)
6.1.2 LambdaUpdateWrapper更新
- 在编译阶段就判断字段是否存在,不存在的字段直接报错
6.1.3区别
- 一般推荐使用LambdaUpdateWrapper(因为可以进行字段的校验)
6.2 查询操作
6.2.1 QueryWrapper查询
6.2.2 LambdaQueryWrapper查询
- 进行字段的校验
6.2.3 区别
- 一般使用LambdaQueryWrapper(因为可以进行字段的校验)
6.3 Wrapper工具类
7.高级查询
7.1列投影
- 查询信息,返回部分的字段
- select(“xxx”,“xxx”);
//参数:Predicate 函数, 满足指定判定逻辑列才返回
//要求:wrapper.setEntity(employee);
select(Predicate predicate)
//参数1:通过实体属性映射表中列
//参数2:Predicate 函数, 满足指定判定逻辑列才返回
select(Class entityClass, Predicate predicate)
7.2排序
- orderByAsc: 正序排
orderByAsc(R… columns)
orderByAsc(boolean condition, R… columns) - orderByDesc 倒序排
orderByDesc (R… columns)
orderByDesc (boolean condition, R… columns)
如果需要指定两次种顺序就按顺序写两次
- orderBy(boolean condition,boolean isAsc,columns);
- 第一个参数:是否排序
- 第二个参数:true:正序,false:倒序
- 第三个参数按什么字段排序
7.3 分组查询
分组:GROUP BY 字段, …
- groupBy(R… columns)
groupBy(boolean condition, R… columns)
按什么字段进行分组,然后统计每组的人数
- having : HAVING ( sql语句 )
- having(String sqlHaving, Object… params)
- having(boolean condition, String sqlHaving, Object… params)
把group by 的结果进行过滤
7.4 条件查询
7.4.1 比较运算符
7.4.1.1 allEq/eq/ne
- allEq:全等匹配
- eq:单个参数判断是否相等
eq(R column, Object val)
eq(boolean condition, R column, Object val) - ne:不等于
ne(R column, Object val)
ne(boolean condition, R column, Object val)
7.4.1.2 gt/ge/lt/le
- gt:大于 >
gt(R column, Object val)
gt(boolean condition, R column, Object val) - ge:大于等于 >=
ge(R column, Object val)
ge(boolean condition, R column, Object val)
- lt:小于 <
lt(R column, Object val)
lt(boolean condition, R column, Object val) - le:小于等于 <=
le(R column, Object val)
le(boolean condition, R column, Object val)
7.4.1.3 between/notBetween
- between:BETWEEN 值1 AND 值2
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2) - notBetween:NOT BETWEEN 值1 AND 值2
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
7.4.1.4 isNull/isNotNull
- isNull:字段 IS NULL:为空
isNull(R column)
isNull(boolean condition, R column) - isNotNull:字段 IS NOT NULL;不为空
isNotNull(R column)
isNotNull(boolean condition, R column)
7.4.1.5 in/notIn/inSql/notInSql
- in:字段 IN (value1, value2, …):字段在符合某个条件
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value) - notIn:字段 NOT IN (value1, value2, …):字段不符合这里面的某个条件
notIn(R column, Object… values)
notIn(boolean condition, R column, Object… values) - inSql:字段 IN ( sql语句 )
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue) - notInSql:字段 NOT IN ( sql语句 )
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)
7.4.2 模糊查询
7.4.2.1 like/notLike
- like:LIKE ‘%值%’:只要包含了这个值
like(R column, Object val)
like(boolean condition, R column, Object val) - notLike:NOT LIKE ‘%值%’:只要不包含了这个值
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
7.4.2.2 likeLeft/likeRight
- likeLeft:LIKE ‘%值’:已某个值结尾
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val) - likeRight:LIKE ‘值%’:已某个值开头
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
7.4.3 逻辑运算符
7.4.3.1 or
- or:拼接 OR
or()
or(boolean condition)
7.4.3.2 and
- and:默认是and
7.4.3.3 and的嵌套使用
- 嵌套and:
and(Consumer consumer)
and(boolean condition, Consumer consumer)