# mybatis-plus4
**Repository Path**: fhs-opensource/mybatis-plus4
## Basic Information
- **Project Name**: mybatis-plus4
- **Description**: mybatis-plus 4.0 临时仓库
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: http://baomidou.com/
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 16
- **Created**: 2022-06-07
- **Last Updated**: 2024-05-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Born To Simplify Development
> 规划计划

[官方文档](http://baomidou.com)
[企业版 Mybatis-Mate 高级特性](https://gitee.com/baomidou/mybatis-mate-examples)
https://toscode.gitee.com/fhs-opensource/mybatis-plus-4.0-demo 可以通过此demo学习MP4的新特性。
### maven坐标
因为MP4版本没有正式发布,故没有发布到包米豆的groupid下。
目前最新版本为4.0.6.
```xml
com.fhs-opensource
mybatis-plus-annotation
${fhs.mp.version}
com.fhs-opensource
mybatis-plus-advance
${fhs.mp.version}
com.fhs-opensource
mybatis-plus-boot-starter
${fhs.mp.version}
compile
com.fhs-opensource
mybatis-plus-core
${fhs.mp.version}
compile
com.fhs-opensource
mybatis-plus-extension
${fhs.mp.version}
```
### 多表Join支持使用说明
mybatis的多表查询分为2个步骤,1是自定义多表的resultMap,2是写多表查询sql。MP的多表实现也是通过自动生成多表resultMap和自动生成多表查询SQL实现的。
1、准备2个po
```java
@Data
@TableName(value="user",autoResultMap = true)
public class User {
@TableId("user_id")
private Integer userId;
@TableField("name")
private String name;
@TableField("age")
private Integer age;
@TableField("sex")
private String sex;
//指定这个字段和School 的id字段关联,如果不是和id字段关联可以使用targetFields属性进行关联
@TableField(value="school_id",target = School.class)
private Integer schoolId;
//如果是一对多的话使用ONE_TO_MANY并且指定targetClass
@TableField(relation = Relation.ONE_TO_ONE)
private School school;
}
```
```java
@Data
@TableName(value="school",autoResultMap = true) //这里设置自动生成resultMap 不需要别的操作
public class School {
@TableId
private Integer id;
@TableField("school_name")
private String schoolName;
@TableField("remark")
private String remark;
}
```
2、启动join插件(不然返回结果映射会有问题,此插件动态修改resultMap)
```java
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new JoinInterceptor());
return interceptor;
}
```
3、使用BasicJoinQueryWrapper (为po advance query预留的,不推荐开发者直接使用)
```java
BasicJoinQueryWrapper wrapper = new BasicJoinQueryWrapper<>(User.class);
wrapper.innerJoin(School.class);
wrapper.eq(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"),1);
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"));
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(User.class,"userId"));
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(User.class,"name"));
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(School.class,"schoolName"));
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(School.class,"id"));
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(School.class,"remark"));
mapper.selectList(wrapper);
```
po advance query写法 :
```java
new User().select(User.SCHOOLID,User.USERID,User.NAME).userId().eq(1).innerJoin(School.class).orgName().like("一").select(School.ID,School.REMARK,School.SCHOOLNAME).list();
```
需要mybatis-plus-advance 依赖:https://gitee.com/baomidou/mybatis-plus-advance
3、使用LambdaJoinQueryWrapper
```java
LambdaJoinQueryWrapper wrapper = new LambdaJoinQueryWrapper<>(User.class);
wrapper.eq(User::getSchoolId,1);
wrapper.innerJoin(School.class).like(School::getSchoolName,"一");
mapper.selectList(wrapper);
```
### 函数支持
改动:在query接口中添加了selectFun方法,支持用户使用函数来查询字段,目前各类wrapper实现均已支持此查询
```java
Children selectFun(BaseFuncEnum fun,R alias,R column)
```
1、po上添加接收函数返回的字段
```java
@TableField(exist = false,funField = true) //标记数据库不存在,并且是个函数字段
private Long schoolCount;
```
2、各类wrapper使用
```java
// QueryWrapper
new QueryWrapper().eq("school_id",2).select("school_id").selectFun(DefaultFuncEnum.COUNT,
"schoolCount").groupBy("school_id")
// LambdaQueryWrapper
new LambdaQueryWrapper().eq(User::getSchoolId,2)
.select(User::getSchoolId).selectFun(DefaultFuncEnum.COUNT,User::getSchoolCount).groupBy(User::getSchoolId)
// QueryChainWrapper
QueryChainWrapper wrapper = new QueryChainWrapper(mapper);
wrapper.eq("school_id",2).select("school_id").selectFun(DefaultFuncEnum.COUNT,
"schoolCount").groupBy("school_id").one()
// LambdaQueryChainWrapper
LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper(mapper);
wrapper.eq(User::getSchoolId,2) .select(User::getSchoolId).selectFun(DefaultFuncEnum.COUNT,User::getSchoolCount).groupBy(User::getSchoolId).one()
// BasicJoinQueryWrapper
BasicJoinQueryWrapper wrapper = new BasicJoinQueryWrapper<>(User.class);
wrapper.eq(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"),2);
wrapper.select(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"));
wrapper.selectFun(DefaultFuncEnum.COUNT,new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolCount"));
wrapper.groupBy(new BasicJoinQueryWrapper.ModelProperty(User.class,"schoolId"));
// LambdaJoinQueryWrapper
LambdaJoinQueryWrapper wrapper = new LambdaJoinQueryWrapper<>(User.class);
wrapper.eq(User::getSchoolId,2);
wrapper.select(User::getSchoolId);
wrapper.selectFun(DefaultFuncEnum.COUNT,User::getSchoolCount);
wrapper.groupBy(User::getSchoolId);
```
### 批量插入支持说明
1.目前已经支持的数据库有:mysql,oracle,postgresql,sqlserver
2.序列自增配置:
```java
/**
* Postgre 主键生成器
* @return
*/
@Bean
public IKeyGenerator keyGenerator() {
return new PostgreKeyGenerator(); // oracle和Postgre 序列生成主键都已经支持
}
/**
* 序列自增插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//需要依赖此拦截器
interceptor.addInnerInterceptor(new KeyGeneratorInterceptor());
return interceptor;
}
```
3.数据库类型配置(也可以配置到@tablename注解里,注解优先于全局配置)
```yaml
mybatis-plus:
global-config:
db-config:
# 数据库类型
db-type: mysql
```
### 批量修改支持说明
1.目前已经支持的数据库有:mysql,oracle,postgresql
2.已知问题-oracle返回的受影响行数不对
### 前端高级查询API
后端在参数中配置一个QueryFilter,QueryFilter 提供一个asWrapper方法可以把前端的过滤条件包装为一个QueryWrapper
````java
@PostMapping("list")
public List filter(@RequestBody QueryFilter filter){
//注意sex和age是安全字段,就算前端传了也不会拼接这2个字段的过滤条件。
return mapper.selectList(filter.asWrapper(User.class,"sex","age"));
}
````
前端按照指定格式传参,即可实现后端不做多余编程前端自由控制过滤条件的效果。
```json
{
"sorter":[{//排序支持ASC和DESC
"property":"userId",
"direction":"DESC"
}],
"querys":[{//过滤条件 where sex=男 and (name=张三 or name=李四 )
"property":"name", // po字段名
"operator":"=",//操作符
"value":"张三",//操作值
"relation":"OR",//关联关系AND OR
"group":"nameGroup"//相同的group 外层会加括号
},
{
"property":"name",
"operator":"=",
"value":"李四",
"relation":"OR",
"group":"nameGroup"
},{
"property":"sex", //使用了默认的关联关系AND 以及默认操作符 =
"value":"男"
}]
}
```
操作符支持:支持 = > >= < <= like like_l like_r not_like is_null not_null in not_in between not_between 等常见操作
如果是in 等操作 value支持数组传参
本功能暂定在https://gitee.com/baomidou/mybatis-plus-advance 包中