Mybatis order 排序问题

mysql、mybatis、QueryWrapper的排序与mybatis的xml编写 最后一种相当于第一种。 阅读详情
曾写过一篇博客,是接触了一段时间的mybatis开发总结的:《Mybatis,怀疑--使用--感悟》。又过去了一段时间,前不久和别人联调接口,遇到了mybatis的排序问题。这篇博客就来总结一下,在mybatis框架下,如何实现排序?
    排序,是个很基础的需求。实现的时候只需要在查询语句后面加上order by 某个字段即可。在mybatis中,用工具可以帮助我们自动生成底层的一套东西,便可以满足我们基本的增删改查需求。那么,怎么样可以在select语句后面加上order by语句呢?下面就结合项目中的实践来分享给大家。
    【方法一 Example中处理排序】
    用mybatis自动生成工具,会生成几个文件,其中包括~Mapper.XML和~Example文件。我们能够实现基本的增删改查,也是建立在这几个文件的基础上。不知道大家有没有注意过~Mapper.XML 文件中SelectByExample中有排序的语句?如下图所示:

    所以说,在我们逻辑层代码中,利用Example进行条件查询的时候,也可以将orderBy条件写上,具体代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public List<Article> findAllArticles() {  
  2.         ArticleExample example = new ArticleExample();  
  3.         example.setOrderByClause("`index` ASC,id ASC");  
  4.         List<Article> list = articleMapper.selectByExample(example);  
  5.         LOG.debug("findArticles with site={} and categoryId={} return: {}",  
  6.                 list);  
  7.         return list;  
  8.     }    


   【方法二 PageBounds中处理排序】
    PageBounds,分页,这也是一个很基本的需求。在项目中,直接引入了mybatis封装好的插件。
		
    而你如果看过这里面的源码,你会发现,其中也给我们提供了一个排序的实现。也就是说,若接口中包含分页参数,你完全可以利用分页去实现排序。下面是我单元测试中的代码:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void findArticlesByCategory1() {  
  2.         // 分页中实现排序,利用下面封装好的方法,传参数即可  
  3.         /* 
  4.          * public PageBounds(int page, int limit, List<SortBy> orders) { 
  5.          * this(page, limit, orders, true); } 
  6.          */  
  7.         PageBounds pb = new PageBounds(1, 3, new SortBy("index",  
  8.                 Direction.DESC, "`index`"));  
  9.         Response<List<ArticleModel>> response = articleService  
  10.                 .findArticlesByCategory("INFO", "main_app_info", pb);  
  11.         Assert.assertTrue(response.getData().size() > 0);// 正常  
  12.     }   
    结果可以实现排序吗?答案是,可以实现,但是并没有实现。却报错了:


    但如果,我将排序字段改了,根据id排序,代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void findArticlesByCategory1() {  
  2.         // 分页中实现排序,利用下面封装好的方法,传参数即可  
  3.         PageBounds pb = new PageBounds(1, 3, new SortBy("id", Direction.DESC,  
  4.                 "id"));  
  5.         Response<List<ArticleModel>> response = articleService  
  6.                 .findArticlesByCategory("INFO", "main_app_info", pb);  
  7.         Assert.assertTrue(response.getData().size() > 0);// 正常  
  8.         System.out.print(response.getData());  
  9.     }    
    测试是可以通过的。再回到出错的截图上, 为什么我框出了order by的语句部分呢。因为出错的原因就在这里了。index属于关键字,写一个简单的'select * from Table order by index DESC',在mysql数据库中都会执行出错,所以,我在代码中给index加了``符号,但生成后的语句,并没有带符号。
    这样看来,就是因为index关键字转换不了的原因,所以没法实现在分页中用该字段去排序。哎,前期的数据表设计的人都没见过,不会让我因为这个又重新生成一套底层文件吧。这都已经上了生产的项目,这样的改动太大了。
    但我想到的是,实际上,自己也实现了在example中去根据index字段排序的。我可以用example去给它排好序,但因为接口是要提供给其它平台的,而调用此接口的人也不是一方,一边需要按'index'字段排序,而另一边又不需要,这样就不能都满足了。
    所以,最后的解决办法就是【方法一 + 方法二 = 方法三】
    【方法三 Example与PageBounds结合排序】
    调用此接口的,根据自己的需要传入对应的参数,如果不需要按某字段排序,只需要传入 int page, int limit即可;如果需要按某字段排序,传入的参数包括 int page, int limit,List<SortBy>.而我的逻辑代码只需要判断一下,如果传入了排序字段,先从List<SortBy>中获取,再写入到Example中,这样,index关键字的问题解决了,排序的灵活性也解决了。
    具体代码如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public List<Article> findArticlesByCategoryId(String site, Long catId,  
  2.             PageBounds pb) {  
  3.         ArticleExample example = new ArticleExample();  
  4.         example.createCriteria().andSiteLike("%" + site + "%")  
  5.                 .andCatIdEqualTo(catId).andIsDeletedEqualTo(false)  
  6.                 .andStatusEqualTo(article_published)  
  7.                 .andPublishTimeLessThanOrEqualTo(new Date()); // 添加筛选条件:未删除的,已发布的,且发布时间小于或等于当前时间  
  8.         List<SortBy> sortBies = new ArrayList<SortBy>();  
  9.         sortBies = pb.getOrders();  
  10.         if (sortBies != null && !sortBies.isEmpty()) {  
  11.             String orderString = "";  
  12.             String orderDirection = "";  
  13.             for (SortBy sortBy : sortBies) {  
  14.                 orderString = sortBy.getOrderExpr();  
  15.                 Direction direction = sortBy.getDirection();  
  16.                 orderDirection = direction.toString();  
  17.             }  
  18.   
  19.             pb.setOrders(null);  
  20.             // 前端需要,按显示顺序字段排序。若传了排序参数,则按参数进行排序  
  21.             example.setOrderByClause(orderString + " " + orderDirection);  
  22.         }  
  23.   
  24.         List<Article> list = articleMapper.selectByExample(example, pb);  
  25.         LOG.debug("findArticles with site:{} and categoryId={} return: {}",  
  26.                 site, catId, list);  
  27.         return list;  
  28.     }  
【项目总结】
    最开始接触排序的问题是因为我们平台端的需要, 很多东西他们封装好了,我 就在项目中一层层的找代码,同时也上网查了查mybatis中可以如何实现排序。
     第一种方法Example中设置排序就是我从查资料中获取到的。后来遇到了问题,看代码的时候就发现在PageBounds中也有一套排序,而且默认了是按每个表中的create_time字段排序的。猜想是两者发生了冲突,所以直接将PageBounds中的排序给set null值了。我的问题也解决了。
    这一次,通过给其它平台联调,让我接触到了第二种方法,原来mybatis封装好的分页插件可以这样玩。同样,也收获到了1+1>2的效果,两者的结合,更是很简单地解决了我遇到的问题。

Springboot Mybatis 自定义顺序排序查询,指定某个字段 阅读详情

相关推荐

MyBatis使用技巧-根据传入字段排序

mybatis排序时使用order by 动态参数时需要注意,用$而不是# #{} ,会对自动传入的数据加一个双引号,导致排序失败,如 order by #{age},解析结果 order by "age" ${},不会对传入值添加引号,但是可能会发生SQL注入,如 order by ${age},解析结果 order by age 对比如上,小伙伴自行斟酌,也避免少走弯路。 ...

程序猿凹凸 4255

Mybatis实现 动态排序

Mybatis实现 动态排序 在数据展示时,很有可能碰到,需要动态排序的需求。当数据比较少的时候,还可以前端排序,但是,当数据非常大,尤其是涉及到分页的时候,就必须要用后端解决了。 以下,提供一种后端动态排序解决方案。 比如,现在我要查询用户信息(User)表。 可以在查询时,接口中,多添加两个字段。 orderField(排序列) orderType(排序规则,升降序) 之后,在mapper...

LitongZero的博客 2万+

使用VIVADO 2019.1 搭建以太网接口

以太网 MAC+SGMII->GMII接口转换 以FPGA V7为例,搭建一个千兆以太网接口。运行环境为Vivado2019.1。板卡的FPGA V7与千兆网口芯片采用SGMII互联,最终实现FPGA与上位机之间的千兆网卡通信,实际实现时,V7采用MAC + GMII ->SGMII的结构。SGMII接口使用1G/2.5G Ethernet PCS/PMA or SGMII ip核,MAC层使用Tri Mode Ethernet MAC ip核。 由于MAC层IP不支持SGMII接口,因此需要G

qq_44641513的博客 8414

Mybatis—Order By排序

利用Mybatis逆向自动生成,—Example.java,—Mapper.xml文件。 一、—Mapper.xml文件,一个自动生成的查询方法,我们可以看到有order by排序语句。 二、所以我们在逻辑层可以将排序条件加上,以以下例子为例,这里我是按审核状态升序查询。只需要我们在Controller加上example.setOrderByClause(" card_sts ASC");如果你...

凤凰涅槃 4万+

LAMMPS in文件详解:从零开始手把手教你配置金属分子动力学模拟

本文详细解析了LAMMPS in文件的配置方法,手把手教你完成金属分子动力学模拟的全流程。从软件环境准备、势函数选择,到使用Materials Studio构建模型、编写in文件进行能量最小化与系统弛豫,再到实施单轴拉伸生产模拟并提取应力应变数据,最后通过Python和OVITO进行结果分析与可视化,提供了完整的实战指南和常见问题排查技巧。

weixin_28475533的博客 527

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 335

Mybatis ORDER BY 排序失效 & ORDER BY 与 CASE WHEN THEN 排序问题

如果传递给 mapper 的参数值是以#{test_参数}的形式,那么就会报错具体如下:传递参数是name排序规则是升序

Muxiu 4837

C# ArcGIS Engine二次开发——实现“加载shp文件”

private void AddShpDataToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog OpFileDialog=new OpenFileDialog();//OpenFileDialog:打开文件对话框 OpFileDialog.Title="添加矢量数据"; OpFileDialog.Filter="(*.shp)|*.shp";//filter:过滤器;"(*.shp)|*.shp"

weixin_42191203的博客 5254

Mybatis,Order By排序问题

曾写过一篇博客,是接触了一段时间的mybatis开发总结的:《Mybatis,怀疑--使用--感悟》。又过去了一段时间,前不久和别人联调接口,遇到了mybatis的排序问题。这篇博客就来总结一下,在mybatis框架下,如何实现排序?     排序,是个很基础的需求。实现的时候只需要在查询语句后面加上order by 某个字段即可。在mybatis中,用工具可以帮助我们自动生成底层的一套东西,便

Dream it Possible 15万+

MT6768平台Sensor Bring Up全流程实战:从驱动添加到问题排查(附避坑指南)

本文详细介绍了联发科MT6768平台Sensor Bring Up的全流程实战指南,从驱动添加、硬件配置到问题排查,提供了全面的避坑建议。内容涵盖环境准备、驱动文件集成、硬件接口配置、编译系统适配以及常见问题解决方案,帮助开发者高效完成传感器集成与调试工作。

weixin_30374009的博客 416

Allegro23.1新功能之软件自带阻抗计算工具操作指导

Allegro升级到了23.1后,软件新增了一个自带阻抗计算的功能,如下图。Propagation velocity:传输速度,单位是光速的多少倍。Dielectric constant输入介电常数,这里使用常规4。新功能之软件自带阻抗计算工具。如何使用,具体操作如下。

weixin_54787054的博客 782

mybatis多字段排序_解决mybatis中order by排序无效问题

1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id"。2、$将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order ...

weixin_39888082的博客 3393

QGIS004:【05矢量属性表】-保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段

摘要:QGIS矢量属性表工具箱包括保留字段、删除字段、添加唯一值索引字段、添加字段到属性表、添加自增量字段、添加XY字段到图层、文本型转浮点型、重构字段、重命名字段等选项,本文介绍各选项的基本操作。

qq_31762031的博客 2311

mybatis动态order by 排序问题

问题 sql查询需要根据条件动态修改排序字段以及升降序; 刚开始尝试在sql中直接使用choose when进行判断: <choose> <when test="flag== '5'"> order by A_DATE desc </when> <otherwise> order by B_DATE asc </otherwise>

weixin_43996353的博客 2446

机器学习实战4-教育领域:学生成绩的可视化分析与成绩预测-详细分析

大家好,我是微学AI,今天给大家带来机器学习实战4-学生成绩的可视化分析与成绩预测,机器学习在教育中的应用具有很大的潜力,特别是在学生成绩的可视化分析与成绩预测方面。机器学习可以通过对学生的父母教育情况和学校表现等数据进行分析和挖掘,从而揭示潜在的学习模式和趋势。

微学AI的博客 7676

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

mybatis ORDER BY排序问题

select from tb_user where yhbhid = #{yhbhid,jdbcType=INTEGER} ORDER BY ${'yhbhid '} DESC 注意:用order by 排序时  要用“$”符,不能使用“#”,不解释为什么,百度有很多可以查            “{}”里的变量一定要用单引号 '' 包起来(${'yhbhid

hzpscsnd的博客 4791

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

MyBatis中order by排序无效的问题

在使用MyBatis解析xml进行排序的时候,遇见排序无效的问题! #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by "id" $将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的s

早起的鸟儿有虫吃的博客 1154

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

by mybatis 自定义order_Mybatis,Order By排序问题

public void findArticlesByCategory1() {// 分页中实现排序,利用下面封装好的方法,传参数即可PageBounds pb = new PageBounds(1, 3, new SortBy("id", Direction.DESC,"id"));Response> response = articleService.findArticlesByCateg...

weixin_35837926的博客 1320

Mybatis中order by排序问题

日前,在做动态字段排序功能时遇到的了问题,sql语法都对了,也能在数据库中正确执行,但就是在代码中执行的时候未有正确结果返回。整了许久,才找到了以下几篇关于mybatis排序的问题,原来竟然受接收参数方式的影响:${parameter}和#{parameter},可能是mybatis的特殊处理。但是,对于${ }的用法,需要注意以下几点:   ${}方式存在sql注入,所以,对于使用前端传过来...

mtry技术栈 5659

mybatis中order by排序无效问题

mybatis中 $,# 的区别,在order by时转义导致无效

拌面鲈鱼的博客 1万+

MyBatis 性能优化与问题分析:Mybatis使用PageHelper分页时,使用order by语句排序后,获取到的分页数据不正确

获取到的列表数据不正确,出现重复数据的问题,SQL如下,原因是由于表中的create_time为空或相同引起的。使用pageHelp分页。

weixin_43833540的博客 1297

by mybatis 自定义order_关于实现mybatis order by 排序传递参数实现 问题记录

一 问题场景:本人项目纯纯的后端系统 并且项目前端采用纯纯的原生js 实现1)表格 通过查询列表数据放入到域中 前段采用 for循环的方式实现遍历生成列表2)分页实现本人是公司内部自定义实现的分页没有采用任何外部框架 分页实现是公司内部自定义封装的要求:要点击列表表头字段实现按照表头信息排序解决思路:由于我的列表是由多个表中数据关联查询出来的所以要实现根据不同的列头实现排序 那么...

weixin_30166691的博客 614

Mybatis传参使用order by排序无效问题解决方法

今天遇到这么个问题,用easyui的romoteSort进行单个字段的全局排序 在sql上拼接order by  #{sort:VARCHAR}   #{order:VARCHAR} 传参没问题,sql能正常执行,debug返回列表很明显没有排序啊 一步一步排除,确定问题出在sql 对于这种#{sort:VARCHAR} 的变量,Mybatis会将其视为字符,给变量值加上引号 假如传入参...

weixin_39584227的博客 1824

mybatis模糊查询order by排序问题

前提: order by #{param1} #{param2} ,排序字段 和 排序顺序字段是作为参数传递进来的 因为#{}格式的语法会将sql语句进行预处理,最终会用字符串替换 传递进来的参数,这时排序就不起作用了,我们可以用order by ${param1} ${param2} 来替换。但是,这会导致潜在的SQL注入攻击,因此不应该允许用户输入这些字段。 如果排序字段必须是由用户传递...

qq_42945742的博客 1075
上一篇: redis 最好的 GUI 客户端工具
下一篇: 如何通过 Mybatis 向Mysql 插入Date 或者DateTime
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值