MyBatis-Plus 通用IService使用时的一些方法领会,常用方法功能,另外LambdaQueryWrapper如何正确使用or或者and

zihao

普通方法:

 //查询所有
userService .list();
//根据查询条件查询一个返回实体类对象
userService.getOne(lambdaQueryWrapper);
//分页查询所有
userService.page(pageInfo,lambdaQueryWrapper);
//查询数量
userService .count();
//根据ID查list集合
userService .listByIds();
//根据ID删除
userService .removeById();
userService .removeByIds();
//修改
userService .update();
userMapper.updateById(实体类);
//新增
userService .save();
userMapper.insert(实体类);
//批量新增
userService .saveBatch(集合);

在jdbc连接url最后加上rewriteBatchedStatements=true,速度会提升巨大,原因详见https://blog.csdn.net/chengpei147/article/details/114969606

getOne(),这个是方法返回结果不止一条则会抛出异常,如果想默认取第一条结果,可以给这方法传第二个参数为false。

 User one = userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getAge, 11),false);

saveOrUpdateBatch(),批量新增或者修改方法,判断ID是否存在,如果ID不存在执行新增,如果ID存在先执行查询语句,查询结果为空新增,否则修改。

boolean b = userService.saveOrUpdateBatch(users);

QueryWrapper 和UpdateWrapper的区别:

QueryWrapper 是修改的时候给的条件,例如:

/**
 * lambda链式编程
 */
@Test
public void test88(){
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.lambda()
            .between(User::getAge,30,60)
            .orderByDesc(User::getId);
    List<User> list = userService.list(queryWrapper);
    list.forEach(System.out::println);
}

UpdateWrapper是查询时候给条件,例如

/**
 * 测试链式编程更新操作
 */
@Test
public void test99(){
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.lambda()
            .le(User::getAge, 30)
            .setSql("email = 'le30@duck.top'");
    userService.update(updateWrapper);
}

LambdaQueryWrapper和LambdaUpdateWrapper的区别:

LambdaQueryWrapper是查询时候给条件,例如

@Test
public void test88(){
    String xxx = apiTest2Project.getDetailId();
    String qqq = apiTest2Project.getGroupId();
    LambdaQueryWrapper<ApiTest2Project> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(ApiTest2Project::getDetailId,xxx );
    lambdaQueryWrapper.eq(ApiTest2Project::getGroupId,qqq);
    int count = apiTest2ProjectService.count(lambdaQueryWrapper);
}

LambdaUpdateWrapper是修改的时候给的条件,例如:

@Test
public void test99(){
    String xxx = apiTest2Project.getDetailId();
    String qqq = apiTest2Project.getGroupId();
    LambdaUpdateWrapper<ApiTest2Project> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.eq(ApiTest2Project::getDetailId,xxx );
    lambdaUpdateWrapper.eq(ApiTest2Project::getGroupId,qqq );
    apiTest2ProjectService.update(apiTest2Project,lambdaQueryWrapper);
}

方法中 eq、ne、gt、lt、ge、le分别代表含义:

.eq 就是 equal等于
.ne 就是 not equal不等于
.gt 就是 greater than大于
.lt 就是 less than小于
.ge 就是 greater than or equal 大于等于
.le 就是 less than or equal 小于等于
.in 就是 in 包含(数组)
.isNull 就是 等于null
.between 就是 在2个条件之间(包括边界值)
.like 就是 模糊查询
在这里插入图片描述

or或者and怎么使用

例子1:
LambdaQueryWrapper<SysUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.or((wrapper)->{
	wrapper.eq(SysUser::getUserName, idUserPayBalUserName).or();
	wrapper.eq(SysUser::getPhonenumber, idUserPayBalUserName);
	});
lambdaQueryWrapper.and((wrapper)->{
	wrapper.eq(SysUser::getNickName, idUserPayBalName);
		}
			);
SysUser one = userService.getOne(lambdaQueryWrapper);

sql语句为

SELECT *
 FROM sys_user
 WHERE ((user_name = '15666666669' OR phonenumber = '15666666669') AND (nick_name = '15666666669'));

也就是说,使用or()包裹的代码执行后是在sql语句的括号内,再次使用or()或者and()则另起一个括号.

例子2:
LambdaQueryWrapper<SysUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
	lambdaQueryWrapper.eq(SysUser::getUserName, idUserPayBalUserName).or();
	lambdaQueryWrapper.eq(SysUser::getPhonenumber, idUserPayBalUserName);
	lambdaQueryWrapper.eq(SysUser::getNickName, idUserPayBalName);
	SysUser one = userService.getOne(lambdaQueryWrapper);
SELECT *
 FROM sys_user
 WHERE (user_name = '15666666669' OR phonenumber = '15666666669' AND nick_name = '123');

可以理解为如下这个语句👇,所以这个sql和上面的例子的sql执行后的结果是完全不一样的.

SELECT *
 FROM sys_user
 WHERE (user_name = '15666666669' OR (phonenumber = '15666666669' AND nick_name = '123'));

如果sql语句后面想补充一句sql语句应该怎么办?用last

lambdaQueryWrapper.last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY");

注意这个自定义慎用,会有sql注入的风险

如果sql查询条件全部都想自定义怎么办?

lambdaQueryWrapper.apply("YEAR(tijiao_time) = {0}",year);

注意这个自定义慎用,会有sql注入的风险

如果传值为null的时候不查询,有值才查询怎么做?

这里用到了hutool的ObjectUtil.isNotEmpty来判非空

//查询时间范围
LambdaQueryWrapper<ProductKhtm> productKhtmLambdaQueryWrapper = new LambdaQueryWrapper<>();
productKhtmLambdaQueryWrapper.between(
ObjectUtil.isNotEmpty(productKhtmhz.getParams().get("endDbilldate")),
ProductKhtm::getDbilldate,
productKhtmhz.getParams().get("beginDbilldate"),
productKhtmhz.getParams().get("endDbilldate")
);

productKhtmService.list(productKhtmLambdaQueryWrapper);

本文部分来源1
本文部分来源2
本文部分来源3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值