mp的使用
- mp现状
- 快速小例子
- 按条件查询QueryWrapper
-
- 源码理论
- QueryWrapper构建
- 对象化条件查询1
- 对象化复杂查询2
- 对象化or查询orderby
- 对象化日期查询及子查询
- 对象化 条件1 and (条件2 or 条件3) 复用函数式表达式JDK8
- 对象化条件1 or (条件2 and 条件3)
- 对象化 (条件1 or 条件2) and 条件3
- 对象化 in(30,31,45)
- 只返回一条
- Select只要其中的几列
- 排除create_time 与 manager_id 两列
- 页面传了值或没传值
- 用PO进行查询
- 在实体列上设置条件
- allEq即Map条件查询
- Select返回Map<列,值>
- Select聚合函数的查询
- SelectObjs只返回第一个字段的值
- Select查询Count
- selectOne只返回一条记录
- Lambda条件构造器
- 自定义SQL
- 分页查询
- 更新
- 删除方法
- AR模式
- 主键
- 基本配置
- Service
mp现状
MyBatis vs JPA
而言MyBatis劣势
- 简单CRUD操作还得写SQL语句
- XML中有大量的SQL要维护
- MyBatis自身功能很有限,但支持Plugin
MP特性
- 无侵入、损耗小、强大的CRUD操作
- 支持Lambda形式调用、支持多种数据库
- 支持主键自动生成、 支持ActiveRecord模式
- 支持自定义全局通用操作、支持关键词自动转义
- 内置代码生成器、内置分页插件、内置性能分析插件
- 内置全局拦截插件、内置Sql注入剥离器
MP架构
Mp地址
官网地址: https://mybatis.plus/
github: https://github.com/baomidou/mybatis-plus
码云: https://gitee.com/baomidou/mybatis-plus
码云各种sample: https://gitee.com/baomidou/mybatis-plus-samples
优秀案例
https://mybatis.plus/guide/#%E4%BC%98%E7%A7%80%E8%A7%86%E9%A2%91
快速小例子
pom.xml
分析mybatis-plus-boot-stater的依赖关系
application.yml 的配置
application.yml日志的输出
启动类增加mapper的注解
实体类
Mapper接口
测试类查询
测试类插入
如果列为null 则修改或插入不会出现在SQL语句中
如果不插入ID则进行雪花算法默认补列
指定表名@TableName
指定主键@TableId
如果你主键策略默认什么也没配,MP会自动找ID作为主键 而你没配@TableId但是主键不是ID而是user_id 此时MP会报错
解决方式 要么改成ID后MP会自动找,要么还使用user_id同时加上@TableId
指定列名@TableField
排除某字段不是表字段
第一种方式transient关键字
第二种方式将static修饰
当使用static修饰后mp不会与表名关联转换
静态变量也能进行忽略 ,而类在正常序列化的时候也可以
第三种方式exist=false
false 不是数据库表中的字段
Mapper查询
按条件查询
selectById()
selectIds
selectByMap
传的值必须是数据库列名,而不是类的属性名
按条件查询QueryWrapper
源码理论
QueryWrapper构建
对象化条件查询1
对象化复杂查询2
名字中包含雨年并且龄大于等于20且小于等于40并且email不为空
name like ‘%雨%’ and age between 20 and 40 and email is not null
对象化or查询orderby
对象化日期查询及子查询
对象化 条件1 and (条件2 or 条件3) 复用函数式表达式JDK8
对象化条件1 or (条件2 and 条件3)
对象化 (条件1 or 条件2) and 条件3
对象化 in(30,31,45)
只返回一条
Select只要其中的几列
排除create_time 与 manager_id 两列
页面传了值或没传值
上面左面是传统写法,右面是简洁写法
用PO进行查询
在实体列上设置条件
我感觉不太实用 花架子
allEq即Map条件查询
当为false时当age=null会忽略方法
如果为true时当age=null 会生 age isNull 的sql
将map中的某个条件过滤掉
Select返回Map<列,值>
Select聚合函数的查询
SelectObjs只返回第一个字段的值
Select查询Count
selectOne只返回一条记录
查询结果必须是一条 或者为没有 如果多条会报错
如果返回多条会报错
Lambda条件构造器
可以通过三种方式创建Lambda构造器
用法
List userList = userMapper .selectList(ambdaQuery);
userList.forEach(System. out:println);
第二个例子
LambdaQueryChainWrapper
自定义SQL
版本大于3.0.7
将自定义SQL写在注解里
自定义SQL写在xml里
application.yml
分页查询
注入PaginationInterceptor
分页接口
分页返回对象
分页返回Map
下面的这个是返回Map<String,Object> 类型
自定义分页
更新
按ID更新
按set,where更新
第一种写法
第一个参数是set条件 第二个参数是where条件
第二种写法UpdateByWrapper
也可以通过set来设置条件
第二种写法UpdateByWrapperLambda
第二种写法LambdaUpdateChainWrapper
删除方法
deleteById
deleteByMap
deleteBatchIds
AR模式
继承Model
对象操作insert
对象操作selectById
对象操作updateByID
对象操作insertOrUpdate
这个没有设置id 通过insertOrUpdate直接插入
如果有id的话会去库里更新
查到了 去更新 查不到去插入
主键
IdType.AUTO
IdType.NONE
代表跟随全局
IdType.ID_WORKER_STR
字符串类型的雪花算法
全局主键配置
全局的主健类型配置为uuid
基本配置
config-location
classpath*
type-aliases-package作用
configuration
config-location与configuration是互斥
Config-location与configuration这两个不能同时出现
fieldStrategy
not_null
当为not_null时 insert update语句 属性字段不设置值是不会加入SQL语句中去的
默认的值为 not-null
Ignored
设置ignored后 所有的字段都会列出在属性中
最好别这么设置
notEmpty
设置notEmpty 则 “” 和NULL的都会被忽略 不会放在SQL中
局部FieldStrategy设置
这是配置局部字段的