推薦:MyBatis Plus彙總
MyBatis-Plus allEq()的用法
首先建立一個資料庫表,如下圖所示:
然後建立一個Spring Boot項目,pom.xml和配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.kaven</groupId>
<artifactId>mybatis-plus</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
spring:
application:
name: mybatis-plus
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: ITkaven@123
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&useSSL=false
server:
port: 8085
logging:
level:
root: warn
com.kaven.mybatisplus.dao: trace
pattern:
console: '%p%m%n'
mybatis-plus:
mapper-locations: classpath:mappers/*.xml
實體類User:
package com.kaven.mybatisplus.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@TableName("user")
@Data
public class User {
@TableId
private String id;
@TableField("username")
private String username;
@TableField("password")
private String password;
@TableField("age")
private Integer age;
/**
* 使用 @TableField(exist = false) ,表示該字段在資料庫中不存在 ,是以不會插入資料庫中
* 使用 transient 、 static 修飾屬性也不會插入資料庫中
*/
@TableField(exist = false)
private String phone;
}
Mapper接口UserMapper:
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kaven.mybatisplus.entity.User;
import org.springframework.stereotype.Component;
@Component
public interface UserMapper extends BaseMapper<User> {}
啟動類:
package com.kaven.mybatisplus;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan(basePackages = "com.kaven.mybatisplus.dao")
public class AppRun {
public static void main(String[] args) {
SpringApplication.run(AppRun.class , args);
}
}
@MapperScan(basePackages = "com.kaven.mybatisplus.dao")
這個一定要加上。
我們先在資料庫中添加幾行資料,友善示範。
我們首先來看一看
allEq
的源碼:
/**
* ignore
*/
default <V> Children allEq(Map<R, V> params) {
return allEq(params, true);
}
/**
* ignore
*/
default <V> Children allEq(Map<R, V> params, boolean null2IsNull) {
return allEq(true, params, null2IsNull);
}
/**
* map 所有非空屬性等于 =
*
* @param condition 執行條件
* @param params map 類型的參數, key 是字段名, value 是字段值
* @param null2IsNull 是否參數為 null 自動執行 isNull 方法, false 則忽略這個字段\
* @return children
*/
<V> Children allEq(boolean condition, Map<R, V> params, boolean null2IsNull);
/**
* ignore
*/
default <V> Children allEq(BiPredicate<R, V> filter, Map<R, V> params) {
return allEq(filter, params, true);
}
/**
* ignore
*/
default <V> Children allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
return allEq(true, filter, params, null2IsNull);
}
/**
* 字段過濾接口,傳入多參數時允許對參數進行過濾
*
* @param condition 執行條件
* @param filter 傳回 true 來允許字段傳入比對條件中
* @param params map 類型的參數, key 是字段名, value 是字段值
* @param null2IsNull 是否參數為 null 自動執行 isNull 方法, false 則忽略這個字段
* @return children
*/
<V> Children allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull);
可以看到最多有
boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull
這四個參數。
-
:是否将該condition
語句(像sql
、in()
,以及這裡的 like()
)加在總allEq()
語句上,也就是執行條件。sql
-
: 過濾函數,是否允許字段傳入比對條件中。filter
-
: params
為資料庫字段名,key
為字段值。value
-
: 為null2IsNull
時,則在true
的map
為value
時調用 null
方法;為isNull
時,則忽略false
的map
為value
的鍵值對。null
先來示範一下
Map<R, V> params
參數的作用。
- 查詢
為username
,kaven
為age
。22
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kaven.mybatisplus.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperAllEqTest {
@Autowired
private UserMapper userMapper;
@Test
public void selectList(){
QueryWrapper<User> userQueryWrapper = Wrappers.query();
Map<String , Object> map = new HashMap<>();
map.put("username" , "kaven");
map.put("age" , 22);
userQueryWrapper.allEq(map);
List<User> userList = userMapper.selectList(userQueryWrapper);
}
}
結果如下:
查詢結果是正确的。
再來示範一下
boolean null2IsNull
參數的作用,它預設會是
true
。
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kaven.mybatisplus.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperAllEqTest {
@Autowired
private UserMapper userMapper;
@Test
public void selectList(){
QueryWrapper<User> userQueryWrapper = Wrappers.query();
Map<String , Object> map = new HashMap<>();
map.put("username" , "kaven");
map.put("age" , null);
userQueryWrapper.allEq(map , true);
List<User> userList = userMapper.selectList(userQueryWrapper);
}
}
結果如下:
結果也是正确的,因為沒有這樣的資料,大家看一看上圖的
sql
語句就知道了,
null2IsNull
為
true
時,則在
map
的
value
為
null
時調用
isNull
方法。
再來示範一下
null2IsNull
為
false
的情況。
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kaven.mybatisplus.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperAllEqTest {
@Autowired
private UserMapper userMapper;
@Test
public void selectList(){
QueryWrapper<User> userQueryWrapper = Wrappers.query();
Map<String , Object> map = new HashMap<>();
map.put("username" , null);
map.put("age" , null);
userQueryWrapper.allEq(map , false);
List<User> userList = userMapper.selectList(userQueryWrapper);
}
}
當
null2IsNull
為
false
時,其實上面代碼就是查詢所有
user
資料,因為鍵值對都被忽略掉了。如果此時
null2IsNull
為
true
,則會沒有一個比對的資料。
結果是正确的,當
null2IsNull
為
false
時,則忽略
map
中
value
為
null
的情況。
再來示範一下
BiPredicate<R, V> filter
參數的作用。
package com.kaven.mybatisplus.dao;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kaven.mybatisplus.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperAllEqTest {
@Autowired
private UserMapper userMapper;
@Test
public void selectList(){
QueryWrapper<User> userQueryWrapper = Wrappers.query();
Map<String , Object> map = new HashMap<>();
map.put("username" , null);
map.put("age" , 22);
map.put("password" , "1");
userQueryWrapper.allEq((k , v) -> !k.equals("password") , map , false);
List<User> userList = userMapper.selectList(userQueryWrapper);
}
}
看上面代碼很容易知道,
filter
參數我傳了一個
lambda
表達式,意思是
key
為
password
的鍵值對在查詢時會被忽略掉。
結果如下:
結果很顯然也是正确的。