MySQL 按照数据库表字段动态排序 查询列表信息
MySQL 按照数据库表字段动态排序 查询列表信息
背景描述
项目中数据列表分页展示的时候,前端使用的Table组件,每列自带对当前页的数据进行升序或者降序的排序。
但是客户期望:随机点击某一列的时候,对查询到的所有数据进行排序。
举例说明:
查询到的有100条数据,每页10条,共10页。前端Table组件,可以对当前页的10条数据,进行排序,其他的9页并不参与排序。
但是,实际期望是对查询到的10页数据均参与排序。
并且不是特定列,而是每列均可以按照升序或者降序,将查询到的结果进行再次排序。
处理方式
由于前端技术的限制,需要在后端进行处理,对查询列表的接口进行修改。
1、修改查询实体类
首先需要在查询条件的请求实体中,增加两个字段 orderField 和 orderType,用于保存传入字段名和排序的方式(升序ASC,降序DESC)
orderField:用于接收需要排序的字段
orderType:用于接收排序的方式,ASC,DESC,asc,desc
代码如下:
// 对字段进行排序 private String orderField; // 存放排序字段 private String orderType; // ASC DESC public String getOrderField() { return orderField; } public void setOrderField(String orderField) { this.orderField = orderField; } public String getOrderType() { return orderType; } public void setOrderType(String orderType) { this.orderType = orderType; }
2、修改 mapper.xml 文件
找到MyBatis的Mapper文件中,在查询列表方法的SQL。
增加如下代码:
<if test="orderField != null and orderField != '' and orderType != null and orderType != ''"> ORDER BY ${orderField} ${orderType} </if>
【特别注意】:此处SQL的两个参数,一定要使用 ${ } 接收,而不能使用 #{ }。否则,不会到达预期的效果。
${ }:不会对传入的字符串进行处理。比如:传入的是 create_time 和 desc,${ }处理后的效果是 ORDER BY create_time desc,可以实现按照 create_time字段倒序排序的效果。
#{ }:会对传入的字符串进行处理。比如:传入的是 create_time 和 desc,#{ }处理后的效果是 ORDER BY 'create_time' 'desc',会当成字符串常量,达不到按照 create_time字段倒序排序的效果。
当然,${ }可能会引发SQL注入。一般情况下,都是使用 #{ }的。只有这种不需要对传入的值进行转换的场景,才会使用 ${ }。
为了实现标题中的功能,恰好用到了 ${ } 的 这个特性而已。
3、增加接口调用字段
在传参时,增加 orderField 和 orderType ,效果如下
{ "pageNum":1, "pageSize":5, "orderField":"create_time", "orderType":"desc" }
至此,按照传入的字段名和排序方式进行排序的功能就实现了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)