【Mybatis】【7】order by 使用动态参数时需要注意,用${}而不是#{}

本文探讨了在MyBatis中使用动态参数进行排序的方法,强调了在ORDER BY子句中使用$而非#的重要性,避免SQL注入风险。通过具体代码示例,展示了如何正确设置动态排序字段。

正文:

-- 正确写法
SELECT * FROM TABLE WHERE ID = #{id} ORDER BY ${columnName} DESC

参考博客:

MyBatis排序时使用order by 动态参数时需要注意,用$而不是# - pyzheng - ITeye博客
https://panyongzheng.iteye.com/blog/2257412

转载于:https://www.cnblogs.com/huashengweilong/p/10924936.html

### MyBatis 动态生成 `ORDER BY` 子句 在 MyBatis 中,动态 SQL 是一种强大的功能,允许开发者根据条件灵活地构建 SQL 查询语句。为了实现动态排序(即动态生成 `ORDER BY` 子句),可以通过 `<if>` 和 `<choose>` 标签来控制排序字段和顺序的选择。 以下是通过 XML 配置文件实现动态 `ORDER BY` 的示例: ```xml <select id="selectWithDynamicOrderBy" resultType="User"> SELECT * FROM users WHERE 1=1 <!-- 动态 ORDER BY --> <if test="orderBy != null and orderBy.trim() != &#39;&#39;"> ORDER BY ${orderBy} </if> </select> ``` 上述代码片段展示了如何基于参数 `orderBy` 是否为空来决定是否应用 `ORDER BY` 子句[^1]。需要注意的是,在使用 `${}` 占位符要特别小心,因为它会直接拼接字符串到 SQL 中,可能会带来 SQL 注入风险。如果可能的话,建议验证输入并限制可接受的值列表。 当需要支持多个排序字段以及升序 (`ASC`) 或降序 (`DESC`) 排序,可以扩展逻辑如下所示: ```xml <select id="selectUsersWithComplexOrdering" resultType="User"> SELECT * FROM users WHERE 1=1 <!-- 多字段排序 --> <if test="sortFields != null and sortFields.size() > 0"> ORDER BY <foreach collection="sortFields" item="field" separator=", "> ${field.name} ${field.order} </foreach> </if> </select> ``` 在此复杂版本中,假设传入了一个名为 `sortFields` 的集合对象,其中每个元素都包含两个属性:`name` 表示列名,而 `order` 则表示排序方向(如 `"ASC"` 或 `"DESC"`)。此方法利用了 `<foreach>` 标签迭代所有排序字段,并用逗号分隔它们[^3]。 另外,也可以借助 MyBatis Dynamic SQL API 实现类似的动态行为。虽然目前其功能相对有限,但对于基本需求仍然适用。例如: ```java import static org.mybatis.dynamic.sql.SqlBuilder.*; public class UserMapper { public SelectStatementProvider selectWithDynamicOrderBy(List<SortField> sortFields) { return select(UserDynamicSqlSupport.*) .from(users) .orderBy(sortFields.stream() .map(field -> field.getOrder().equals("ASC") ? column(field.getName()).ascending() : column(field.getName()).descending()) .toArray(OrderSpecification[]::new)) .build() .render(RenderingStrategies.MYBATIS3); } } ``` 这里定义了一个 Java 方法用于创建带有动态排序的查询语句。该函数接收一个 `List<SortField>` 参数,其中每一个 `SortField` 对象代表一个单独的排序规则[^2]。 #### 注意事项 - 使用 `${}` 插入变量至 SQL 字符串可能导致安全漏洞,请务必校验用户提交的数据。 - 如果项目依赖于 mybatis-generator 自动生成 Mapper 层,则可通过自定义 Example 类进一步增强灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值