通用型自定义拼接 SQL 脚本,摆脱重复工作量

本文主要是介绍通用型自定义拼接 SQL 脚本,摆脱重复工作量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通用型自定义拼接sql脚本,摆脱重复工作量

在开发 Restful 接口时,我们经常需要根据前端传递的参数动态拼接 SQL 查询语句,以满足不同的查询需求。本文将介绍一个通用的自定义拼接 SQL 脚本的方法,帮助开发人员减少重复工作量。

首先,我们定义了一个名为 SqlParmDTO 的传参实体类,其中包含了需要传递给 SQL 查询的各个参数,如 where 条件、排序字段 sort、排序方式 order、结果集偏移量 offset 和结果集限制数量 limit

接下来,我们提供了一个方法 listPageBysql() 来根据传入的 SqlParmDTO 对象执行 SQL 查询,并返回分页结果。该方法首先判断是否存在唯一字段 unique,如果不存在,则执行普通的 SQL 查询,否则执行带有去重功能的 SQL 查询。查询结果封装在 PageInfo 对象中返回。

在 MyBatis 的 XML 配置文件中,我们定义了四个 SQL 查询语句,分别是 selectSqlselectSqlCountselectUniqueSql 和 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>

这篇关于通用型自定义拼接 SQL 脚本,摆脱重复工作量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931333

相关文章

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本