首页 > 作文

MybatisPlus使用queryWrapper如何实现复杂查询

更新时间:2023-04-04 13:39:26 阅读: 评论:0

目录
使用querywrapper实现复杂查询自定义的querywrapper实现查询声明提要核心代码

使用querywrapper实现复杂查询

//    mp实现负责查询操作    @test    public void testlectquery(){        //1,创建querywrapper对象        querywrapper<ur> wrapper = new querywrapper<>();//        2,通过querywrapper设置条件//        ge大于等于  gt大于  le小于等于 lt   eq等于  ne不等于  between  like模糊查询//        orderbydesc   last拼接//        查询age>=30的记录 第一个参数 字段的名字,第二个参数设置值        wrapper.ge("age",30);        list<ur> urs = urmapper.lectlist(wrapper);        system.out.println(urs);//        eq        wrapper.eq("name","tian");        list<ur> urs1 = urmapper.lectlist(wrapper);        system.out.println(urs1);        wrapper.ne("name","tian");        list<ur> urs2 = urmapper.班级奋斗目标lectlist(wrapper);        system.out.println(urs2);//        between//        查询年龄20-30        wrapper.between("age",20,30);        list<ur> urs3 = urmapper.lectlist(wrapper);        system.out.println(urs3);//        like        wrapper.like("tian","t");        list<ur> urs4 = urmapper.lectlist(wrapper);        system.out.println(urs4);//        orderbydesc        wrapper.orderbyasc("age");        list<ur> urs5 = urmapper.lectlist(wrapper);        system.out.println(urs5);//        last 拼接        wrapper.last("limit 1");        list<ur> urs6 = urmapper.lectlist(wrapper);        system.out.println(urs6);//        指定要查询的列        querywrapper<ur> lect = wrapper.lect("id", "name");    }

自定义的querywrapper实现查询

想要用querymapper,而不用xml,所以为了实现若依那样的,自己重写了querymapper

原有的mybatis的查询方法,例如查询一个用户,那么查询方法就传一个用户,然后在mapper.xml中对用户的各项属性进行判断,然后再拼接相应的sql语句,就可以一次性实现查询。虽然有mybatisx代码生成器,或者自己写代码生成器,但是多个表的话感觉还是有点不好用。所以,自己使用反射写了一个querywrapper的myalleq方法,可以实现传入一个实体类,直接实现全部属性查询

声明提要

package com.maoyan.quickdevelop.common.core.domain;import com.baomidou.mybatisplus.annotation.tablefield;import com.baomidou.mybatisplus.annotation.tableid;import com.baomidou.mybatisplus.annotation.tablename;import com.fasterxml.jackson.annotation.jsonformat;import com.maoyan.quickdevelop.common.core.domain.dqabstract.dqstatusdispo;import lombok.allargsconstructor;import lombok.data;import lombok.noargsconstructor;import javax.validation.constraints.email;import javax.validation.constraints.size;import java.io.rializable;import java.util.date;/** * @author 猫颜 * @date 2021/5/27 21:28 * 用户实体类 */@data@noargsconstructor@allargsconstructor@tablename(value = "dq_ur")public class dqur extends dqstatusdispo implements rializable {    private static final long rialversionuid = 1l;    /** 用户id */    /**     * 主键使用tableid注解,否则mybatisplus默认使用id来查询     */    @tableid(value = "ur_id")    private long urid;    /** 用户账号 */    @tablefield(value = "ur_name")    private string urname;    /** 用户昵称 */    @tablefield(value = "nick_name")    private string nickname;    /** 用户邮箱 */    @email(message = "邮箱格式不两生花结局正确")    @tablefield(value = "email")    private string email;    /** 手机号码 */    @size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")    @tablefield(value = "phone_number")    private string phonenumber;    /** 用户性别 0=男,1=女,2=未知*/    @tablefield(value = "x")    private string x;    /** 用户头像 */    @tablefield(value = "avatar")    private string avatar;    /** 密码 */    @tablefield(value = "password")    private string password;    /** 帐号状态(0正常 1停用) */    @tablefield(value = "status")    private string status;    /*周记怎么写初一* 删除标志(0代表存在 1代表删除,暂时没打算用) */    @tablefield(value = "delflag")    private string delflag;    /** 最后登录ip */    @tablefield(value = "loginip")    private string loginip;    /** 最后登录时间 */    @tablefield(value = "logindate")    private date logindate;    /** 用户角色id */    @tablefield(value = "role")    private string role;    /** 个性签名 **/    @tablefield(value = "signature")    private string signature;    /** 创建时间 */    @jsonformat(pattern = "yyyy-mm-dd hh:mm:ss")    private date createtime;    /** 更新时间 */    @jsonformat(pattern = "yyyy-mm-dd hh:mm:ss")    private date updatetime;}
我的用户实体类中,使用lombak,里面有rialversionuid。使用的是注解来映射数据库字段名

核心代码

    /**     * todo 自定义遍历查询方法     *     * @param object     * @return com.baomidou.mybatisplus.core.conditions.query.querywrapper<t>     * @author 猫颜     * @date 下午9:20     */    public querywrapper<t> myalleq(t object) throws illegalaccesxception,            nosuchmethodexception,            invocationtargetexception {  关于大雪的诗句      string getmethodname = "";        field field = null;        class<?> aclass = object.getclass();        field[] declaredfields = aclass.getdeclaredfields();//        querywrapper<t> querywrapper = new querywrapper<>();        //第一个为rialversionuid(舍去) i为1 绕过        //获取object的所有字段        for (int i = 1; i < declaredfields.length; i++) {            field = declaredfields[i];            //类中的成员变量为private,故必须进行此操            field.taccessible(true);//            不能直接获取到值,可以通过构造get方法,或者调用类的get方法来获取值//            通过stringutils的containsignoreca方法来获取方法名称//            通过上面那种方法,有循环嵌套,性能需要优化//            所以采取拼接get方法名/** * * @author 猫颜 * @date         //获取属性名称 *         for (field field: *              declaredfields) { *             system.out.println(field.getname()); *             methodnamefirst = field.getname().substring(0,1).toupperca(); *             methodname = field.getname(); *             methodname = "get"+methodnamefirst+methodname.substring(1); *             system.out.println("方法名称为:"+methodname); * * //            优化 *             system.out.pri电脑高清壁纸ntln("优化:"+"get"+field.getname().substring(0,1).toupperca()+field.getname().substring(1)); *         } 下午5:18 * @param object * @return com.baomidou.mybatisplus.core.conditions.query.querywrapper<t> *///获取get方法名称            getmethodname = "get" + declaredfields[i].getname().substring(0, 1).toupperca() + declaredfields[i].getname().substring(1);            system.out.println(getmethodname);//            执行get方法获取属性值            //执行方法            method method = aclass.getmethod(getmethodname, null);            object getvalue = method.invoke(object, null);            //system.out.println("输出为:"+invoke);//            system.out.println("优化:"+"get"+declaredfields[i].getname().substring(0,1).toupperca()+declaredfields[i].getname().substring(1));//            如果值不为空,则添加到eq中            if (getvalue != null) {                //映射关系//                return super.eq(,field.get(object));                //获取其注解的值//                后面可以采用查询方法注释来解决,不同的查询所需的问题                system.out.println("表的值:" + field.getannotation(tablefield.class).value());                system.out.println("get获取值:" + getvalue.tostring());                myquerywrapper.this.eq(field.getannotation(tablefield.class).value(), getvalue.tostring());            }        }        return myquerywrapper.this;    }

可以使用

        //获取所有的方法名称        //但是顺序是与类中的一样,所以可以构建get方法        //属性名称第一个大写,然后加上get就是,get方法名称        method[] methods = aclass.getmethods();        for (method method:             methods) {            system.out.println(method.getname());            if (stringutils.containsignoreca(method.getname(),"get")&&                    stringutils.containsignoreca(method.getname(),"urname")){                system.out.println("值为:"+method.getname());            }        }

stringutils.containsignoreca方法来获取get方法,但是会造成循环嵌套,对性能有一定的影响。

所以,我采用拼接get方法名称的方法,减少无用循环带来的影响。

根据上面的要点提示,for是从1开始,因为第一个是rialversionuid,所以为了跳过他。从1开始对于xml中,可以使用like等查询,我这个是适用于=查询,所以后续会通过在用户类的属性上加上自定义注解,来判断这个字段所用的查询方式,对于一个字段,有些地方想用=来查,有些地方想用like来查,那可以设定注解有优先等级来解决。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 13:39:24,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/e1c8d23942e62d4a4dcf268320815673.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:MybatisPlus使用queryWrapper如何实现复杂查询.doc

本文 PDF 下载地址:MybatisPlus使用queryWrapper如何实现复杂查询.pdf

标签:方法   用户   注解   第一个
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图