最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式

 更新時(shí)間:2022年01月11日 10:44:29   作者:mr_foxsand  
這篇文章主要介紹了關(guān)于QueryWrapper,實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

QueryWrapper實(shí)現(xiàn)MybatisPlus多表關(guān)聯(lián)查詢

1.dao層接口使用Select注解寫SQL

重點(diǎn):@Param("ew") Wrapper參數(shù)是必須,因?yàn)?{ew.customSqlSegment} 底層其實(shí)就是where 條件,所以為了保證Wrapper不為空,service層代碼中的Wrapper至少需要有一個(gè)條件:1 = 1

@Override
? ? @Select("select a.code as code , b.name as name , b.barcode as barcode , ?a.ware_code as wareCode , c.name as wareName , a.qty as qty , a.oprice as oprice , a.total as total , " +
? ? ? ? ? ? " a.id as id , a.create_by as createBy , a.create_date as createDate , a.update_by as updateBy , a.update_date as updateDate , a.status as status , a.remarks as remarks ?" +
? ? ? ? ? ? "from sku_stock a , goods b , warehouse c " +
? ? ? ? ? ? "${ew.customSqlSegment} and a.code = b.code and a.ware_code = c.code")
? ? IPage<SkuStock> selectPage(IPage<SkuStock> page, @Param("ew")Wrapper<SkuStock> queryWrapper);

2.service層代碼示例

service父類封裝的findPage方法:

/**
? ? ?* 封裝findPage
? ? ?* @param entity
? ? ?* @param search ?Map中的key:";"為保留關(guān)鍵字,拆分?jǐn)?shù)組,僅支持最大長(zhǎng)度2的數(shù)組,
? ? ?* ? ? ? ? ? ? ? ?下標(biāo)0:QueryWrapper查詢條件中的列名(支持多表關(guān)聯(lián)查詢的表別名 + 列名方式,需要dao層接口支持)
? ? ?* ? ? ? ? ? ? ? ?下標(biāo)1: QueryWrapper中不同的查詢條件,eq:等于,ge:大于等..... todo:請(qǐng)自行完善Mybatis eq、ne、gt、lt、ge、le等
? ? ?* ? ? ? ? ? ? ? ?Map中的value:QueryWrapper需要查詢的值
? ? ?* @param args ?QueryWrapper中order by 排序數(shù)組
? ? ?* @return
? ? ?*/
? ? public IPage<T> findPage(T entity , Map<String , Object> search , String... args){
? ? ? ? long current = 1L;
? ? ? ? long size = 10L;
? ? ? ? if (EmptyUtil.isNoEmpty(ReflexUtil.getFieldValue(entity , "page")) && (long) ReflexUtil.getFieldValue(entity , "page") != 0){
? ? ? ? ? ? current = (long) ReflexUtil.getFieldValue(entity , "page");
? ? ? ? }
? ? ? ? if (EmptyUtil.isNoEmpty(ReflexUtil.getFieldValue(entity , "limit")) && (long) ReflexUtil.getFieldValue(entity , "limit") != 0){
? ? ? ? ? ? size = (long) ReflexUtil.getFieldValue(entity , "limit");
? ? ? ? }
?
? ? ? ? QueryWrapper<T> queryWrapper;
? ? ? ? if (EmptyUtil.isNoEmpty(search)){
? ? ? ? ? ? queryWrapper = new QueryWrapper<>();
? ? ? ? ? ? for (Map.Entry<String , Object> entry:search.entrySet()
? ? ? ? ? ? ? ? ?) {
? ? ? ? ? ? ? ? String[] key = entry.getKey().split(";");
? ? ? ? ? ? ? ? if (key.length > 1){
? ? ? ? ? ? ? ? ? ? if (key[1].equals("eq")){
? ? ? ? ? ? ? ? ? ? ? ? queryWrapper.eq(key[0] , entry.getValue());
? ? ? ? ? ? ? ? ? ? }else if (key[1].equals("ge")){
? ? ? ? ? ? ? ? ? ? ? ? queryWrapper.ge(key[0] , entry.getValue());
? ? ? ? ? ? ? ? ? ? }else if (key[1].equals("lt")){
? ? ? ? ? ? ? ? ? ? ? ? queryWrapper.lt(key[0] , entry.getValue());
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }else {
? ? ? ? ? ? ? ? ? ? queryWrapper.like(entry.getKey() , entry.getValue());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }else {
? ? ? ? ? ? queryWrapper = new QueryWrapper<>(entity);
? ? ? ? }
? ? ? ? queryWrapper.orderByAsc(args);
? ? ? ? return super.page(new Page<T>(current , size) , queryWrapper);
? ? }

service實(shí)現(xiàn)類方法:

public IPage<SkuStock> findPage(SkuStock entity, String... args) {
? ? ? ? Map<String , Object> search = null;
? ? ? ? search = new HashedMap();
? ? ? ? search.put("1;eq" , "1");
? ? ? ? if (EmptyUtil.isNoEmpty(entity.getCode())
? ? ? ? ? ? ? ? || EmptyUtil.isNoEmpty(entity.getWareCode())
? ? ? ? ){
? ? ? ? ? ? if (EmptyUtil.isNoEmpty(entity.getCode())){
? ? ? ? ? ? ? ? search.put("code" , entity.getCode());
? ? ? ? ? ? }
? ? ? ? ? ? if (EmptyUtil.isNoEmpty(entity.getWareCode())){
? ? ? ? ? ? ? ? search.put("ware_code" , entity.getWareCode());
? ? ? ? ? ? }
? ? ? ? }else {
? ? ? ? ? ? long limit = entity.getLimit();
? ? ? ? ? ? long page = entity.getPage();
? ? ? ? ? ? entity = new SkuStock();
? ? ? ? ? ? entity.setLimit(limit);
? ? ? ? ? ? entity.setPage(page);
? ? ? ? }
? ? ? ? return super.findPage(entity , search , args);
? ? }

3.反射工具類

package org.bluedream.comm.utils; 
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
/**
 * @ClassName ReflexUtil
 * @Description TODO
 * @Author foxsand
 * @Data 2021-06-09 15:17
 * @Version
 */
public class ReflexUtil {
 
    /**
     * 返回 entity 對(duì)象的所有屬性,包含父類
     * @param obj
     * @return
     */
    public static List<Field> getObjectFields(Object obj){
        Class clazz = obj.getClass();
        List<Field> fieldList = new ArrayList<>() ;
        while (clazz != null) {//當(dāng)父類為null的時(shí)候說(shuō)明到達(dá)了最上層的父類(Object類).
            fieldList.addAll(Arrays.asList(clazz .getDeclaredFields()));
            clazz = clazz.getSuperclass(); //得到父類,然后賦給自己
        }
        return fieldList;
    }
 
    public static List<Field> getObjectFields(Class<?> clazz){
        List<Field> fieldList = new ArrayList<>() ;
        while (clazz != null){
            fieldList.addAll(Arrays.asList(clazz .getDeclaredFields()));
            clazz = clazz.getSuperclass(); //得到父類,然后賦給自己
        }
        return fieldList;
    }
 
    /**
     * 判斷 Class entity 是否存在名稱為 fieldName 的屬性
     * @param fieldName
     * @param entity
     * @return
     */
    public static Boolean isField(String fieldName , Object entity){
        List<Field> fieldList = getObjectFields(entity);
        for (Field f1:fieldList
        ) {
            if (fieldName.equals(f1.getName()))
                return true;
        }
        return false;
    }
 
    /**
     * 返回 entity 對(duì)象中的所有方法,包含父類
     * @param entity
     * @return
     */
    public static List<Method> getObjectMethods(Object entity){
        Class<?> clazz = entity.getClass();
        List<Method> methods = new ArrayList<>();
        while (clazz != null && clazz != Object.class) {//當(dāng)父類為null的時(shí)候說(shuō)明到達(dá)了最上層的父類(Object類).
            methods.addAll(Arrays.asList(clazz .getDeclaredMethods()));
            clazz = clazz.getSuperclass(); //得到父類,然后賦給自己
        }
        return methods;
    }
 
    public static List<Method> getObjectMethods(Class<?> clazz){
        List<Method> methods = new ArrayList<>();
        while (clazz != null && clazz != Object.class) {//當(dāng)父類為null的時(shí)候說(shuō)明到達(dá)了最上層的父類(Object類).
            methods.addAll(Arrays.asList(clazz .getDeclaredMethods()));
            clazz = clazz.getSuperclass(); //得到父類,然后賦給自己
        }
        return methods;
    }
 
    /**
     * 判斷 Class entity 是否存在名稱為 methodName 的方法
     * @param methodName
     * @param entity
     * @return
     */
    public static Boolean isMethod(String methodName , Object entity){
        List<Method> methods = getObjectMethods(entity);
        for (Method m1:methods
        ) {
            if (methodName.equals(m1.getName()))
                return true;
        }
        return false;
    }
 
    /**
     * 循環(huán)向上轉(zhuǎn)型, 獲取對(duì)象的 DeclaredMethod
     * @param obj
     * @param methodName
     * @param parameterTypes  方法參數(shù)類型
     * @return
     */
    public static Method getDeclaredMethod(Object obj , String methodName , Class<?>...parameterTypes) {
        for (Class<?> clazz = obj.getClass(); clazz != Object.class && clazz != null; clazz = clazz.getSuperclass()) {
            try {
                return clazz.getDeclaredMethod(methodName, parameterTypes);
            } catch (Exception e) {
                // 這里甚么都不要做!并且這里的異常必須這樣寫,不能拋出去。
                // 如果這里的異常打印或者往外拋,則就不會(huì)執(zhí)行clazz=clazz.getSuperclass(),最后就不會(huì)進(jìn)入到父類中了
            }
        }
        return null;
    }
 
    public static Object invoke(Object object, String methodName, Class<?>[] parameterTypes,
                                Object[] parameters){
        Method method = getDeclaredMethod(object, methodName, parameterTypes);
        try {
            if (method != null){
                method.setAccessible(true);
                // 調(diào)用object 的 method 所代表的方法,其方法的參數(shù)是 parameters
                return method.invoke(object, parameters);
            }
        }catch (Exception e1){
            e1.printStackTrace();
        }
        return null;
    }
 
    /**
     * 循環(huán)向上轉(zhuǎn)型, 獲取對(duì)象的 DeclaredField
     *
     * @param object
     *            : 子類對(duì)象
     * @param fieldName
     *            : 父類中的屬性名
     * @return 父類中的屬性對(duì)象
     */
 
    public static Field getDeclaredField(Object object, String fieldName) {
        Field field = null; 
        Class<?> clazz = object.getClass(); 
        for (; clazz != Object.class && clazz != null; clazz = clazz.getSuperclass()) {
            try {
                field = clazz.getDeclaredField(fieldName);
                return field;
            } catch (Exception e) {
                // 這里甚么都不要做!并且這里的異常必須這樣寫,不能拋出去。
                // 如果這里的異常打印或者往外拋,則就不會(huì)執(zhí)行clazz = clazz.getSuperclass(),最后就不會(huì)進(jìn)入到父類中了 
            }
        } 
        return null;
    }
 
    /**
     * 直接設(shè)置對(duì)象屬性值, 忽略 private/protected 修飾符, 也不經(jīng)過(guò) setter
     *
     * @param object
     *            : 子類對(duì)象
     * @param fieldName
     *            : 父類中的屬性名
     * @param value
     *            : 將要設(shè)置的值
     */
 
    public static void setFieldValue(Object object, String fieldName, Object value) {
 
        // 根據(jù) 對(duì)象和屬性名通過(guò)反射 調(diào)用上面的方法獲取 Field對(duì)象
        Field field = getDeclaredField(object, fieldName);
 
        if (field != null){
            // 抑制Java對(duì)其的檢查
            field.setAccessible(true);
            try {
                // 將 object 中 field 所代表的值 設(shè)置為 value
                field.set(object, value);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
 
    /**
     * 直接讀取對(duì)象的屬性值, 忽略 private/protected 修飾符, 也不經(jīng)過(guò) getter
     *
     * @param object
     *            : 子類對(duì)象
     * @param fieldName
     *            : 父類中的屬性名
     * @return : 父類中的屬性值
     */
 
    public static Object getFieldValue(Object object, String fieldName) {
        // 根據(jù) 對(duì)象和屬性名通過(guò)反射 調(diào)用上面的方法獲取 Field對(duì)象
        Field field = getDeclaredField(object, fieldName);
 
        if (field != null){
            // 抑制Java對(duì)其的檢查
            field.setAccessible(true);
            try {
                // 獲取 object 中 field 所代表的屬性值
                return field.get(object);
 
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }  
}

4.判空工具類

package org.bluedream.comm.utils;?
import java.util.Collection;
import java.util.Map;?
public class EmptyUtil {
? ? //Suppress default constructor for noninstantiability
? ? private EmptyUtil(){
? ? ? ? throw new AssertionError();
? ? }
?
? ? public static boolean isEmpty(Object object){
? ? ? ? if (object == null){
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? if (object instanceof int[]){
? ? ? ? ? ? return ((int[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof double[]){
? ? ? ? ? ? return ((double[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof long[]){
? ? ? ? ? ? return ((long[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof byte[]){
? ? ? ? ? ? return ((byte[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof short[]){
? ? ? ? ? ? return ((short[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof float[]){
? ? ? ? ? ? return ((float[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof char[]){
? ? ? ? ? ? return ((char[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof Object[]){
? ? ? ? ? ? return ((Object[]) object).length == 0;
? ? ? ? }
? ? ? ? if (object instanceof CharSequence) {
? ? ? ? ? ? return ((CharSequence) object).length() == 0;
? ? ? ? }
? ? ? ? if (object instanceof Collection ){
? ? ? ? ? ? return ((Collection) object).isEmpty();
? ? ? ? }
? ? ? ? if (object instanceof Map){
? ? ? ? ? ? return ((Map) object).isEmpty();
? ? ? ? }
? ? ? ? return false;
? ? }
?
? ? public static boolean isNoEmpty(Object object){
? ? ? ? return !isEmpty(object);
? ? }?
}

MybatisPlus QueryWrapper簡(jiǎn)單用法

查詢方式

說(shuō)明

setSqlSelect

設(shè)置 SELECT 查詢字段

where

WHERE 語(yǔ)句,拼接 +?WHERE 條件

and

AND 語(yǔ)句,拼接 +?AND 字段=值

andNew

AND 語(yǔ)句,拼接 +?AND (字段=值)

or

OR 語(yǔ)句,拼接 +?OR 字段=值

orNew

OR 語(yǔ)句,拼接 +?OR (字段=值)

eq

等于=

allEq

基于 map 內(nèi)容等于=

ne

不等于<>

gt

大于>

ge

大于等于>=

lt

小于<

le

小于等于<=

like

模糊查詢 LIKE

notLike

模糊查詢 NOT LIKE

in

IN 查詢

notIn

NOT IN 查詢

isNull

NULL 值查詢

isNotNull

IS NOT NULL

groupBy

分組 GROUP BY

having

HAVING 關(guān)鍵詞

orderBy

排序 ORDER BY

orderAsc

ASC 排序 ORDER BY

orderDesc

DESC 排序 ORDER BY

exists

EXISTS 條件語(yǔ)句

notExists

NOT EXISTS 條件語(yǔ)句

between

BETWEEN 條件語(yǔ)句

notBetween

NOT BETWEEN 條件語(yǔ)句

addFilter

自由拼接 SQL

last

拼接在最后,例如:last(“LIMIT 1”)

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

相關(guān)文章

  • JAVA mongodb 聚合幾種查詢方式詳解

    JAVA mongodb 聚合幾種查詢方式詳解

    這篇文章主要介紹了JAVA mongodb 聚合幾種查詢方式詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • spring boot與kafka集成的簡(jiǎn)單實(shí)例

    spring boot與kafka集成的簡(jiǎn)單實(shí)例

    本篇文章主要介紹了spring boot與kafka集成的簡(jiǎn)單實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Java集合系列之LinkedHashMap源碼分析

    Java集合系列之LinkedHashMap源碼分析

    這篇文章主要為大家詳細(xì)介紹了Java集合系列之LinkedHashMap源碼分析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 深入理解Java中觀察者模式與委托的對(duì)比

    深入理解Java中觀察者模式與委托的對(duì)比

    這篇文章主要介紹了Java中觀察者模式與委托的對(duì)比,觀察者模式:定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象,委托的實(shí)現(xiàn)簡(jiǎn)單來(lái)講就是用反射來(lái)實(shí)現(xiàn)的,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • hibernate 命名查詢?nèi)绾螌?shí)現(xiàn)

    hibernate 命名查詢?nèi)绾螌?shí)現(xiàn)

    Hibernate允許在映射文件中定義字符串形式的查詢語(yǔ)句,這種查詢方式成為命名查詢,需要的朋友可以參考下
    2012-11-11
  • Java實(shí)現(xiàn)遞歸山脈

    Java實(shí)現(xiàn)遞歸山脈

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)遞歸山脈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringCloud Open feign 使用okhttp 優(yōu)化詳解

    SpringCloud Open feign 使用okhttp 優(yōu)化詳解

    這篇文章主要介紹了SpringCloud Open feign 使用okhttp 優(yōu)化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java非阻塞I/O模型之NIO相關(guān)知識(shí)總結(jié)

    Java非阻塞I/O模型之NIO相關(guān)知識(shí)總結(jié)

    在了解NIO (Non-Block I/O) 非阻塞I/O模型之前,我們可以先了解一下原始的BIO(Block I/O) 阻塞I/O模型,NIO模型能夠以非阻塞的方式更好的利用服務(wù)器資源,需要的朋友可以參考下
    2021-05-05
  • Java 注解@AliasFor使用方式及實(shí)際案例

    Java 注解@AliasFor使用方式及實(shí)際案例

    本文將全面介紹@AliasFor注解的使用方式、應(yīng)用場(chǎng)景、源碼解析以及實(shí)際案例,幫助你徹底掌握這個(gè)高級(jí)注解,感興趣的朋友一起看看吧
    2025-08-08
  • java實(shí)現(xiàn)字符串轉(zhuǎn)String數(shù)組的方法示例

    java實(shí)現(xiàn)字符串轉(zhuǎn)String數(shù)組的方法示例

    這篇文章主要介紹了java實(shí)現(xiàn)字符串轉(zhuǎn)String數(shù)組的方法,涉及java字符串的遍歷、分割、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

镶黄旗| 白河县| 连州市| 清远市| 绥江县| 靖州| 台南县| 江达县| 罗甸县| 徐汇区| 和田市| 万载县| 庆安县| 龙泉市| 崇礼县| 廊坊市| 集贤县| 蚌埠市| 大安市| 富平县| 石台县| 杭州市| 阜宁县| 奉化市| 剑川县| 泸州市| 长葛市| 福鼎市| 崇礼县| 平舆县| 平泉县| 肃宁县| 桂阳县| 富平县| 瓦房店市| 神池县| 辽源市| 新和县| 郎溪县| 北碚区| 溧水县|