MyBatisPlus——条件构造器

本文介绍了MyBatisPlus中的条件构造器,包括如何使用select方法指定查询字段,以及如何根据条件更新数据。在更新操作中,通过QueryWrapper创建条件构造器,结合eq方法设置查询条件。注意,构造SQL时需使用数据库字段名而非实体类属性名。错误示例中强调了未正确处理ID导致的问题。同时,QueryWrapper支持多条件组合查询。

>MyBatisPlus——条件构造器之select

在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段

细节
在这里插入图片描述
使用select进行sql语句拼接时,不会识别在实体类中属性对应的操作。
在这里插入图片描述
当数据库表中的字段名与实体类对象属性名不一致时
在这里插入图片描述
在这里插入图片描述

>Mybatis-Plus根据条件更新(条件构造器)

在 Mybatis-Plus 项目中,很多时候需要根据条件更新特定的数据行,这时候可以使用到提供的 update() 方法。

下面以 PostCategories 对象为例简单演示下使用的方法。
1、创建对象并填入要更新的字段数据
例如更新 homePage 字段值为 false

PostCategories updateMessage = new PostCategories();
updateMessage.setHomePage(false);

2、创建条件构造器和查询条件
new QueryWrapper() 为条件构造器;

eq(“homePage”, true) 即是查询条件: where homePage = true,条件根据需要添加。

postCategoriesMapper.update(updateMessage, new QueryWrapper<PostCategories>().eq("homePage", true));

3、查看打印的sql语句
略
这样就达到了条件更新的目的。
特别注意:
1.使用这种方式,会覆盖掉原本update方法的特性,比如自动根据ID比对数据进行修改,这里一定注意加上ID判断(该有的所有判断),具体请看错误实例一:
2.传进条件构造器里边的column(字段名字),是数据库里边的字段名字,就是这个传进条件构造器里的字段名字,会被直接拼接到SQL里边,如果写实体类名字,就会报错,具体看错误实例二:

4.错误的实例:
这里没有在条件构造器里塞入 id值 判断 , 如此以来,mybatisPlus就不会在条件的地方拼接 id判断

 @Override
    public int update(AlarmInformVO vo) {
        AlarmInform alarmInform = voToEntity(vo);
        int i = alarmInformMapper.update(alarmInform,
                new QueryWrapper<AlarmInform>().eq("valid", 0));
        return i;
    }

    private AlarmInform voToEntity(AlarmInformVO vo){
        AlarmInform alarmInform = new AlarmInform();
        BeanUtils.copyProperties(vo,alarmInform);
        return alarmInform;
    }

在这里插入图片描述
5.正确的实例一

@Override
    public int update(AlarmInformVO vo) {
        AlarmInform alarmInform = voToEntity(vo);
        QueryWrapper<AlarmInform> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id",vo.getId());
        queryWrapper.eq("valid", 0);
        int i = alarmInformMapper.update(alarmInform,queryWrapper);
        return i;
    }

在这里插入图片描述
对! 条件构造器QueryWrapper是可以点拼多个条件的,尽情往后点,往后加就可以了
6.错误实例二
column 里边的参数,K值是数据库中的字段名,不是实体类中的变量名,这一点要注意!!!
在这里插入图片描述
7.正确的实例

@Override
    public AlarmDisposeVO findById(Long id) {
        // 查询报警通知信息
        AlarmInform alarmInform = alarmInformService.findById(id);
        AlarmInformVO alarmInformVO = new AlarmInformVO();
        try {
            if (alarmInform != null) BeanUtils.copyProperties(alarmInform,alarmInformVO,new String[]{"startdTime","endTime"});
        } catch (BeansException e) {
            logger.error("alarmInform 拷贝失败,程序错误!!" + alarmInform);
        }
        QueryWrapper<AlarmDispose> alarmDisposeQueryWrapper = new QueryWrapper<>();
        // 重点在这里!!!
        alarmDisposeQueryWrapper.eq("alarm_inform_id",id).eq("valid",0);
        AlarmDispose alarmDispose = alarmDisposeMapper.selectOne(alarmDisposeQueryWrapper);
        AlarmDisposeVO alarmDisposeVO = new AlarmDisposeVO();
        try {
            if (alarmDispose !=null) BeanUtils.copyProperties(alarmDispose,alarmDisposeVO,new String[]{"alarmInformVO"});
        } catch (Exception e) {
            logger.error("alarmDispose 拷贝失败,程序错误!!" +alarmDispose);
        }
        alarmDisposeVO.setAlarmInformVO(alarmInformVO);
        return alarmDisposeVO;
    }

>Mybatis-plus使用QueryWrapper

按照惯例先奉上mybatis plus官方文档的链接https://baomidou.com/pages/10c804/,有精力的可以进去学习一下。

queryWrapper是mybatis plus中实现查询的对象封装操作类

先看一下QueryWrapper的方法

函数名说明例子
eq等于 =例:eq(“name”,“张三”) :name = ‘张三’
ne不等于<>例: eq(“name”,“老王”)—>name <> ‘老王’
gt大于>例:gt(“age”,18)—>age > 18
ge大于等于>=例:ge(“age”,18)—>age >= 18
lt小于<例:lt(“age”,18)—>age < 18
le小于<=例:le(“age”,18)—>age <= 18
betweenBETWEEN值1 AND值2例:between(“age”,18,30)—>age between 18 and 30
notBetweenNOT BETWEEN值1 AND值2例: notBetween(“age”,18,30)—>age not between 18 and 30
likeLIKE ‘%值%’例: like(“name”,“王”)—–>name like '%王%’
notLikeNOT LIKE ‘%值%’例: notLike (“name”,“王”)—>name not like '%王%’
likeLeftLIKE '%值’例:likeLeft (“name”,“王”)—–>name like '%王’
likeRightLIKE’值%’例: likeRight(“name”,“王”)—>name like ‘王%’
isNull字段IS NULL例: isNul1 (“name”)—>name is null
isNotNull字段IS NOT NULL例: isNotNull(“name”)—>name is not null
in字段IN (v0, v1,…)例: in(“age”,{1,2,3} )—–>age in (1,2,3)
notIn字段NOT IN (v0, v1,…)例: notIn(“age”,1,2,3)—>age not in (1,2,3)
inSql字段IN ( sql语句)inSql(“id”, “select id from table where id < 3”) —–>id in (select id from table where id < 3)
notInSql字段NOT IN ( sql语句)notInSql(“id”, “select id from table where id < 3”) —–>age not in (select id from table where id < 3)
groupBy分组:GROUP BY 字段,…例: groupBy(“id”, “name”)—>group by id, name
orderByAsc排序:ORDER BY字段,… ASC例: orderByAsc(“id”, “name”)—>order by id ASC, name ASC
orderByDesc排序:ORDER BY 字段,…DESC例: orderByDesc(“id”, “name”)—>order by id DESC, name DESC
orderBy排序:ORDER BY字段,…例: orderBy(true,true,“id”,“name”)—–>order by id ASC, name ASC
havingHAVING ( sql语句)having(“sum(age) >{0}”,11)—>having sum(age) > 11
or拼接OR主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接)例:eq(“id”,1).or().eq(“name”,“老王”)—>id = 1 or name = '老王
andAND嵌套例: and(i -> i.eq(“name”,“李白”).ne(“status”,“活着”))—>and (name ='李白’ and status ’活着’)
apply拼接sql该方法可用于数据库函数动态入参的params对应前面sqlHaving内部的{index}部分.这样是不会有sql注入风险的,反之会有! 例: apply(“date_format(dateColumn, ‘%Y一%m-%d’) ={0}”, “2008-08-08”)—>date_format(dateColumn,’%Y一%m-%d’) = ‘2008-08-08’")
last无视优化规则直接拼接到sql 的最后无视优化规则直接拼接到sql 的最后只能调用一次,多次调用以最后一次为准有sql注入的风险,请谨慎使用例: last(“limit 1”)
exists拼接EXISTS ( sql语句)—>exists (select id from table where age = 1)例: notExists(“select id from table where age = 1”) —>exists (select id from table where age = 1)
notExists拼接NOT EXISTS ( sql语句)例: notExists(“select id from table where age = 1”)—–>not exists (select id from table where age = 1)
nested正常嵌套不带AND或者 OR正常嵌套不带AND或者OR例: nested(i -> i.eq(“name”,“李白”).ne(“status”,“活着”))—>(name = '李白’and status 活着’)

使用时先实例化QueryWrapper类,得到对象

QueryWrapper<Entity> queryWrapper = new QueryWrapper<>();
/**
*查询entity实体类对应的test_01字段为‘张三’
*如:select * from tableName where test_01 = '张三'
*/
queryWrapper.eq("test_01","张三");
// 查询 fillingcard_date 字段中时间小于等于 endDate 的时间
queryWrapper.le("endTime",endDate);
// 查询 fillingcard_date 字段中大于等于 startDate 的时间
queryWrapper.ge("startTime",startDate);
// 模糊查询 card_source 字段中 cardSource 的值
queryWrapper.like("card_source",cardSource);
----------------------------------------------
//以上queryWrapper的查询方法都是and条件关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值