MyBatis 3 SQL Builder类如何使用ORDER BY DESC/ASC排序?
MyBatis 3 SQL Builder实现ORDER BY DESC/ASC排序
问题场景
已使用MyBatis 3的SQL Builder类编写查询逻辑,但不知道如何为ORDER BY子句添加DESC/ASC排序关键字,当前代码如下:
public String selectPersonLike(final String id, final String firstName, final String lastName) { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if (id != null) { WHERE("P.ID like #{id}"); } if (firstName != null) { WHERE("P.FIRST_NAME like #{firstName}"); } if (lastName != null) { WHERE("P.LAST_NAME like #{lastName}"); } ORDER_BY("P.LAST_NAME"); }}.toString(); }
期望生成的SQL语句为:
SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME FROM PERSON P ORDER BY P.LAST_NAME DESC
解决方案
SQL Builder的ORDER_BY()方法支持直接在字段名后拼接DESC或ASC关键字,无需额外特殊处理:
- 固定排序方向
直接修改ORDER_BY行的参数,添加排序关键字即可:
public String selectPersonLike(final String id, final String firstName, final String lastName) { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if (id != null) { WHERE("P.ID like #{id}"); } if (firstName != null) { WHERE("P.FIRST_NAME like #{firstName}"); } if (lastName != null) { WHERE("P.LAST_NAME like #{lastName}"); } // 直接在字段后添加DESC ORDER_BY("P.LAST_NAME DESC"); }}.toString(); }
这样生成的SQL就会包含ORDER BY P.LAST_NAME DESC,满足需求。
- 动态控制排序方向
如果需要根据业务场景动态切换DESC/ASC,可以在方法中添加排序方向参数,拼接进ORDER_BY的参数中:
public String selectPersonLike(final String id, final String firstName, final String lastName, final String sortOrder) { // 校验排序方向合法性,防止SQL注入 String validSortOrder = "ASC".equalsIgnoreCase(sortOrder) || "DESC".equalsIgnoreCase(sortOrder) ? sortOrder.toUpperCase() : "ASC"; return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if (id != null) { WHERE("P.ID like #{id}"); } if (firstName != null) { WHERE("P.FIRST_NAME like #{firstName}"); } if (lastName != null) { WHERE("P.LAST_NAME like #{lastName}"); } // 动态拼接排序方向 ORDER_BY("P.LAST_NAME " + validSortOrder); }}.toString(); }
注意:务必对传入的sortOrder参数做合法性校验,只允许ASC/DESC两种值,避免SQL注入风险。
内容的提问来源于stack exchange,提问作者fairy
相关产品推荐
相关产品推荐

