<!--mybatis-plus-->
<mybatis-plus-boot-starter.version>3.4.1</mybatis-plus-boot-starter.version>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
1.1.2、我的项目依赖
1.1.2.1、主项目
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.healerjean.proj</groupId>
<artifactId>hlj-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hlj-parent</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.4</lombok.version>
<!--swagger 版本-->
<swagger.version>2.7.0</swagger.version>
<!--数据源 注意提高下面的版本,否则不支持LocalDate-->
<com-alibaba-druid.version>1.1.9</com-alibaba-druid.version>
<!--mybatis plus-->
<mybatis-plus-boot-starter.version>3.4.1</mybatis-plus-boot-starter.version>
</properties>
<modules>
<module>hlj-client</module>
</modules>
<dependencyManagement>
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${com-alibaba-druid.version}</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-starter.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.1.2.2、子工程
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.healerjean.proj</groupId>
<artifactId>hlj-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.healerjean.proj
</groupId>
<artifactId>hlj-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hlj-client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.9.RELEASE</version>
<scope>text</scope>
</dependency>
<!-- Jackson jsonUtils-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<exclusions>
<exclusion>
<artifactId>jackson-annotations</artifactId>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!-- 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--StringUtils-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId
>commons-lang3</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2、配置文件
1.2.1、application.properties
spring.application.name=hlj-mybatis-plus
spring.profiles.active=local
####################################
### DB
####################################
#durid
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.initialSize=5
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
# 本大爷啥也没配
# 配置 mybatis的一些配置,也可以在 application.properties 中配置,如果配置了就不需要了mybatis.xml
#mybatis-plus.config-location=classpath:mybatis.xml
#Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)
#mybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.type-aliases-package=com.healerjean.proj.data.entity
##主键类型 0:"数据库ID自增,非常大", 1:"用户输入ID(如果用户不输入,则默认是0)",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
mybatis-plus.id-type: 0
/** mybatis-plus如果希望使用数据库自增 */
// @TableId(value = "id", type = IdType.AUTO)
//private Long id;
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" (默认2)
mybatis-plus.field-strategy: 2
#数据库大写下划线转换
mybatis-plus.capital-mode: true
mybatis-plus.refresh-mapper: true
1.2.2、application-local.properties
server.port=8888
####################################
### DB
####################################
spring.datasource.druid.url=jdbc:mysql://localhost:3306/hlj_mybatis_plus?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
####################################
1.2.3、MybatisPlusConfiguration
* mybatisPlusInterceptor
* @author zhangyujin
* @date 2023/6/15 11:54.
@Slf4j
@MapperScan("com.healerjean.proj.data.mapper")
@Configuration
public class MybatisPlusConfiguration {
* MyBatis支持
* @return MybatisPlusInterceptor
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
long t1 = System.currentTimeMillis();
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
long t2 = System.currentTimeMillis();
log.info("MybatisPlusInterceptor injected! times:{}ms", t2 - t1);
return interceptor;
1.3、数据库语句
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1.4、Mapper
扫描配置
两种方式,一种是每个mapper上使用注解@Mapper
另一种如下 ,全局配置
@Configuration
@MapperScan("com.healerjean.proj.data.mapper")
public class MybatisPlusConfig {
1.4、User
实体类
package com.healerjean.proj.data.entity;
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
1.5、Mapper
类
package com.healerjean.proj.data.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.healerjean.proj.data.entity.User;
public interface UserMapper extends BaseMapper<User> {
1.6、测试
@RestController
@RequestMapping("hlj/user")
@Api(description = "用户管理")
@Slf4j
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping(value = "selectById", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public ResponseBean selectById(UserDTO userDTO) {
User user = userMapper.selectById(userDTO.getId());
log.info("用户管理--------selectById:【{}】", JsonUtils.toJsonString(user));
return ResponseBean.buildSuccess(user);
测试结果:
http://127.0.0.1:8888/hlj/user/selectById?id=1235553744515612673
"success": true,
"result": {
"id": 1235553744515612700,
"name": "healer",
"age": 22,
"email": "22"
"msg": "",
"code": 200,
"date": "1583469689318"
2、 Wrapper
对象
2.1、QueryWrapper
继承自 ·AbstractWrapper
,自身的内部属性 entity
也用于生成 where
条件 及 LambdaQueryWrapper
,
2.1.1.1、Wrappers.<User>lambdaQuery()
LambdaQueryWrapper<User> userWrapper = Wrappers.<User>lambdaQuery()
.eq(StringUtils.isNotBlank(query.getName()), UserDemo::getName, query.getName())
List<User> users = userMapper.selectList(userWrapper);
System
.out.println(JsonUtils.toJsonString(users));
2.1.1.2、Wrappers.lambdaQuery(User.class)
LambdaQueryWrapper<User> userWrapper = Wrappers.lambdaQuery(User.class)
.eq(StringUtils.isNotBlank(query.getName()), UserDemo::getName, query.getName())
List<User> users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
2.1.1.3、new QueryWrapper<User>().lambda()
LambdaQueryWrapper<User> userWrapper = new QueryWrapper<User>().lambda()
.eq(StringUtils.isNotBlank(query.getName()), UserDemo::getName, query.getName())
List<User> users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
2.1.1.4、new QueryWrapper<UserDemo>()
public Page<UserDemo> queryUserDemoPage(PageQueryBO<UserDemoQueryBO> pageQuery) {
UserDemoQueryBO query = pageQuery.getData();
QueryWrapper<UserDemo> queryWrapper = new QueryWrapper<>();
if (!CollectionUtils.isEmpty(query.getSelectFields())) {
queryWrapper.select(StringUtils.join(query.getSelectFields(), ","));
if (!CollectionUtils.isEmpty(query.getOrderByList())) {
query.getOrderByList().forEach(item -> queryWrapper.orderBy(Boolean.TRUE,
item.getDirection(),
item.getProperty()));
LambdaQueryWrapper<UserDemo> lambdaQueryWrapper = queryWrapper.lambda()
.eq(Objects.nonNull(query.getId()), UserDemo::getId, query.getId())
.eq(StringUtils.isNotBlank(query.getEmail()), UserDemo::getEmail, query.getEmail())
Page<UserDemo> page = new Page<>(pageQuery.getCurrPage(), pageQuery.getPageSize(),
pageQuery.getSearchCountFlag());
return userDemoDao.page(page, lambdaQueryWrapper);
2.1.2、select
:设置查询字段
分法为两类.第二类方法为:过滤查询字段(主键除外),入参不包含 class 的调用前需要wrapper
内的entity
属性有值!
这两类方法重复调用以最后一次为准
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
select("id", "name", "age")
select(i -> i.getProperty().startsWith("test"))
QueryWrapper<SysDistrict> queryWrapper = new QueryWrapper();
queryWrapper.select("distinct province_code, province_name")
.lambda()
.eq(SysDistrict::getProvinceCode, provinceCode)
.eq(SysDistrict::getStatus, StatusEnum.EFFECT.getCode());
SysDistrict sysDistrict = publicSysDistrictDao.selectOne(queryWrapper);
package com.jd.merchant.business.platform.core.dao;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import java.util.List;
import java.util.function.Predicate;
* MybatisPlusUtil
* @author zhangyujin
* @date 2023/6/5 15:23.
public class MybatisPlusUtil {
* fieldValues
* @param fieldValues fieldValues
* @param queryWrapper queryWrapper
* @param aClass aClass
* @param <T> <T>
public static <T> void fieldValues(List<String> fieldValues,
LambdaQueryWrapper<T> queryWrapper,
Class<T> aClass) {
if (CollectionUtils.isEmpty(fieldValues)) {
return;
Predicate<TableFieldInfo> predicate = null;
for (String field : fieldValues) {
predicate = predicate == null ? p -> p.getColumn().equals(field) : predicate.or(p -> p.getColumn().equals(field));
queryWrapper.select(aClass, predicate);
2.2、UpdateWrapper、LambdaUpdateChainWrapper
继承自 AbstractWrapper
,自身的内部属性 entity
、也用于生成 where
条件(主要是这个功能)
及 LambdaUpdateWrapper
, LambdaUpdateChainWrapper
可以通过 new UpdateWrapper().lambda()
方法获取!
2.2.1、UpdateWrapper
Wrapper<UserDemo> updateWrapper = Wrappers.lambdaUpdate(UserDemo.class)
.eq(Objects.nonNull(userDemo.getId()), UserDemo::getId, userDemo.getId())
.set(Objects.nonNull(userDemo.getEndTime()), UserDemo::getEndTime, userDemo.getEndTime());
return userDemoDao.update(updateWrapper);
Wrapper<BPrizeVenderDetail> updateWrapper = new UpdateWrapper<BPrizeVenderDetail>().lambda()
.set(BPrizeVenderDetail::getStatus, status).
eq(BPrizeVenderDetail::getBenefitsId, benefitsId);
return bPrizeVenderDetailDao.update(updateWrapper);
* userMapper.updateById(user); //根据Id更新
* userLambdaUpdateChainWrapper.update(); //条件更新
@Test
public void update(){
User user = userMapper.selectById(1L);
Wrapper userWrapper = new UpdateWrapper<User>().lambda()
.set(User::getEmail, "[email protected]")
.setSql("age = 24").eq(User::getId, user.getId())
.eq(User::getId, 2L);
user.setName("jjjjjk"); //会生效
user.setEmail("66666"); //不会生效 以updateWrapper里面的为主
//一般不用这二者的结合,毫无意义,写出来的sql也很有可能是错误的
userMapper.update(user, userWrapper);
//使用下面这两个
userMapper.updateById(user);
LambdaUpdateChainWrapper<User> userLambdaUpdateChainWrapper = new LambdaUpdateChainWrapper<>(userMapper)
.set(User::getName,"Name")
.set(User::getEmail, "[email protected]")
.eq(User::getId, 1L);
//一般我们使用这个非常好
userLambdaUpdateChainWrapper.update();
user.setAge(63); //会生效,
user.setEmail("66666"); //不会生效 以userLambdaUpdateChainWrapper里面的为主
//使用下面这个其实也毫无意义
userLambdaUpdateChainWrapper.update(user);
2.2.1、set
:SET 字段
set(String column, Object val)
set(boolean condition, String column, Object val)
例: set("name", "老李头")
例: set("name", "")--->数据库字段值变为空字符串
例: set("name", null)--->数据库字段值变为null
2.2.2、setSql
:设置 SET 部分 SQL
setSql(String sql)
例: setSql("name = '老李头'")
3、Wrapper方法的的使用
3.1、eq
:等于 =
eq(R column, Object val)
eq(boolean condition, R column, Object val)
Wrapper<User> userWrapper = new QueryWrapper<User>().lambda()
.eq(User::getName, userDTO.getName());
List<User> users = userMapper.selectList(userWrapper);
//只有一个条件,如果并且不成立则查询书所有的数据
userWrapper = new QueryWrapper<User>().lambda().
eq(StringUtils.isNotBlank(userDTO.getName()), User::getName, userDTO.getName());
List<User> users = userMapper.selectList(userWrapper);
3.2、ne
:不等于 <>
ne(R column, Object val)
ne(boolean condition, R column, Object val)
例: ne("name", "老王")--->name <> '老王'
3.3、gt
:大于 >
gt(R column, Object val)
gt(boolean condition, R column, Object val)
例: gt("age", 18)--->age > 18
3.4、ge
:大于等于 >=
lt(R column, Object val)
lt(boolean condition, R column, Object val)
ge("age", 18)--->age >= 18
le(boolean condition, R column, Object val)
例: le("age", 18)--->age <= 18
3.7、between
:ETWEEN 值1 AND 值2
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
例: between("age", 18, 30)--->age between 18 and 30
3.8、notBetween
:NOT BETWEEN 值1 AND 值2
notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
例: notBetween("age", 18, 30)--->age not between 18 and 30
3.9、like
:LIKE ‘%值%’
like(R column, Object val)
like(boolean condition, R column, Object val)
例: like("name", "王")--->name like '%王%'
3.10、notLike
:NOT LIKE ‘%值%’
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
例:
notLike("name", "王")--->name not like '%王%'
3.11、likeLeft
:LIKE ‘%值’
likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
例: likeLeft("name", "王")--->name like '%王'
3.12、likeRight
:LIKE ‘值%’
likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
例: likeRight("name", "王")--->name like '王%'
3.13、isNull
:字段 IS NULL
isNull(R column)
isNull(boolean condition, R column)
例: isNull("name")--->name is null
3.14、isNotNull
:字段 IS NOT NULL
isNotNull(R column)
isNotNull(boolean condition, R column)
例: isNotNull("name")--->name is not null
3.15、in
:字段 IN
in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
例: in("age",{1,2,3})--->age in (1,2,3)
in(R column, Object... values)
in(boolean condition, R column, Object... values)
例: in("age", 1, 2, 3)--->age in (1,2,3)
@Test
public void in() {
Wrapper<User> userWrapper = null;
List<User> users = null;
userWrapper = Wrappers.<User>lambdaQuery().in(User::getAge, 20, 18);
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
List<Integer> integers = new ArrayList<>();
integers.add(18);
integers.add(20);
userWrapper = Wrappers.<User>lambdaQuery().in(User::getAge, integers);
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
3.16、notIn
:字段 IN (value.get(0), value.get(1), …)
notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)
例: notIn("age",{1,2,3})--->age not in (1,2,3)
notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)
例: notIn("age", 1, 2, 3)--->age not in (1,2,3)
3.17、inSql
:字段 IN ( sql语句 )
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3)
@Test
public void inSql() {
Wrapper<User> userWrapper = null;
List<User> users = null;
userWrapper = Wrappers.<User>lambdaQuery()
.inSql(User::getAge, "select age from user where name = 'healer' ");
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
3.18、notInSql
:字段 NOT IN ( sql语句 )
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)
例: notInSql("id", "select id from table where id < 3")
--->age not in (select id from table where id < 3)
3.19、groupBy
:分组:GROUP BY 字段, .
groupBy(R... columns)
groupBy(boolean condition, R... columns)
例: groupBy("id", "name")
--->group by id,name
@Test
public void groupBy() {
Wrapper<User> userWrapper = null;
List<User> users = null;
//这样会报错,肯定的啊,我们是分组
// userWrapper = Wrappers.<User>lambdaQuery().groupBy(User::getAge);
userWrapper = Wrappers.<User>lambdaQuery().select(User::getAge).groupBy(User::getAge).having("age = {0}", 18);
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
3.20、orderBy/orderByAsc
:ORDER BY 字段, … ASC
orderBy(boolean condition, boolean isAsc, R... columns)
orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)
例: orderByAsc("id", "name")
--->order by id ASC,name ASC
3.21、orderByDesc
:排序:ORDER BY 字段, … DESC
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)
例: orderByDesc("id", "name")--->order by id DESC,name DESC
3.22、having
:HAVING ( sql语句 )
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)
例: having("sum(age) > {0}", 11)--->having sum(age) > 1
@Test
public void groupBy() {
Wrapper<User> userWrapper = null;
List<User> users = null;
//这样会报错,肯定的啊,我们是分组
// userWrapper = Wrappers.<User>lambdaQuery().groupBy(User::getAge);
userWrapper = Wrappers.<User>lambdaQuery().select(User::getAge).groupBy(User::getAge).having("age = {0}", 18);
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
3.23、or
:拼接 OR
注意事项:主动调用or
表示紧接着下一个方法不是用and
连接!(不调用or
则默认为使用and
连接)
or()
or(boolean condition)
例: `eq("id",1).or().eq("name","老王")`--->`id = 1 or name = '老王'`
3.23.1、OR
嵌套
例: or(i -> i.eq("name", "李白")
.ne("status", "活着"))
--->or (name = '李白' and status <> '活着')
@Test
public void or() {
Wrapper<User> userWrapper = null;
List<User> users = null;
userWrapper = Wrappers.<User>lambdaQuery()
.and(userLambdaQueryWrapper -> userLambdaQueryWrapper
.eq(User::getAge, 20)
.eq(User::getAge, 20))
.or().eq(User::getName, "healer");
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
SELECT id,name,age,email FROM user WHERE ((age = ? AND age = ?) OR name = ?)
3.24、and
:默认为and
and(Consumer<Param> consumer)
and(boolean condition, Consumer<Param> consumer)
3.24.1、and
嵌套
例: and(i -> i.eq("name", "李白")
.ne("status", "活着"))
--->and (name = '李白' and status <> '活着')
3.25、nested
:正常嵌套 不带 AND 或者 OR
默认都是自动加and
nested(Consumer<Param> consumer)
nested(boolean condition, Consumer<Param> consumer)
例: nested(i -> i.eq("name", "李白").ne("status", "活着"))
--->(name = '李白' and status <> '活着')
@Test
public void or() {
Wrapper<User> userWrapper = null;
List<User> users = null;
userWrapper = Wrappers.<User>lambdaQuery()
.or().eq(User::getName, "healer")
.nested(wapper -> wapper.eq(User::getAge, 21 ).eq(User::getAge, 32));
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
SELECT id,name,age,email FROM user WHERE
((age = ? AND age = ?) OR name = ? AND (age = ? AND age = ?))
3.26、apply
:拼接 sql
该方法可用于数据库函数 动态入参的params
对应前面applySql
内部的{index}
部分.这样是不会有sql注入风险的,反之会有!
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
例: apply("id = 1")--->id = 1
例: apply("date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
例: apply("date_format(dateColumn,'%Y-%m-%d') = {0}", "2008-08-08")
--->date_format(dateColumn,'%Y-%m-%d') = '2008-08-08'")
@Test
public void apply() {
Wrapper<User> userWrapper = null;
List<User> users = null;
userWrapper = Wrappers.<User>lambdaQuery().eq(User::getAge, 22).apply("name = 'healer'");
users = userMapper.selectList(userWrapper);
System.out.println(JsonUtils.toJsonString(users));
SELECT id,name,age,email FROM user WHERE (age = ? AND name = 'healer')
LambdaQueryWrapper<SystemHelpDoc> queryWrapper = Wrappers.lambdaQuery(SystemHelpDoc.class)
.like(StringUtils.isNotBlank(queryBo.getTitle()), SystemHelpDoc::getTitle, queryBo.getTitle())
.in(CollectionUtils.isNotEmpty(queryBo.getIds()), SystemHelpDoc::getId, queryBo.getIds())
.eq(Objects.nonNull(queryBo.getStatus()), SystemHelpDoc::getStatus, queryBo.getStatus());
if (StringUtils.isNotBlank(queryBo.getUserTypes())) {
String[] userTypes = queryBo.getUserTypes().split(",");
for (String userType : userTypes) {
String applySql = "find_in_set(?, user_types)";
queryWrapper.apply(StringUtils.isNotBlank(queryBo.getUserTypes()), applySql, userType);
queryWrapper.orderByDesc(SystemHelpDoc::getModifiedTime);
3.27、last
:无视优化规则直接拼接到 sql 的最后
只能调用一次,多次调用以最后一次为准 有sql注入的风险,请谨慎使用
last(String lastSql)
last(boolean condition, String lastSql)
例: last("limit 1")
3.28、exists
:拼接 EXISTS ( sql语句 )