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

Mybatis-plus如何通過(guò)反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能

 更新時(shí)間:2024年02月19日 14:19:30   作者:daizuojian  
這篇文章主要介紹了Mybatis-plus如何通過(guò)反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Mybatis-plus反射實(shí)現(xiàn)動(dòng)態(tài)排序不同字段

最近在做項(xiàng)目,使用到了Mybatis-plus,頁(yè)面上需要對(duì)某些字段進(jìn)行排序,原來(lái)是固定好哪些字段需要排序,然后在Controller里接收參數(shù)。

如下代碼所示

	@LogOperation(name = "query urpOfi", objType = "Config")
    @GetMapping
    public ResponseEntity<DtoResponse<OfiDto>> queryOfi(
            @RequestParam(name = "pageSize", defaultValue = "-1", required = false) Integer pageSize,
            @RequestParam(name = "page", defaultValue = "-1", required = false) Integer page,
            @RequestParam(value = "sort", defaultValue = "", required = false) String sort,
            @RequestParam(value = "msFlag", defaultValue = "", required = false) String msFlag)
            throws UnsupportedEncodingException {
        sort = URLDecoder.decode(sort, StandardCharsets.UTF_8.toString());
        msFlag = URLDecoder.decode(msFlag, StandardCharsets.UTF_8.toString());
        余下省略......

其中@LogOperation使我們自定義的AOP日志注解,可以不用關(guān)注。

這里存在的問(wèn)題是參數(shù)沒(méi)有校驗(yàn)

直接接收了,可能會(huì)被惡意攻擊,同時(shí)sort為排序字段,前臺(tái)會(huì)傳一個(gè)固定好的字段值過(guò)來(lái),

無(wú)法實(shí)現(xiàn)動(dòng)態(tài)排序(比如:前臺(tái)隨意傳一個(gè)字段,只要在我的表數(shù)據(jù)Entity中存在該字段,就可以實(shí)現(xiàn)排序)

通過(guò)以下方式實(shí)現(xiàn)動(dòng)態(tài)排序

@Data
public class BaseQueryDto<T> {
    // 排序方式標(biāo)識(shí)符號(hào),”-“代表倒序
    private static final String ORDER_BY_IDENTIFIER = "-";

    private static final int MAX_PAGE_SIZE = 100;

    private static final int MAX_PAGE = 10000;

    private static final int MAX_SORT_LENGTH = 100;

    /**
     * 每頁(yè)顯示記錄數(shù)
     */
    @Range(min = 0, max = MAX_PAGE_SIZE)
    protected Integer pageSize = 10;

    /**
     * 當(dāng)前頁(yè)
     */
    @Range(min = 0, max = MAX_PAGE)
    protected Integer page = 0;

    /**
     * 排序,包含2部分內(nèi)容,排序方式及排序字段
     */
    @Length(max = MAX_SORT_LENGTH)
    protected String sort;

    /**
     * 獲取排序方式,默認(rèn)升序(asc)
     *
     * @return 排序方式
     */
    public SqlOrderType getOrderType() {
        if (StringUtils.isEmpty(sort)) {
            return SqlOrderType.ASC;
        }

        if (sort.startsWith(ORDER_BY_IDENTIFIER)) {
            return SqlOrderType.DESC;
        }

        return SqlOrderType.ASC;
    }

    private Optional<Class<?>> getEntityClass() {
        Type type = getClass().getGenericSuperclass();
        if (type instanceof ParameterizedType) {
            Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
            try {
                return Optional.of(Class.forName(actualTypeArguments[0].getTypeName()));
            } catch (ClassNotFoundException e) {
                return Optional.empty();
            }
        }

        return Optional.empty();
    }

    private Optional<Field> getEntityField(String fieldName) {
        Optional<Class<?>> optionalClass = getEntityClass();

        return optionalClass.flatMap(it -> {
            try {
                return Optional.of(it.getDeclaredField(fieldName));
            } catch (NoSuchFieldException e) {
                return Optional.empty();
            }
        });
    }

    /**
     * 獲取數(shù)據(jù)排序的列
     *
     * @return 排序列
     */
    public Optional<String> getOrderColumn() {
        if (StringUtils.isEmpty(sort)) {
            return Optional.empty();
        }
        return getEntityField(sort.replaceFirst(ORDER_BY_IDENTIFIER, "")).map(Field::getName);
    }

    /**
     * 設(shè)置排序的QueryWrapper
     *
     * @param queryWrapper query wrapper
     */
    public void setOrderQueryWrapper(QueryWrapper<T> queryWrapper) {
        this.getOrderColumn().ifPresent(column -> {
            queryWrapper.orderBy(true, this.getOrderType().equals(SqlOrderType.ASC), column);
        });
    }
}

BaseQueryDto是公共的查詢(xún)Dto父類(lèi),泛型T為具體的表數(shù)據(jù)Entity。

通過(guò)java beanvalidation控制入?yún)⒋笮〖伴L(zhǎng)度,前端傳遞的參數(shù)sort值一般為Entity中的字段名,例如“id”或者“-id”,帶有“-”的代表是降序。

會(huì)根據(jù)傳入的sort值通過(guò)反射去判斷在Entity中是否存在該字段,存在就正常排序,不存在就什么也不做。

如果只需要排序,那么Controller中用BaseQueryDto去接收參數(shù)即可,然后在Service中調(diào)用baseQueryDto.setOrderQueryWrapper(queryWrapper);

如果不僅僅排序,還需要對(duì)某些字段做模糊查詢(xún)或者下拉框過(guò)濾查詢(xún),需要新建Dto繼承BaseQueryDto。

@Data
public class OfiQueryDto extends BaseQueryDto<OfiEntity> {
    /**
     * 主從標(biāo)識(shí)(過(guò)濾查詢(xún))
     */
    @Length(max = 5)
    private String msFlag = "";

    /**
     * 國(guó)內(nèi),國(guó)內(nèi)備用,國(guó)際,國(guó)際備用網(wǎng)編碼(模糊查詢(xún))
     */
    @Length(max = 6)
    private String networkCode1 = "";

    @Length(max = 6)
    private String networkCode2 = "";

    @Length(max = 6)
    private String networkCode3 = "";

    @Length(max = 6)
    private String networkCode4 = "";
}

Service中設(shè)置模糊查詢(xún),下拉框過(guò)濾和排序。

public ListPage<OfiEntity> queryOfiListPage(OfiQueryDto dto, Integer clusterId)
            throws UnsupportedEncodingException {
        QueryWrapper<OfiEntity> queryWrapper = Wrappers.query();
        queryWrapper.lambda().eq(OfiEntity::getClusterId, clusterId);

        setSelectQueryWrapper(dto, queryWrapper.lambda());

        setLikeQueryWrapper(dto, queryWrapper.lambda());

        dto.setOrderQueryWrapper(queryWrapper);

        Page<OfiEntity> ofiEntityPage = new Page<>(dto.getPage(), dto.getPageSize());
        ofiEntityPage = getBaseMapper().selectPage(ofiEntityPage, queryWrapper);

        return ListPage.of(ofiEntityPage);
    }

總結(jié)

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

相關(guān)文章

  • MyBatis之自查詢(xún)使用遞歸實(shí)現(xiàn) N級(jí)聯(lián)動(dòng)效果(兩種實(shí)現(xiàn)方式)

    MyBatis之自查詢(xún)使用遞歸實(shí)現(xiàn) N級(jí)聯(lián)動(dòng)效果(兩種實(shí)現(xiàn)方式)

    這篇文章主要介紹了MyBatis之自查詢(xún)使用遞歸實(shí)現(xiàn) N級(jí)聯(lián)動(dòng)效果,本文給大家分享兩種實(shí)現(xiàn)方式,需要的的朋友參考下吧
    2017-07-07
  • 深入學(xué)習(xí)MyBatis中的參數(shù)(推薦)

    深入學(xué)習(xí)MyBatis中的參數(shù)(推薦)

    大家日常使用MyBatis經(jīng)常會(huì)遇到一些異常,想要避免參數(shù)引起的錯(cuò)誤,我們需要深入了解參數(shù)。想了解參數(shù),我們首先看MyBatis處理參數(shù)和使用參數(shù)的全部過(guò)程。下面這篇文章主要給大家介紹了MyBatis中參數(shù)的的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • Spring實(shí)現(xiàn)處理跨域請(qǐng)求代碼詳解

    Spring實(shí)現(xiàn)處理跨域請(qǐng)求代碼詳解

    這篇文章主要介紹了Spring實(shí)現(xiàn)處理跨域請(qǐng)求代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • java實(shí)現(xiàn)鮮花銷(xiāo)售系統(tǒng)

    java實(shí)現(xiàn)鮮花銷(xiāo)售系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)鮮花銷(xiāo)售系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • jdbc中class.forname的作用

    jdbc中class.forname的作用

    這篇文章主要介紹了jdbc中class.forname的作用,使用示例說(shuō)明了他作用及使用方法,大家參考使用吧
    2014-01-01
  • springboot3環(huán)境隔離的實(shí)現(xiàn)

    springboot3環(huán)境隔離的實(shí)現(xiàn)

    在開(kāi)發(fā)中,環(huán)境很多,本文主要介紹了springboot3環(huán)境隔離的實(shí)現(xiàn),能夠快速切換開(kāi)發(fā)、測(cè)試、生產(chǎn)環(huán)境,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 詳解SpringMVC的攔截器鏈實(shí)現(xiàn)及攔截器鏈配置

    詳解SpringMVC的攔截器鏈實(shí)現(xiàn)及攔截器鏈配置

    攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器參數(shù)及攔截器鏈配置,感興趣的可以嘗試一下
    2022-08-08
  • Java緩存Map設(shè)置過(guò)期時(shí)間實(shí)現(xiàn)解析

    Java緩存Map設(shè)置過(guò)期時(shí)間實(shí)現(xiàn)解析

    這篇文章主要介紹了Java緩存Map設(shè)置過(guò)期時(shí)間實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot中SM2公鑰加密、私鑰解密的實(shí)現(xiàn)示例詳解

    SpringBoot中SM2公鑰加密、私鑰解密的實(shí)現(xiàn)示例詳解

    本文介紹了如何在SpringBoot項(xiàng)目中實(shí)現(xiàn)SM2公鑰加密和私鑰解密的功能,通過(guò)使用Hutool庫(kù)和BouncyCastle依賴(lài),簡(jiǎn)化了SM2加密的實(shí)現(xiàn)過(guò)程,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-07-07
  • 用java實(shí)現(xiàn)楊輝三角的示例代碼

    用java實(shí)現(xiàn)楊輝三角的示例代碼

    本篇文章主要介紹了用java實(shí)現(xiàn)楊輝三角的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論

商丘市| 遂平县| 牟定县| 普宁市| 香港| 望奎县| 都兰县| 庐江县| 昆明市| 宁河县| 赤城县| 北票市| 鄂托克旗| 来凤县| 梧州市| 托里县| 彭阳县| 卢湾区| 阿尔山市| 淳安县| 镶黄旗| 吉林市| 江城| 靖边县| 巍山| 荥经县| 锦屏县| 新泰市| 靖江市| 塘沽区| 和硕县| 若尔盖县| 祁阳县| 茂名市| 商河县| 许昌市| 姜堰市| 永登县| 马山县| 彩票| 驻马店市|