欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢

 更新時(shí)間:2022年01月11日 10:04:36   作者:程序小白__向陽(yáng)  
這篇文章主要介紹了MybatisPlus使用queryWrapper如何實(shí)現(xiàn)復(fù)雜查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

使用queryWrapper實(shí)現(xiàn)復(fù)雜查詢

//    mp實(shí)現(xiàn)負(fù)責(zé)查詢操作
    @Test
    public void testSelectQuery(){
        //1,創(chuàng)建QueryWrapper對(duì)象
        QueryWrapper<User> wrapper = new QueryWrapper<>();
//        2,通過(guò)QueryWrapper設(shè)置條件
//        ge大于等于  gt大于  le小于等于 lt   eq等于  ne不等于  between  like模糊查詢
//        orderByDesc   last拼接
//        查詢age>=30的記錄 第一個(gè)參數(shù) 字段的名字,第二個(gè)參數(shù)設(shè)置值
        wrapper.ge("age",30);
        List<User> users = userMapper.selectList(wrapper);
        System.out.println(users);
//        eq
        wrapper.eq("name","Tian");
        List<User> users1 = userMapper.selectList(wrapper);
        System.out.println(users1);
        wrapper.ne("name","Tian");
        List<User> users2 = userMapper.selectList(wrapper);
        System.out.println(users2);
//        between
//        查詢年齡20-30
        wrapper.between("age",20,30);
        List<User> users3 = userMapper.selectList(wrapper);
        System.out.println(users3);
//        like
        wrapper.like("Tian","T");
        List<User> users4 = userMapper.selectList(wrapper);
        System.out.println(users4);
//        orderByDesc
        wrapper.orderByAsc("age");
        List<User> users5 = userMapper.selectList(wrapper);
        System.out.println(users5);
//        last 拼接
        wrapper.last("limit 1");
        List<User> users6 = userMapper.selectList(wrapper);
        System.out.println(users6);
//        指定要查詢的列
        QueryWrapper<User> select = wrapper.select("id", "name");
    }

自定義的queryWrapper實(shí)現(xiàn)查詢

想要用QueryMapper,而不用xml,所以為了實(shí)現(xiàn)若依那樣的,自己重寫了QueryMapper

原有的mybatis的查詢方法,例如查詢一個(gè)用戶,那么查詢方法就傳一個(gè)用戶,然后在mapper.xml中對(duì)用戶的各項(xiàng)屬性進(jìn)行判斷,然后再拼接相應(yīng)的sql語(yǔ)句,就可以一次性實(shí)現(xiàn)查詢。雖然有mybatisX代碼生成器,或者自己寫代碼生成器,但是多個(gè)表的話感覺(jué)還是有點(diǎn)不好用。所以,自己使用反射寫了一個(gè)QueryWrapper的myAllEq方法,可以實(shí)現(xiàn)傳入一個(gè)實(shí)體類,直接實(shí)現(xiàn)全部屬性查詢

聲明提要

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.DqStatusDispose;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Email;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
/**
 * @author 貓顏
 * @date 2021/5/27 21:28
 * 用戶實(shí)體類
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "dq_user")
public class DqUser extends DqStatusDispose implements Serializable {
    private static final long serialVersionUID = 1L;
    /** 用戶ID */
    /**
     * 主鍵使用TableId注解,否則MybatisPlus默認(rèn)使用id來(lái)查詢
     */
    @TableId(value = "user_id")
    private Long userId;
    /** 用戶賬號(hào) */
    @TableField(value = "user_name")
    private String userName;
    /** 用戶昵稱 */
    @TableField(value = "nick_name")
    private String nickName;
    /** 用戶郵箱 */
    @Email(message = "郵箱格式不正確")
    @TableField(value = "email")
    private String email;
    /** 手機(jī)號(hào)碼 */
    @Size(min = 0, max = 11, message = "手機(jī)號(hào)碼長(zhǎng)度不能超過(guò)11個(gè)字符")
    @TableField(value = "phone_number")
    private String phonenumber;
    /** 用戶性別 0=男,1=女,2=未知*/
    @TableField(value = "sex")
    private String sex;
    /** 用戶頭像 */
    @TableField(value = "avatar")
    private String avatar;
    /** 密碼 */
    @TableField(value = "password")
    private String password;
    /** 帳號(hào)狀態(tài)(0正常 1停用) */
    @TableField(value = "status")
    private String status;
    /** 刪除標(biāo)志(0代表存在 1代表刪除,暫時(shí)沒(méi)打算用) */
    @TableField(value = "delFlag")
    private String delFlag;
    /** 最后登錄IP */
    @TableField(value = "loginIp")
    private String loginIp;
    /** 最后登錄時(shí)間 */
    @TableField(value = "loginDate")
    private Date loginDate;
    /** 用戶角色I(xiàn)D */
    @TableField(value = "role")
    private String role;
    /** 個(gè)性簽名 **/
    @TableField(value = "signature")
    private String signature;
    /** 創(chuàng)建時(shí)間 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /** 更新時(shí)間 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}
  • 我的用戶實(shí)體類中,使用lombak,里面有serialVersionUID。
  • 使用的是注解來(lái)映射數(shù)據(jù)庫(kù)字段名

核心代碼

    /**
     * TODO 自定義遍歷查詢方法
     *
     * @param object
     * @return com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<T>
     * @author 貓顏
     * @date 下午9:20
     */
    public QueryWrapper<T> myAllEq(T object) throws IllegalAccessException,
            NoSuchMethodException,
            InvocationTargetException {
        String getMethodName = "";
        Field field = null;
        Class<?> aClass = object.getClass();
        Field[] declaredFields = aClass.getDeclaredFields();
//        QueryWrapper<T> queryWrapper = new QueryWrapper<>();
        //第一個(gè)為serialVersionUID(舍去) i為1 繞過(guò)
        //獲取object的所有字段
        for (int i = 1; i < declaredFields.length; i++) {
            field = declaredFields[i];
            //類中的成員變量為private,故必須進(jìn)行此操
            field.setAccessible(true);
//            不能直接獲取到值,可以通過(guò)構(gòu)造get方法,或者調(diào)用類的get方法來(lái)獲取值
//            通過(guò)StringUtils的containsIgnoreCase方法來(lái)獲取方法名稱
//            通過(guò)上面那種方法,有循環(huán)嵌套,性能需要優(yōu)化
//            所以采取拼接get方法名
/**
 *
 * @author 貓顏
 * @date         //獲取屬性名稱
 *         for (Field field:
 *              declaredFields) {
 *             System.out.println(field.getName());
 *             methodNameFirst = field.getName().substring(0,1).toUpperCase();
 *             methodName = field.getName();
 *             methodName = "get"+methodNameFirst+methodName.substring(1);
 *             System.out.println("方法名稱為:"+methodName);
 *
 * //            優(yōu)化
 *             System.out.println("優(yōu)化:"+"get"+field.getName().substring(0,1).toUpperCase()+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).toUpperCase() + declaredFields[i].getName().substring(1);
            System.out.println(getMethodName);
//            執(zhí)行g(shù)et方法獲取屬性值
            //執(zhí)行方法
            Method method = aClass.getMethod(getMethodName, null);
            Object getValue = method.invoke(object, null);
            //System.out.println("輸出為:"+invoke);
//            System.out.println("優(yōu)化:"+"get"+declaredFields[i].getName().substring(0,1).toUpperCase()+declaredFields[i].getName().substring(1));
//            如果值不為空,則添加到eq中
            if (getValue != null) {
                //映射關(guān)系
//                return super.eq(,field.get(object));
                //獲取其注解的值
//                后面可以采用查詢方法注釋來(lái)解決,不同的查詢所需的問(wèn)題
                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;
    }

可以使用

        //獲取所有的方法名稱
        //但是順序是與類中的一樣,所以可以構(gòu)建get方法
        //屬性名稱第一個(gè)大寫,然后加上get就是,get方法名稱
        Method[] methods = aClass.getMethods();
        for (Method method:
             methods) {
            System.out.println(method.getName());
            if (StringUtils.containsIgnoreCase(method.getName(),"get")&&
                    StringUtils.containsIgnoreCase(method.getName(),"username")){
                System.out.println("值為:"+method.getName());
            }
        }

StringUtils.containsIgnoreCase方法來(lái)獲取get方法,但是會(huì)造成循環(huán)嵌套,對(duì)性能有一定的影響。

所以,我采用拼接get方法名稱的方法,減少無(wú)用循環(huán)帶來(lái)的影響。

  • 根據(jù)上面的要點(diǎn)提示,for是從1開(kāi)始,因?yàn)榈谝粋€(gè)是serialVersionUID,所以為了跳過(guò)他。從1開(kāi)始
  • 對(duì)于xml中,可以使用like等查詢,我這個(gè)是適用于=查詢,所以后續(xù)會(huì)通過(guò)在用戶類的屬性上加上自定義注解,來(lái)判斷這個(gè)字段所用的查詢方式,對(duì)于一個(gè)字段,有些地方想用=來(lái)查,有些地方想用like來(lái)查,那可以設(shè)定注解有優(yōu)先等級(jí)來(lái)解決。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實(shí)現(xiàn)賬號(hào)登錄時(shí)發(fā)送郵件通知

    java實(shí)現(xiàn)賬號(hào)登錄時(shí)發(fā)送郵件通知

    這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)在賬號(hào)登錄時(shí)發(fā)送郵件通知的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • Java給JFrame窗口設(shè)置熱鍵的方法實(shí)現(xiàn)

    Java給JFrame窗口設(shè)置熱鍵的方法實(shí)現(xiàn)

    這篇文章主要介紹了Java給JFrame窗口設(shè)置熱鍵的方法實(shí)現(xiàn),文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java中的OpenJDK使用原理

    Java中的OpenJDK使用原理

    這篇文章主要介紹了Java中的OpenJDK使用原理,OpenJDK是Java的開(kāi)發(fā)工具包,關(guān)于Java為什么要使用它文章作簡(jiǎn)單介紹,感興趣的朋友可以參考一下
    2022-06-06
  • Java禁止使用finalize方法

    Java禁止使用finalize方法

    這篇文章主要介紹了Java禁止使用finalize方法,需要的朋友可以參考下
    2017-10-10
  • Java Spring @Autowired的這些騷操作,你都知道嗎

    Java Spring @Autowired的這些騷操作,你都知道嗎

    這篇文章主要介紹了徹底搞明白Spring中的自動(dòng)裝配和Autowired注解的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶

    Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶

    這篇文章主要介紹了Spring Boot + Vue 前后端分離項(xiàng)目如何踢掉已登錄用戶,需要的朋友可以參考下
    2020-05-05
  • SpringSecurity自定義登錄界面

    SpringSecurity自定義登錄界面

    這篇文章主要為大家詳細(xì)介紹了SpringSecurity自定義登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 最新評(píng)論