Mybatis xml orderby 排序字段不生效问题

今天想实现一个功能,根据给定的字段,以及是否升降序来对数据动态排序,xml实现如下

    order by #{orderBy} #{orderType}
    <if test="pageSearch!=null and 'true'.toString() == pageSearch.toString()">
      limit #{limit} offset #{offset}
    </if>

结果发现怎么都没用,查看debug日志,发现sql语句为:

2020-02-19 15:53:25.090 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] ==>  Preparing: select distinct purchaseNo from TB_YX_PFU_PURCHASE_SEARCH_INFO WHERE 1=1 order by ? ? 
2020-02-19 15:53:25.106 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] ==> Parameters: submitTime(String), desc(String)
2020-02-19 15:53:25.117 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] <==      Total: 2
2020-02-19 15:53:25.120 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4cb084b]
2020-02-19 15:53:25.120 [DEBUG] [] [] [DataSourceUtils.java:327] Returning JDBC Connection to DataSource
["CGD_20200210-0021","CGD_20200210-0022"]

可以看到传入的排序字段 submitTime,和排序类型 desc作为了字符串参数,这就是问题所在,我们的xml中需要将 #{orderBy} #{orderType}改为 ${orderBy} ${orderType},得到的查询语句:

2020-02-19 16:01:33.289 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] ==>  Preparing: select distinct purchaseNo from TB_YX_PFU_PURCHASE_SEARCH_INFO WHERE 1=1 order by submitTime desc 
2020-02-19 16:01:33.307 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] ==> Parameters: 
2020-02-19 16:01:33.318 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] <==      Total: 2
2020-02-19 16:01:33.322 [DEBUG] [] [] [JakartaCommonsLoggingImpl.java:54] Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@47fe4c3e]
2020-02-19 16:01:33.322 [DEBUG] [] [] [DataSourceUtils.java:327] Returning JDBC Connection to DataSource
["CGD_20200210-0022","CGD_20200210-0021"]

但是,$方式无法防止Sql注入,所以,对于使用前端传过来的值的时候,一定要进行转义,不要直接使用,一般能用#的就别用$$方式一般用于传入数据库对象,例如传入表名、排序规则等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Mybatis中的order by排序可以通过传参来实现。具体方法如下: 1. 在Mapper.xml文件中,定义一个参数,用于接收排序字段排序方式。 2. 在SQL语句中使用${}占位符,将参数传递给order by子句。 例如: <select id="getUserList" parameterType="map" resultType="User"> select * from user <where> <if test="name != null"> and name like concat('%', #{name}, '%') </if> </where> order by ${orderBy} ${orderType} </select> 3. 在Java代码中,将排序字段排序方式封装到一个Map中,作为参数传递给Mapper方法。 例如: Map<String, Object> params = new HashMap<>(); params.put("orderBy", "create_time"); params.put("orderType", "desc"); List<User> userList = userMapper.getUserList(params); 这样就可以动态地传递排序字段排序方式,实现order by排序穿参。 ### 回答2: Mybatis是一款开源的ORM框架,广泛应用于Java项目中。在Mybatis中,可以使用SQL语句进行数据操纵。其中,order by是用于排序的关键字,可以按照指定的字段进行升序或降序排序。当需要在Mybatis中使用order by进行排序时,可以通过传递参数来实现灵活的排序功能。 具体实现如下: 1.在Mapper.xml文件中定义查询语句 例如: ``` <select id="getUserList" parameterType="java.util.Map" resultType="com.example.User"> select * from user <where> <if test="name != null and name != ''"> and name like concat('%',#{name},'%') </if> </where> order by ${orderField} ${orderType} </select> ``` 在查询语句中,使用${}方式传递参数,orderField和orderType是排序字段排序方式的动态参数。 2.在Mapper接口中定义方法,并传递参数 例如: ``` List<User> getUserList(@Param("name")String name, @Param("orderField")String orderField, @Param("orderType")String orderType); ``` 在接口方法中,使用@Param注解指定传递的参数名,在参数中传递排序字段排序方式。 3.在Service层中调用Mapper方法,并传递参数 例如: ``` List<User> userList = userMapper.getUserList(name, "age", "desc"); ``` 在Service层中,调用Mapper方法,传递排序字段排序方式,即按照年龄降序排列查询结果。 通过以上步骤,即可在Mybatis中实现order by排序穿参的功能。根据需要动态传递排序字段排序方式,实现灵活的排序操作,提高查询结果的精度和准确度。 ### 回答3: MyBatis是一款非常流行的Java持久层框架,在数据库查询时提供了方便的实现和便捷的查询方式。其中,order by是一种常用的数据排序方法,可以通过参数传递的方式实现动态排序。 在MyBatis中,我们可以通过传递参数来动态地设置排序的列和排序的方式,具体步骤如下: 1.在Mapper.xml文件中,设置一个<select>标签,用于查询需要排序的数据。 <select id="queryList" parameterType="map" resultMap="xxxx"> SELECT * FROM table_name WHERE xxxxx <if test="orderBy != null and orderBy != ''"> ORDER BY ${orderBy} ${sortType} </if> </select> 其中,orderBy和sortType都是在Java代码中设置的参数,分别代表排序的列和排序的方式。 2.在Java代码中,需要进行排序的时候,传递参数来设置orderBy和sortType。 Map<String, Object> paramMap = new HashMap<String, Object>(); paramMap.put("orderBy", "column_name"); paramMap.put("sortType", "asc"); List<MyObject> myObjectList = myObjectMapper.queryList(paramMap); 通过这种方式,就可以实现动态排序,方便地查询和展示需要排序的数据了。 需要注意的是,由于orderBy和sortType都是通过变量的方式传递的,可能会存在SQL注入的风险,因此要对参数进行严格的校验和过滤,确保传递的参数合法可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zlp1992

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值