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

Mybatis實現(xiàn)動態(tài)排序方式

 更新時間:2022年10月25日 11:01:10   作者:LitongZero  
這篇文章主要介紹了Mybatis實現(xiàn)動態(tài)排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Mybatis實現(xiàn)動態(tài)排序

在數(shù)據(jù)展示時,很有可能碰到,需要動態(tài)排序的需求。當數(shù)據(jù)比較少的時候,還可以前端排序,但是,當數(shù)據(jù)非常大,尤其是涉及到分頁的時候,就必須要用后端解決了。

以下,提供一種后端動態(tài)排序解決方案。

比如,現(xiàn)在我要查詢用戶信息(User)表。

可以在查詢時,接口中,多添加兩個字段。

  • orderField(排序列)
  • orderType(排序規(guī)則,升降序)

之后,在mapper.xml中的查詢列表方法,添加

SELECT?
name , sex , age , user_grade as userGrade
FROM user
<if test="orderField !=null and orderField != '' ">
? ? order by ${orderField} ?${orderType}
</if>

注意事項:使用這樣連續(xù)拼接兩個注入參數(shù)時,只能用${},不能用#{}。

詳情可以查看解釋

這時,在我們查詢時,可以在傳入參數(shù)

User user = new User();
//以user_grade字段排序
user.setOrderField("user_grade");
//降序
user.setOrderType("desc");
//可在User類中添加
//在未傳入時,使用set注入,設置默認值
public String getOrderField() {
?? ??? ?if (orderField == null || "".equals(orderField)) {
?? ??? ??? ?orderField = "create_time";
?? ??? ?}
?? ??? ?return orderField;
?? ?}
?? ?public String getOrderType() {
?? ??? ?if (orderType == null || "".equals(orderType)) {
?? ??? ??? ?orderType = "desc";
?? ??? ?}
?? ??? ?return orderType;
?? ?}

如果,你覺得傳入數(shù)據(jù)庫中字段user_grade很不舒服的話。可以這樣寫SQL

SELECT?
name , sex , age , user_grade as userGrade
FROM user
<if test="orderField != null" >
?? ?ORDER BY
?? ?<choose>
?? ??? ?<when test="orderField == 'name'">
?? ??? ??? ?name ${orderType}
?? ??? ?</when>
?? ??? ?<when test="orderField == 'age'">
?? ??? ??? ?age ${orderType}
?? ??? ?</when>
?? ??? ?<when test="orderField == 'userGrade'">
?? ??? ??? ?user_grade ${orderType}
?? ??? ?</when>
?? ??? ?<otherwise>
?? ??? ??? ?create_time ${orderType}
?? ??? ?</otherwise>
?? ?</choose>
</if>

然后再傳入字段時,就這樣

user.setOrderField("userGrade");

Mybatis動態(tài)排序不生效問題

sql如下:

select * from ?table_name order by #{field}

造成問題原因

mybatis動態(tài)參數(shù)

#{}方式傳參數(shù)會使用preparedstatement預編譯處理方式,參數(shù)是以?占位符的方式傳遞??梢钥吹絤ybaits的sql日志如下:

==> Preparing: SELECT * FROM table_name ORDER BY ?
==> Parameters: time(String)

preparedstatement預編譯方式的參數(shù)替換的原理1可知預編譯方式會對參數(shù)加上’'引號,生成的最終sql如下:

SELECT * FROM table_name ORDER BY 'time'

以上sql數(shù)據(jù)庫不能正常解析 order by 后面的字段,這就是我們排序失效的原因

解決辦法

將#{}參數(shù)方式改成${}參數(shù)方式即可。

原因: ${}參數(shù)的方式是簡單的字符串替換。

在動態(tài)解析階段,該 sql 語句會被解析成:

select * from table_name order by time

小結一下:

  • #{}方式傳參數(shù)只能處理值參數(shù) 不能傳遞表名,字段等參數(shù)
  • ${}字符串替換,可以動態(tài)處理表名,字段參數(shù),但是使用這種方式必須注意sql注入的風險,對參數(shù)做好校驗處理

備注:preparedstatement具體實現(xiàn)原理見:com.mysql.jdbc.PreparedStatement中的setString方法源碼

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 新版idea創(chuàng)建spring boot項目的詳細教程

    新版idea創(chuàng)建spring boot項目的詳細教程

    這篇文章給大家介紹了新版idea創(chuàng)建spring boot項目的詳細教程,本教程對新手小白友好,若根據(jù)教程創(chuàng)建出現(xiàn)問題導致失敗可下載我提供的源碼,在文章最后,本教程較新,文中通過圖文給大家介紹的非常詳細,感興趣的朋友可以參考下
    2024-01-01
  • 關于Kill指令停掉Java程序的問題

    關于Kill指令停掉Java程序的問題

    這篇文章主要介紹了Kill指令停掉Java程序的思考,主要探究kill指令和java的關閉鉤子的問題,需要的朋友可以參考下
    2021-10-10
  • 五分鐘帶你快速學習Spring?IOC

    五分鐘帶你快速學習Spring?IOC

    這篇文章主要給大家介紹了關于如何通過五分鐘快速學習Spring?IOC的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • 詳解Java解析XML的四種方法

    詳解Java解析XML的四種方法

    本篇文章主要介紹了java解析XML的幾種方式,XML現(xiàn)在已經成為一種通用的數(shù)據(jù)交換格式,給數(shù)據(jù)集成與交互提供了方便,有需要的可以了解一下。
    2016-11-11
  • SpringBoot 自動裝配的原理詳解分析

    SpringBoot 自動裝配的原理詳解分析

    這篇文章主要介紹了SpringBoot 自動裝配的原理詳解分析,文章通過通過一個案例來看一下自動裝配的效果展開詳情,感興趣的小伙伴可以參考一下
    2022-08-08
  • 解析Java格式字符串的使用

    解析Java格式字符串的使用

    本文通過實例給大家介紹了java格式字符串的使用,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-02-02
  • RabbitMQ冪等性與優(yōu)先級及惰性詳細全面講解

    RabbitMQ冪等性與優(yōu)先級及惰性詳細全面講解

    關于MQ消費者的冪等性問題,在于MQ的重試機制,因為網絡原因或客戶端延遲消費導致重復消費。使用MQ重試機制需要注意的事項以及如何解決消費者冪等性與優(yōu)先級及惰性問題以下將逐一講解
    2022-11-11
  • AsyncHttpClient的默認配置源碼流程解讀

    AsyncHttpClient的默認配置源碼流程解讀

    這篇文章主要為大家介紹了AsyncHttpClient的默認配置源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • SpringBoot配置log4j2的實現(xiàn)示例

    SpringBoot配置log4j2的實現(xiàn)示例

    SpringBoot中默認使用Logback作為日志框架,本文主要介紹了SpringBoot配置log4j2的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Mockito 結合 Springboot 進行應用測試的方法詳解

    Mockito 結合 Springboot 進行應用測試的方法詳解

    這篇文章主要介紹了Mockito 結合 Springboot 進行應用測試的方法詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論

道真| 巴东县| 桐乡市| 钦州市| 中超| 东方市| 青川县| 博罗县| 酒泉市| 海淀区| 汝城县| 怀远县| 肥城市| 龙泉市| 莆田市| 青海省| 灵川县| 桂林市| 图们市| 栾城县| 英超| 呼伦贝尔市| 牡丹江市| 望谟县| 田阳县| 多伦县| 商都县| 七台河市| 青田县| 城市| 大冶市| 明光市| 晋宁县| 济源市| 神农架林区| 建平县| 酒泉市| 建始县| 仙居县| 开鲁县| 屯昌县|