# sql增强工具 **Repository Path**: freshgrass/sql-express-tool ## Basic Information - **Project Name**: sql增强工具 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-01 - **Last Updated**: 2021-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sql增强工具 #### 介绍 本项目提供两个包,执行器与解析器,分别应用于不同场景: 1. 解析器:专门应用于SQL脚本的解析,得到解析后的变量绑定的SQL脚本以及参数。 2. 执行器:执行器是基于解析器的一层封装,具有SQL解析、执行获取数据的功能。考虑到数据源连接的管理,传入执行器的数据库连接在执行器内使用完之后并不会关闭。 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 ### 一、引入工程 添加以下maven依赖 ```xml com.szboanda.component sql-execution 1.0-SNAPSHOT ``` ### 二、API使用 执行器SqlExecution是个单例,对外提供两个方法:普通查询、分页查询 #### 1、普通查询 List> select(Connection con, String sql, SqlContext context) ##### 入参说明 | 名称 | 说明 | | ------------ | ------------ | | con | 数据库连接 | | sql | 待解析、待执行的sql脚本 [查看语法]($parser)| | context | 解析、执行sql脚本所需要的参数 | ###### SqlContext说明 | 属性 | 说明 | | ------------ | ------------ | | pageNum | 使用selectPage时分页页码,默认为:1 | | pageSize | 使用selectPage时分页大小,默认为:20 | | queryLimitSize | 使用select时查询记录数量上限,默认为5w | | queryTimeOut | 使用select、selectPage时查询,sql执行超时时间,单位为秒 | ##### 输出说明 数据库执行sql脚本输出的数据 示例如下: ```java Connection con = util.getConnection(); String sql = "SELECT * \nFROM T_JCSJZX_HJKQ_XSZ \nwhere JGJB = 2 AND SO2 > #{start} AND SO2 < #{end} \n AND jcsj < ${year -1m} AND CDBH in #{bhs}"; //封装参数 SqlContext context = new SqlContext(); context.put("SO2", 13); context.put("start", 13); context.put("end", 18); // in、not in 条件参数使用List集合 List lst = new ArrayList<>(4); lst.add("34010003020191"); lst.add("34010060520192"); lst.add("34010060720192"); lst.add("34010061020192"); context.put("bhs", lst); List> resultLst = SqlExecution.getInstance().select(con, sql, context); ``` #### 2、分页查询 PageInfo> selectPage(Connection con, String sql, SqlContext context) ##### 入参说明 | 名称 | 说明 | | ------------ | ------------ | | con | 数据库连接 | | sql | 待解析、待执行的sql脚本 | | context | 解析、执行sql脚本所需要的参数 | ###### SqlContext说明 | 属性 | 说明 | | ------------ | ------------ | | pageNum | 使用selectPage时分页页码,默认为:1 | | pageSize | 使用selectPage时分页大小,默认为:20 | | queryLimitSize | 使用select时查询记录数量上限,默认为5w | | queryTimeOut | 使用select、selectPage时查询,sql执行超时时间,单位为秒 | ##### 输出说明 数据库执行sql脚本输出的分页数据 示例如下: ```java Connection con = util.getConnection(); String sql = "SELECT * \nFROM T_JCSJZX_HJKQ_XSZ \nwhere JGJB = 2 AND SO2 > #{start} AND SO2 < #{end} \n AND jcsj < ${year -1m} AND CDBH in #{bhs}"; //封装sql解析参数 SqlContext context = new SqlContext(); context.put("SO2", 13); context.put("start", 13); context.put("end", 18); List lst = new ArrayList<>(4); lst.add("34010003020191"); lst.add("34010060520192"); lst.add("34010060720192"); lst.add("34010061020192"); context.put("bhs", lst); // 设置分页参数 context.setPageNum(1); context.setPageSize(20); PageInfo> pageInfo = SqlExecution.getInstance().selectPage(con, sql, context); ``` ### 二、语法解析器适用但不限于如下几个场景: #### 场景一:根据数据库类型进行sql适配 示例1: ```sql select so2,no2,co, jcsj||cdbh xh, aqi from t_air_hours where 1=1 select so2,no2,co, cdbh xh, aqi from t_air_hours where 1=1 SELECT * FROM T_AIR ``` 在 Mysql数据连接下,解析得到: ```sql select so2,no2,co, jcsj||cdbh xh, aqi from t_air_hours where 1=1 ``` 示例2: ```sql select so2,no2,co, jcsj||cdbh xh, aqi from t_air_hours where 1=1 select so2,no2,co, cdbh xh, aqi from t_air_hours where 1=1 ``` 在 Mysql数据连接下,解析得到: ```sql select so2,no2,co, cdbh xh, aqi from t_air_hours where 1=1 ``` 示例3: ```sql select so2,no2,co, cdbh xh, aqi from t_air_hours where 1=1 ``` 在 Mysql数据连接下,解析得到: ```sql select so2,no2,co, cdbh xh, aqi from t_air_hours where 1=1 ``` #### 场景二:值替换标签##{}的使用 动态改变查询语句,如下示例: ```sql SELECT city, count(1) nums FROM T_AQI_CITY_HOUR_##{years} GROUP BY city ``` 在指定参数years=2019的环境下,经过脚本引擎翻译之后得到如下SQL: ```sql SELECT city, count(1) nums FROM T_AQI_CITY_HOUR_2019 GROUP BY city ``` #### 场景三:条件标签``的使用 根据上下文有无指定参数(TAG),动态改变查询条件,如下示例: ```sql SELECT city, count(city) nums FROM T_AQI_CITY_HOUR_2019 WHERE 1=1 AND JGJB=#{JGJB} AND CDBH IN #{lstCDBH} GROUP BY city ``` 在指定参数JGJB=2,lstCDBH=List[2,3] 的环境下,经过脚本引擎翻译之后得到如下SQL: ```sql SELECT city, count(1) nums FROM T_AQI_CITY_HOUR_2019 WHERE 1=1 AND JGJB=? AND CDBH IN (?,?) GROUP BY city ``` 在没有指定参数JGJB、lstCDBH= null 或者 lstCDBH=List[]的环境下,经过脚本引擎翻译之后得到如下SQL: ```sql SELECT city, count(1) nums FROM T_AQI_CITY_HOUR_2019 WHERE 1=1 GROUP BY city ``` #### 场景四:变量绑定标签#{}、${}的使用 时间表达式${}标签减少时间对象生成,使java代码更简洁,示例如下: ```sql SELECT city, count(1) nums FROM T_AQI_CITY_HOUR_2019 WHERE pubtime > ${now-3h-30m} AND aqi > #{abnormalNum} AND jgjb in #{jgjbs} GROUP BY city ``` 在当前时间为2020-02-25 16:55:23、指定参数jgjbs=List[1,2]参数abnormalNum=80,的环境下,经过脚本引擎翻译之后得到如下SQL: ```sql SELECT city, count(1) nums FROM T_AQI_CITY_HOUR_2019 WHERE pubtime > ? AND aqi > ? AND jgjb in (?, ?) GROUP BY city ``` 以及预编译sql参数['2020-02-25 13:25:23', 80, 1, 2]