mybatis如何实现的数据库排序

 更新时间:2022年03月22日 15:37:49   作者:黄小鱼ZZZ  
这篇文章主要介绍了mybatis如何实现的数据库排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis数据库排序

今天用到了对数据库按照倒序进行输出。因为刚接触mybatis,所以对这方面还不是太了解,再网上搜了好长时间终于找到了一些有用的信息。

我的目标是这样的,数据库中的信息分为无效和有效,对数据库中的信息的有效值按照倒序进行输出,输出到表格中,

在网上看到了这样的语句,SELECT * FROM photo ORDER BY id DESC;于是我就直接拿过来用了,但是却出现了问题,因为我的是有条件排序的,

尝试了几次后我发现是这样写的, select 

<include refid="Base_Column_List" />
from manager_user where is_valid = 1 

ORDER BY id DESC;这样的话输出的内容就达到了我的目标,将语句中的desc换成asc就可以进行升序排序

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,则解析成的sql为order by id。

方式能够很大程度防止sql注入

  • $方式无法防止Sql注入。
  • $方式一般用于传入数据库对象,例如传入表名。
  • 一般能用#的就别用$。

order by 之后要使用$而非#

附解决代码段:

其中orderByField就是传入进行排序的参数值!

<choose>
  <when test="orderByField != null and orderByField !=''">
    <choose><when test="isAsc == true">
      order by ${orderByField} ASC
  </when>
  <otherwise>
    order by ${orderByField} DESC
  </otherwise></choose>
  </when>
<otherwise>
  order by id DESC

</otherwise></choose>

  ORDER BY
        <choose>
        <when test="sort!=null">
                #{sort,jdbcType=VARCHAR}
            <if test="order!=null">
                #{order,jdbcType=VARCHAR}
            </if>
        </when>
        <otherwise>
            id asc , create_time asc
        </otherwise>
     </choose>

原因是: #{order,jdbcType=VARCHAR},MyBatis会自动将排序字段当成一个字符串,等同于order by ‘create_time’ ‘desc’,可以通过执行,但无效,与order by create_time desc结果不同

解决方法: 使用order,Mybatis会将其视作直接变量,变量替换成功后,不会再加上引号成为字符串,同样排序顺序也一样

{order},因此

  ORDER BY
        <choose>
        <when test="sort!=null">
                ${sort}
            <if test="order!=null">
                ${order}
            </if>
        </when>
        <otherwise>
            id asc , create_time asc
        </otherwise>
     </choose>

#能很大程度的防止SQL注入 $无法防止Sql注入 $用于传入数据库对象 <![CDATA[]]>,在该符号内的语句,不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

在mapper文件中写sql语句时,遇到特殊字符时,如:< > 等,建议使用

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于springboot i18n国际化后台多种语言设置的方式

    基于springboot i18n国际化后台多种语言设置的方式

    这篇文章主要介绍了基于springboot i18n国际化后台多种语言设置的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java连接mysql数据库学习示例

    java连接mysql数据库学习示例

    这篇文章主要介绍了java连接mysql数据库学习示例,需要的朋友可以参考下
    2014-03-03
  • java 创建自定义数组

    java 创建自定义数组

    本篇文章是关于java 如何自己创建自定义数组,这里给大家一个小实例,希望能帮助有所需要的同学
    2016-07-07
  • 深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • IntelliJ IDEA的build path设置方法

    IntelliJ IDEA的build path设置方法

    这篇文章主要介绍了IntelliJ IDEA的build path设置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 浅谈MyBatis循环Map(高级用法)

    浅谈MyBatis循环Map(高级用法)

    这篇文章主要介绍了浅谈MyBatis循环Map(高级用法),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java volatile关键字作用及使用场景详解

    java volatile关键字作用及使用场景详解

    在本文里我们给大家分享的是关于java volatile关键字作用及使用场景的相关知识点内容,需要的朋友们学习下。
    2019-08-08
  • Java常用开源库汇总

    Java常用开源库汇总

    这篇文章主要介绍了Java常用开源库的相关资料,文中讲解非常细致,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-07-07
  • 亲测解决,nacos下线失败问题

    亲测解决,nacos下线失败问题

    这篇文章主要介绍了亲测解决,nacos下线失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java java.lang.InstantiationException异常案例详解

    Java java.lang.InstantiationException异常案例详解

    这篇文章主要介绍了Java java.lang.InstantiationException异常案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论