通用型自定义拼接sql脚本,摆脱重复工作量
在开发 Restful 接口时,我们经常需要根据前端传递的参数动态拼接 SQL 查询语句,以满足不同的查询需求。本文将介绍一个通用的自定义拼接 SQL 脚本的方法,帮助开发人员减少重复工作量。
首先,我们定义了一个名为 SqlParmDTO
的传参实体类,其中包含了需要传递给 SQL 查询的各个参数,如 where
条件、排序字段 sort
、排序方式 order
、结果集偏移量 offset
和结果集限制数量 limit
。
接下来,我们提供了一个方法 listPageBysql()
来根据传入的 SqlParmDTO
对象执行 SQL 查询,并返回分页结果。该方法首先判断是否存在唯一字段 unique
,如果不存在,则执行普通的 SQL 查询,否则执行带有去重功能的 SQL 查询。查询结果封装在 PageInfo
对象中返回。
在 MyBatis 的 XML 配置文件中,我们定义了四个 SQL 查询语句,分别是 selectSql
、selectSqlCount
、selectUniqueSql
和 selectUniqueSqlCount
。这些查询语句根据传入的参数动态拼接 SQL 语句,并执行相应的查询操作。
以下就是通用型自定义拼接 SQL 脚本的示例代码。通过这种方式,开发人员可以根据不同的查询需求,灵活地拼接 SQL 语句,从而避免了重复的工作量。
Rest Full接口联调:
{
“order”: “desc”,
“sort”: “id”,
“unique”: “field1, field2, field3”,
“where”: “field1 IN ( ‘A00000020231017001’) AND field2 IN (‘62284613461111198’) AND time1>= ‘2017–09–08’ AND time2<= ‘2024–11–16 23:59:59’ “
}
自定义传参实体类:
public class SqlParmDTO implements Serializable{ private static final long serialVersionUID = 1L; private String where; private String unique; private String sort; private String order; private int offset; private int limit; }
方法类:
@Override public PageInfo<PhoneBill> listPageBysql(SqlParmDTO sqlParm) { if (StringUtils.isEmpty(sqlParm.getUnique())) { long total = this.mapper.selectSqlCount(sqlParm.getWhere()); List<PhoneBill> lists = this.mapper.selectSql(sqlParm.getWhere(), sqlParm.getSort(), sqlParm.getOrder(), sqlParm.getOffset(), sqlParm.getLimit()); PageInfo<PhoneBill> pageInfo = new PageInfo<>(lists); pageInfo.setTotal(total); pageInfo.setPageNum(sqlParm.getOffset()); pageInfo.setPageSize(sqlParm.getLimit()); return pageInfo; } else { long total = this.mapper.selectUniqueSqlCount(sqlParm.getWhere(), sqlParm.getUnique()); List<PhoneBill> lists = this.mapper.selectUniqueSql(sqlParm.getWhere(), sqlParm.getSort(), sqlParm.getOrder(), sqlParm.getOffset(), sqlParm.getLimit(), sqlParm.getUnique()); PageInfo<PhoneBill> pageInfo = new PageInfo<>(lists); pageInfo.setTotal(total); pageInfo.setPageNum(sqlParm.getOffset()); pageInfo.setPageSize(sqlParm.getLimit()); return pageInfo; } }
#mybastis xml文件:
<select id="selectSql" resultType="map"> select * from jz_phone_bill <where> <if test="where != null and where !=''"> ${where} </if> </where> <if test="sort != null and sort !=''"> order by ${sort} <if test="order != null and order !=''"> ${order} </if> </if> </select> <select id="selectSqlCount" resultType="java.lang.Long"> select count(1) from jz_phone_bill <where> <if test="where != null and where !=''"> ${where} </if> </where> </select>
<select id="selectUniqueSql" resultType="map"> select * from ( select t.*, ROW_NUMBER ( ) OVER ( PARTITION BY <if test="unique != null and unique !=''"> ${unique} </if> <if test="sort != null and sort !=''"> order by ${sort} <if test="order != null and order !=''"> ${order} </if> </if> ) AS `row_number1` from jz_phone_bill t <where> <if test="where != null and where !=''"> ${where} </if> </where> ) t2 where `row_number1` = 1 </select> <select id="selectUniqueSqlCount" resultType="java.lang.Long"> select count(1) from ( select t.*, ROW_NUMBER ( ) OVER ( PARTITION BY <if test="unique != null and unique !=''"> ${unique} </if> ) AS `row_number1` from jz_phone_bill t <where> <if test="where != null and where !=''"> ${where} </if> </where> ) t2 where `row_number1` = 1 </select>