MyBatis-Plus 實現(xiàn)動態(tài)字段排序 焦點關注
時間:2023-06-22 20:16:27
(資料圖片)
場景
雖然前端能根據(jù)返回的數(shù)組進行對字段的排序,但也僅局限于實現(xiàn)當前頁的排序,無法滿足全部數(shù)據(jù)的排序,所以需要走接口的查詢進行排序,獲取最全的排序數(shù)據(jù)。
思路
- 前端需傳遞排序的字段,該字段是正序還是倒敘。可能存在多個,所以字段為字符串數(shù)組,可以通過逗號分開。
- 后端拿到參數(shù)后,如果字段名是駝峰命名,需要轉為小寫字母+下劃線命名。
- 將處理后的字段進行排序sql上的拼接處理后,拼接到 order by 語句后面,得到order by語句。
- 根據(jù)MyBatis-Plus的
last方法,將處理的order by語句進行拼接到查詢sql語句后面。
實現(xiàn)
- 前端傳遞的參數(shù)格式為:
{ "sort": "userName,updateTime", "order": "asc,desc"}- 后端接收排序對象
Sorter,那個請求查詢用到自定義排序就繼承該類:
import io.swagger.annotations.ApiModelProperty;import lombok.Data;/** 1. 基礎排序對象,包含排序字段和排序方式 */@Datapublic class Sorter{ @ApiModelProperty(value = "排序字段",example = "userName") private String sort; @ApiModelProperty(value = "排序方式",example = "asc/desc") private String order; /** * 根據(jù)查詢條件拼接得到order by語句 * @param sorter 分頁查詢條件 * @return String */ public static String getStatement(Sorter sorter) { String sort; String[] sortArray = {}; String[] orderArray = {}; String order = sorter.getOrder(); String sortColumn = sorter.getSort(); StringBuilder statement = new StringBuilder(); // 多字段排序 if (StringUtils.isNotEmpty(sortColumn)) { // 駝峰命名轉為下劃線 sort = StringUtils.toUnderScoreCase(sortColumn); if (sort.contains(",")) { sortArray = sort.split(","); } } else { return ""; } if (StringUtils.isNotEmpty(order)) { if (order.contains(",")) { orderArray = order.split(","); } } else { return ""; } if (sortArray.length > 0 && orderArray.length > 0) { int length = sortArray.length; for (int i = 0; i < length; i++) { statement.append(sortArray[i]); statement.append(" "); statement.append(orderArray[i]); if (i < length - 1 ) { statement.append(", "); } } } else { // " #{sort} #{order}“ statement.append(sort); statement.append(" "); statement.append(order); } return statement.toString(); } /** * 根據(jù)查詢條件拼接得到order by語句 * @param sorter 分頁查詢條件 * @return String */ public static String getOrderByStatement(Sorter sorter) { String statement = getStatement(sorter); if (StringUtils.isNotEmpty(statement)) { return " order by " + statement; } else { return statement; } }}- 處理字段駝峰式的工具類:
/** 3. 字符串工具類 4. 5. @author lcl */public class StringUtils extends org.apache.commons.lang3.StringUtils{ /** 下劃線 */ private static final char SEPARATOR = "_"; /** * * 判斷一個字符串是否為非空串 * * @param str String * @return true:非空串 false:空串 */ public static boolean isNotEmpty(String str) { return !isEmpty(str); } /** * 駝峰轉下劃線命名 */ public static String toUnderScoreCase(String str) { if (str == null) { return null; } StringBuilder sb = new StringBuilder(); // 前置字符是否大寫 boolean preCharIsUpperCase = true; // 當前字符是否大寫 boolean curreCharIsUpperCase = true; // 下一字符是否大寫 boolean nexteCharIsUpperCase = true; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (i > 0) { preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); } else { preCharIsUpperCase = false; } curreCharIsUpperCase = Character.isUpperCase(c); if (i < (str.length() - 1)) { nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); } if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { sb.append(SEPARATOR); } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { sb.append(SEPARATOR); } sb.append(Character.toLowerCase(c)); } return sb.toString(); }}- 請求查詢的入?yún)ο罄^承
Sorter排序對象:
- Mapper層直接調用
last在sql尾拼接語句方法,將Sorter的getOrderByStatement(Sorter sorter)方法傳入:
結果
相關稿件
MyBatis-Plus 實現(xiàn)動態(tài)字段排序 焦點關注
告別五花八門的車身,貴陽出租車將統(tǒng)一換裝亮相!“新衣”長這樣
科學家利用 AI 識別熱門歌曲,準確率高達 97%|世界今亮點
新年快樂鋼琴譜簡單版(新年快樂365hddvd)|天天報資訊
劉詩詩《白日提燈》籌拍,男主之爭愈演愈烈,潘粵明或也有望入局
訊息:【有趣】第79期:十幾塊錢的散熱器憑什么可以鎮(zhèn)壓i7處理器?
湖南慈利一女子派出所等候詢問時死亡 家屬稱希望看到派出所內全部監(jiān)控_世界熱訊
2023縱覽高招會丨河北地質大學:在河北招生計劃為2180人 計算機科學與技術專業(yè)(校企深度合作辦學項目)首次招生 全球熱推薦
高標準建設紅色旅游驛站 新平臺整合綠色文旅資源——敦化市雁鳴湖鎮(zhèn)推進鄉(xiāng)村旅游量質齊飛
魔獸世界靈翼幼龍聲望怎么開啟(wowtbc懷舊服靈翼幼龍聲望開啟方法)
拉夏貝爾正式破產(chǎn)清算 網(wǎng)友:曾是我的青春回憶……
618的新戰(zhàn)役:談布局、拼低價、更落地|當前熱聞


