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

Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn)

 更新時(shí)間:2023年07月13日 11:10:51   作者:微云村  
本文主要介紹了Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

定義DTO

package com.lbdj.user.service.dto;
import com.lbdj.toolkit.utils.ReturnField;
import com.lbdj.toolkit.utils.SFunction;
import lombok.Data;
/**
 * 用戶DTO
 *
 * @author 作者
 * @since 2023-06-27
 */
@Data
public class LbdjUserDTO {
    /**
     * 主鍵
     */
    private Long id;
    private String userNo;
    /**
     * 昵稱
     */
    private String nickName;
    /**
     * 密碼
     */
    private String password;
    /**
     * 查詢條數(shù)
     */
    private Integer limit;
    /**
     * 需要返回的列(DTO列名)
     */
    private String columnStr;
    public <T> void setReturnField(SFunction<T, ?>... columns) {
        this.columnStr = ReturnField.select(columns);
    }
}

DTO調(diào)用方式

 工具類1(適用在沒有mybatis-plus包的情況下)

package com.lbdj.toolkit.utils;
import java.io.Serializable;
import java.util.function.Function;
@FunctionalInterface
public interface SFunction<T, R> extends Function<T, R>, Serializable {
}
package com.lbdj.toolkit.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.io.Serializable;
@SuppressWarnings("unused")
public class SerializedLambda implements Serializable {
    private static final long serialVersionUID = 8025925345765570181L;
    private Class<?> capturingClass;
    private String functionalInterfaceClass;
    private String functionalInterfaceMethodName;
    private String functionalInterfaceMethodSignature;
    private String implClass;
    private String implMethodName;
    private String implMethodSignature;
    private int implMethodKind;
    private String instantiatedMethodType;
    private Object[] capturedArgs;
    /**
     * 通過反序列化轉(zhuǎn)換 lambda 表達(dá)式,該方法只能序列化 lambda 表達(dá)式,不能序列化接口實(shí)現(xiàn)或者正常非 lambda 寫法的對象
     *
     * @param lambda lambda對象
     * @return 返回解析后的 SerializedLambda
     */
    public static SerializedLambda resolve(SFunction<?, ?> lambda) {
        if (!lambda.getClass().isSynthetic()) {
            throw new RuntimeException("該方法僅能傳入 lambda 表達(dá)式產(chǎn)生的合成類");
        }
        try (ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(serialize(lambda))) {
            @Override
            protected Class<?> resolveClass(ObjectStreamClass objectStreamClass) throws IOException, ClassNotFoundException {
                Class<?> clazz;
                try {
                    clazz = toClassConfident(objectStreamClass.getName());
                } catch (Exception ex) {
                    clazz = super.resolveClass(objectStreamClass);
                }
                return clazz == java.lang.invoke.SerializedLambda.class ? SerializedLambda.class : clazz;
            }
        }) {
            return (SerializedLambda) objIn.readObject();
        } catch (ClassNotFoundException | IOException e) {
            throw new RuntimeException("This is impossible to happen",e);
        }
    }
    /**
     * 獲取接口 class
     *
     * @return 返回 class 名稱
     */
    public String getFunctionalInterfaceClassName() {
        return normalizedName(functionalInterfaceClass);
    }
    /**
     * 獲取 class 的名稱
     *
     * @return 類名
     */
    public String getImplClassName() {
        return normalizedName(implClass);
    }
    /**
     * 獲取實(shí)現(xiàn)者的方法名稱
     *
     * @return 方法名稱
     */
    public String getImplMethodName() {
        return implMethodName;
    }
    /**
     * 正?;惷Q,將類名稱中的 / 替換為 .
     *
     * @param name 名稱
     * @return 正常的類名
     */
    private String normalizedName(String name) {
        return name.replace('/', '.');
    }
    /**
     * @return 獲取實(shí)例化方法的類型
     */
    public Class<?> getInstantiatedType() {
        String instantiatedTypeName = normalizedName(instantiatedMethodType.substring(2, instantiatedMethodType.indexOf(';')));
        return toClassConfident(instantiatedTypeName);
    }
    /**
     * @return 字符串形式
     */
    @Override
    public String toString() {
        String interfaceName = getFunctionalInterfaceClassName();
        String implName = getImplClassName();
        return String.format("%s -> %s::%s",
                interfaceName.substring(interfaceName.lastIndexOf('.') + 1),
                implName.substring(implName.lastIndexOf('.') + 1),
                implMethodName);
    }
    public static Class<?> toClassConfident(String name) {
        try {
            return classForName(name);
        } catch (ClassNotFoundException e) {
            try {
                return Class.forName(name);
            } catch (ClassNotFoundException ex) {
                throw new RuntimeException("找不到指定的class!請僅在明確確定會(huì)有 class 的時(shí)候,調(diào)用該方法", e);
            }
        }
    }
    private static ClassLoaderWrapper classLoaderWrapper = new ClassLoaderWrapper();
    public static Class<?> classForName(String className) throws ClassNotFoundException {
        return classLoaderWrapper.classForName(className);
    }
    public static byte[] serialize(Object object) {
        if (object == null) {
            return null;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
            oos.writeObject(object);
            oos.flush();
        } catch (IOException ex) {
            throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), ex);
        }
        return baos.toByteArray();
    }
}
package com.lbdj.toolkit.utils;
public class ClassLoaderWrapper {
  ClassLoader defaultClassLoader;
  ClassLoader systemClassLoader;
  ClassLoaderWrapper() {
    try {
      systemClassLoader = ClassLoader.getSystemClassLoader();
    } catch (SecurityException ignored) {
      // AccessControlException on Google App Engine
    }
  }
  public Class<?> classForName(String name) throws ClassNotFoundException {
    return classForName(name, getClassLoaders(null));
  }
  Class<?> classForName(String name, ClassLoader[] classLoader) throws ClassNotFoundException {
    for (ClassLoader cl : classLoader) {
      if (null != cl) {
        try {
          return Class.forName(name, true, cl);
        } catch (ClassNotFoundException e) {
          // we'll ignore this until all classloaders fail to locate the class
        }
      }
    }
    throw new ClassNotFoundException("Cannot find class: " + name);
  }
  ClassLoader[] getClassLoaders(ClassLoader classLoader) {
    return new ClassLoader[]{
        classLoader,
        defaultClassLoader,
        Thread.currentThread().getContextClassLoader(),
        getClass().getClassLoader(),
        systemClassLoader};
  }
}
package com.lbdj.toolkit.utils;
import java.lang.ref.WeakReference;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 通過lambda獲取字段名
 */
public class ReturnField {
    /**
     * SerializedLambda 反序列化緩存
     */
    private static final Map<String, WeakReference<SerializedLambda>> FUNC_CACHE = new ConcurrentHashMap<>();
    @SafeVarargs
    public final static <T> String select(SFunction<T, ?>... columns) {
        if(columns == null || columns.length == 0){
            return null;
        }
        HashSet<String> returnField = new HashSet<>(8);
        Arrays.stream(columns).forEach(col -> {
            String fieldName = parseFunction(col);
            returnField.add(fieldName);
        });
        StringBuffer colStrBuffer = new StringBuffer();
        returnField.forEach(m -> {
            colStrBuffer.append(m).append(",");
        });
        if (colStrBuffer.toString().endsWith(",")) {
            colStrBuffer.replace(colStrBuffer.toString().length() - 1, colStrBuffer.toString().length(), "");
        }
        String colStr = colStrBuffer.toString();
        return colStr;
    }
    public static <T> String parseFunction(SFunction<T, ?> function) {
        SerializedLambda serializedLambda = resolve(function);
        String fieldName = methodToProperty(serializedLambda.getImplMethodName());
        return fieldName;
    }
    public static String methodToProperty(String name) {
        if (name.startsWith("is")) {
            name = name.substring(2);
        } else {
            if (!name.startsWith("get") && !name.startsWith("set")) {
                throw new RuntimeException("Error parsing property name '" + name + "'.  Didn't start with 'is', 'get' or 'set'.");
            }
            name = name.substring(3);
        }
        if (name.length() == 1 || name.length() > 1 && !Character.isUpperCase(name.charAt(1))) {
            name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
        }
        return name;
    }
    public static <T> SerializedLambda resolve(SFunction<T, ?> func) {
        Class<?> clazz = func.getClass();
        String name = clazz.getName();
        return Optional.ofNullable(FUNC_CACHE.get(name))
                .map(WeakReference::get)
                .orElseGet(() -> {
                    SerializedLambda lambda = SerializedLambda.resolve(func);
                    FUNC_CACHE.put(name, new WeakReference<>(lambda));
                    return lambda;
                });
    }
}

工具類2(適用在有mybatis-plus包的情況下)

Mapper通用查詢方法

    @Override
    public List<LbdjUserDTO> selectBase(LbdjUserDTO request) {
        LbdjUser user = BeanConvertUtils.convert(request, LbdjUser::new, null);
        QueryWrapper<LbdjUser> queryWrapper = new QueryWrapper<>();
        //封裝返回字段&查詢條件
        InitCommonQueryUtils.initQuery(user, request.getColumnStr(), queryWrapper);
        queryWrapper.last(" limit " + request.getLimit());
        List<LbdjUser> result = list(queryWrapper);
        if (CollectionUtils.isEmpty(result)) {
            return Arrays.asList();
        }
        return BeanConvertUtils.convertList(result, LbdjUserDTO::new);
    }
package com.lbdj.user.service.common.utils;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lbdj.user.service.common.advice.exception.RRException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class InitCommonQueryUtils {
    public static <T> void initQuery(T entity, String columnStr, QueryWrapper<T> queryWrapper) {
        Class<T> type = (Class<T>) entity.getClass();
        TableName annotation = type.getAnnotation(TableName.class);
        if (annotation == null) {
            throw new RRException("非數(shù)據(jù)庫實(shí)體類");
        }
        //返回字段
        StringBuilder columns = new StringBuilder();
        //查詢條件
        HashMap<String, Object> paramMap = new HashMap<>();
        Field[] declaredFields = type.getDeclaredFields();
        List<String> columnArr = null;
        if (null != columnStr && !"".equals(columnStr)) {
            columnArr = Arrays.asList(columnStr.split(","));
        }
        /**
         * 有兼容歷史問題,表中字段半駝峰、非駝峰問題
         */
        for (Field declaredField : declaredFields) {
            //設(shè)置屬性可訪問
            declaredField.setAccessible(true);
            //屬性名
            String name = declaredField.getName();
            //獲取主鍵
            TableId tableId = declaredField.getAnnotation(TableId.class);
            //獲取非主鍵的
            TableField tableField = declaredField.getAnnotation(TableField.class);
            //拼接返回字段
            appendReturnField(name, columnArr, columns, tableId, tableField);
            //拼接查詢條件
            appendCondition(entity, paramMap, declaredField, name, tableId, tableField);
        }
        //返回字段
        if (columns.length() > 0) {
            queryWrapper.select(columns.toString());
        }
        //查詢條件
        if (paramMap.size() > 0) {
            queryWrapper.allEq(paramMap, false);
        }
    }
    private static void appendReturnField(String name,
                                          List<String> columnArr,
                                          StringBuilder columns,
                                          TableId tableId,
                                          TableField tableField) {
        if (null == columnArr) {
            return;
        }
        if (!columnArr.contains(name)) {
            return;
        }
        if (tableId != null) {
            if (columns.length() > 0) {
                columns.append(",");
            }
            columns.append(tableId.value());
            return;
        }
        if (tableField != null) {
            if (columns.length() > 0) {
                columns.append(",");
            }
            if (tableField.exist()) {
                //是數(shù)據(jù)表字段,不是數(shù)據(jù)表字段不處理
                columns.append(tableField.value());
            }
        }
    }
    private static <T> void appendCondition(T entity,
                                            HashMap<String, Object> paramMap,
                                            Field declaredField,
                                            String name,
                                            TableId tableId,
                                            TableField tableField) {
        // 獲取屬性的值
        Object value = null;
        try {
            value = declaredField.get(entity);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        if (null == value) {
            return;
        }
        if (tableId != null) {
            paramMap.put(tableId.value(), value);
            return;
        }
        if (tableField != null) {
            if (tableField.exist()) {
                //是數(shù)據(jù)表字段,不是數(shù)據(jù)表字段不處理
                paramMap.put(tableField.value(), value);
            }
            return;
        }
        //處理沒有加注解的屬性(兼容完全服務(wù)駝峰規(guī)范的數(shù)據(jù)表)
        if (!Modifier.isStatic(declaredField.getModifiers())) {
            paramMap.put(name, value);
        }
    }
}

到此這篇關(guān)于Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mybatis-plus通用查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-plus讀取JSON類型的方法實(shí)現(xiàn)

    mybatis-plus讀取JSON類型的方法實(shí)現(xiàn)

    這篇文章主要介紹了mybatis-plus讀取JSON類型的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 在Ubuntu上部署SpringBoot應(yīng)用的操作步驟

    在Ubuntu上部署SpringBoot應(yīng)用的操作步驟

    隨著云計(jì)算和容器化技術(shù)的普及,Linux 服務(wù)器已成為部署 Web 應(yīng)用程序的主流平臺(tái)之一,Java 作為一種跨平臺(tái)的編程語言,具有廣泛的應(yīng)用場景,本文將詳細(xì)介紹如何在 Ubuntu 服務(wù)器上部署 Java 應(yīng)用,需要的朋友可以參考下
    2025-01-01
  • Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn)

    Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn)

    這篇文章主要介紹了Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java堆外內(nèi)存溢出的緊急處理技巧

    Java堆外內(nèi)存溢出的緊急處理技巧

    在高并發(fā)的Java應(yīng)用場景中,堆外內(nèi)存溢出往往是最難排查的問題之一,當(dāng)SpringBoot項(xiàng)目出現(xiàn)內(nèi)存異常時(shí),傳統(tǒng)的堆內(nèi)存分析工具常常束手無策,因?yàn)槎淹鈨?nèi)存不受JVM堆內(nèi)存管理機(jī)制的直接控制,本文將通過一個(gè)真實(shí)的電商緩存服務(wù)案例,完整展示從問題發(fā)現(xiàn)到定位再到解決的全流程
    2025-06-06
  • Java使用DateTimeFormatter格式化輸入的日期時(shí)間

    Java使用DateTimeFormatter格式化輸入的日期時(shí)間

    這篇文章主要介紹了Java使用DateTimeFormatter格式化輸入的日期時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • java實(shí)現(xiàn)人員信息管理系統(tǒng)

    java實(shí)現(xiàn)人員信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)人員信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 基于Java class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)

    基于Java class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)

    下面小編就為大家?guī)硪黄贘ava class對象說明、Java 靜態(tài)變量聲明和賦值說明(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 詳解MyBatis的getMapper()接口、resultMap標(biāo)簽、Alias別名、 盡量提取sql列、動(dòng)態(tài)操作

    詳解MyBatis的getMapper()接口、resultMap標(biāo)簽、Alias別名、 盡量提取sql列、動(dòng)態(tài)操作

    這篇文章主要介紹了詳解MyBatis的getMapper()接口、resultMap標(biāo)簽、Alias別名、 盡量提取sql列、動(dòng)態(tài)操作的相關(guān)資料,需要的朋友可以參考下
    2016-08-08
  • JAVA之反射機(jī)制Reflection的使用

    JAVA之反射機(jī)制Reflection的使用

    這篇文章主要介紹了JAVA之反射機(jī)制Reflection的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java通過wait()和notifyAll()方法實(shí)現(xiàn)線程間通信

    Java通過wait()和notifyAll()方法實(shí)現(xiàn)線程間通信

    這篇文章主要為大家詳細(xì)介紹了Java通過wait()和notifyAll()方法實(shí)現(xiàn)線程間通信的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論

论坛| 南召县| 北流市| 平山县| 馆陶县| 镇宁| 顺平县| 合川市| 扎囊县| 陕西省| 五指山市| 长阳| 依兰县| 绥中县| 花莲市| 临夏县| 玉屏| 始兴县| 郁南县| 全州县| 临潭县| 淳安县| 灵川县| 乌鲁木齐县| 修水县| 扶风县| 公主岭市| 桃园市| 庐江县| 禄丰县| 宝清县| 灌南县| 酒泉市| 武川县| 溧水县| 长顺县| 山东| 旅游| 斗六市| 民勤县| 涟水县|