文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Mybatis实现动态排序方式

2022-11-13 18:50

关注

Mybatis实现动态排序

在数据展示时,很有可能碰到,需要动态排序的需求。当数据比较少的时候,还可以前端排序,但是,当数据非常大,尤其是涉及到分页的时候,就必须要用后端解决了。

以下,提供一种后端动态排序解决方案。

比如,现在我要查询用户信息(User)表。

可以在查询时,接口中,多添加两个字段。

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

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

注意事项:使用这样连续拼接两个注入参数时,只能用${},不能用#{}。

详情可以查看解释

这时,在我们查询时,可以在传入参数

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;
    }

如果,你觉得传入数据库中字段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动态排序不生效问题

sql如下:

select * from  table_name order by #{field}

造成问题原因

mybatis动态参数

#{}方式传参数会使用preparedstatement预编译处理方式,参数是以?占位符的方式传递。可以看到mybaits的sql日志如下:

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

preparedstatement预编译方式的参数替换的原理1可知预编译方式会对参数加上’'引号,生成的最终sql如下:

SELECT * FROM table_name ORDER BY 'time'

以上sql数据库不能正常解析 order by 后面的字段,这就是我们排序失效的原因

解决办法

将#{}参数方式改成${}参数方式即可。

原因: ${}参数的方式是简单的字符串替换。

在动态解析阶段,该 sql 语句会被解析成:

select * from table_name order by time

小结一下:

备注:preparedstatement具体实现原理见:com.mysql.jdbc.PreparedStatement中的setString方法源码

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯