# sql-parser **Repository Path**: skBate/sql-parser ## Basic Information - **Project Name**: sql-parser - **Description**: sql-parser解释器,结合freemarker模板解释器,加上自定义一套参数解释标准,让开发更简单 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2023-12-29 - **Last Updated**: 2023-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sql-parser #### 介绍 sql-parser解释器,结合freemarker模板解释器,加上自定义一套参数解释标准,让开发更简单 #### 安装教程 1. 配置仓库地址 ```xml pesking_public pesking_public http://www.peskingsoft.com/repository/internal true true ``` 2. 引入包 ```xml 1.0-SNAPSHOT com.pesking.framework sql-parser ${pesking.sql-parser.version} ``` #### 使用说明 1. 使用方法 1. 无参数情况的使用方法 1) 在reosurces/config/sql里建一个sql文件(示例:resources/config/sql/test/testQuery.sql),所有的SQL必须放在resources/config/sql目录下,可以放在子目录下 ``` select * from sys_dept ``` SQL语句编写按正常SQL语法写法 2. 代码调用 ``` List> result = SqlParserManage.toMapListById("test/testQuery"); System.out.println("SQL查询输出结果->" + JSON.toJSONString(result)); ``` 如果使用自定义的类接收,可以使用下列代码 ``` SysDept objectResult = SqlParserManage.toObjectById("test/outputObject",SysDept.class); System.out.println("SQL查询输出对象结果->" + JSON.toJSONString(objectResult)); ``` 注意: a. SQL里输出的字段名必须跟类的属性对应,大小写无关,系统会全部转化为小写进行比较,然后赋值 b. 上述语句如果查询出多条记录,系统默认取第一条记录 2. 有参数情况的使用方法 1. SQL写法 ``` select dept_id, dept_name from sys_dept where 1 = 1 <#if deptName?? && deptName != ''> and dept_name like [AV:deptName] ``` <#if是freemarker模板语法,语法详情见下述freemarker语法说明,如果deptName不能为空时就增加参数 dept_name条件 2. 代码调用 ``` Parameter parameter = new Parameter(); parameter.setParameter("deptName","test"); objectResult = SqlParserManage.toObjectById("test/outputObject",parameter,SysDept.class); System.out.println("SQL查询输出对象结果->" + JSON.toJSONString(objectResult)); ``` 如果是参数是一个对象,可以下列方法转化为parameter对象 ``` SysDept dept = new SysDept(); dept.setDeptName("test"); Parameter parameter = SqlParserManager.toParameter(dept); ``` 2. ##### 调用接口说明 ```java public class SqlParserManage { /** * 对象转换为参数parameter * @param o 普通对象 * @return 返回参数对象 */ public static Parameter toParameter(Object o); /** * 执行更新 * @param statementById SQL语句ID * @param parameter 参数对象 * @return 更新成功返回1,否则返回 0 */ public static int updateById(String statementById,Parameter parameter) /** * 执行更新 * @param datasourceName 数据源名称 * @param statementById SQL语句ID * @param parameter 参数对象 * @return 更新成功返回1,否则返回 0 */ public static int updateById(String datasourceName ,String statementById ,Parameter parameter) /** * 执行更新 * @param statement SQL语句 * @param parameter 参数对象 * @return 更新成功返回1,否则返回 0 */ public static int update(String statement,Parameter parameter) /** * 执行更新 * @param datasourceName 数据源名称 * @param statement SQL语句 * @param parameter 参数对象 * @return 更新成功返回1,否则返回 0 */ public static int update(String datasourceName ,String statement ,Parameter parameter) /** * 以新的事务执行更新 * @param statement SQL语句 * @param parameter 参数对象 */ public static void updateByNewTransaction(String statement,Parameter parameter) /** * 以新的事务执行更新 * @param datasourceName 数据源名称 * @param statementId SQL语句ID * @param parameter 参数对象 */ public static void updateByNewTransactionById(String datasourceName,String statementId,Parameter parameter) /** * 以新的事务执行更新 * @param datasourceName 数据源名称 * @param statement SQL语句 * @param parameter 参数对象 */ public static void updateByNewTransaction(String datasourceName,String statement,Parameter parameter) /** * 执行查询 * @param statement SQL语句 * @return 键值对列表 */ public static List> toMapList(String statement) /** * 执行查询 * @param statement SQL语句 * @param parameter 参数对象 * @return 键值对列表 */ public static List> toMapList(String statement ,Parameter parameter) /** * 执行查询 * @param datasourceName 数据源名称 * @param statement SQL语句 * @param parameter 参数对象 * @return 键值对列表 */ public static List> toMapList(String datasourceName ,String statement ,Parameter parameter) /** * 执行查询 * @param datasourceName 数据源名称 * @param statement SQL语句 * @param parameter 参数对象 * @return 键值对列表 */ public static List> toMapList(String datasourceName ,String statement ,Parameter parameter ,Page page) /** * 执行查询 * @param statementById SQL语句ID * @return 键值对列表 */ public static List> toMapListById(String statementById) /** * 执行查询 * @param statementById SQL语句ID * @param parameter 参数对象 * @return 键值对列表 */ public static List> toMapListById(String statementById,Parameter parameter) /** * 执行查询 * @param datasourceName 数据源名称 * @param statementById SQL语句ID * @param parameter 参数对象 * @return 键值对列表 */ public static List> toMapListById(String datasourceName,String statementById,Parameter parameter) /** * 执行查询 * @param datasourceName 数据源名称 * @param statementById SQL语句ID * @param parameter 参数对象 * @return 键值对列表 */ public static List> toMapListById(String datasourceName,String statementById,Parameter parameter ,Page page) /** * 执行查询 * @param statement SQL语句 * @return 字符串列表 */ public static List toSingleFieldList(String statement) /** * 执行查询 * @param statement SQL语句 * @param parameter 参数对象 * @return 字符串列表 */ public static List toSingleFieldList(String statement ,Parameter parameter) /** * 执行查询 * @param datasourceName 数据源名称 * @param statement SQL语句 * @param parameter 参数对象 * @return 字符串列表 */ public static List toSingleFieldList(String datasourceName ,String statement ,Parameter parameter) /** * 执行查询 * @param statementId SQL语句ID * @return 字符串列表 */ public static List toSingleFieldListById(String statementId) /** * 执行查询 * @param statementId SQL语句ID * @param parameter 参数对象 * @return 字符串列表 */ public static List toSingleFieldListById(String statementId,Parameter parameter) /** * 执行查询 * @param datasourceName 数据源名称 * @param statementId SQL语句ID * @param parameter 参数对象 * @return 字符串列表 */ public static List toSingleFieldListById(String datasourceName,String statementId,Parameter parameter) /** * 执行查询,输出对象列表 * @param statement SQL语句 * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static List toObjectList(String statement,Class resultClass) /** * 执行查询,输出对象列表 * @param statement SQL语句 * @param parameter 参数对象 * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static List toObjectList(String statement ,Parameter parameter,Class resultClass) /** * 执行查询 * @param datasourceName 数据源名称 * @param statement SQL语句 * @param parameter 参数对象 * @return 数据列表对象 */ public static List toObjectList(String datasourceName,String statement,Parameter parameter,Class resultClass) /** * 执行查询,输出对象列表 * @param datasourceName 数据源名 * @param statement SQL语句 * @param parameter 参数对象 * @param resultClass 返回结果类型 * @param page 分页对象 * @return 返回列表对象 */ public static List toObjectList(String datasourceName,String statement,Parameter parameter,Class resultClass,Page page) /** * 执行查询,输出对象列表 * @param statementId SQL语句ID * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static List toObjectListById(String statementId,Class resultClass) /** * 执行查询,输出对象列表 * @param statementId SQL语句ID * @param parameter 参数对象 * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static List toObjectListById(String statementId,Parameter parameter,Class resultClass) /** * 执行查询 * @param datasourceName 数据源名称 * @param statementId SQL语句ID * @param parameter 参数对象 * @return 数据列表对象 */ public static List toObjectListById(String datasourceName,String statementId,Parameter parameter,Class resultClass) /** * 执行查询,输出对象列表 * @param datasourceName 数据源名 * @param statementId SQL语句ID * @param parameter 参数对象 * @param resultClass 返回结果类型 * @param page 分页对象 * @return 返回列表对象 */ public static List toObjectListById(String datasourceName,String statementId,Parameter parameter,Class resultClass,Page page) /** * 执行查询,输出指定对象 * @param statement SQL语句 * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static T toObject(String statement,Class resultClass) /** * 执行查询,输出指定对象 * @param statement SQL语句 * @param parameter 参数对象 * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static T toObject(String statement,Parameter parameter,Class resultClass) /** * 执行查询,输出指定对象 * @param datasourceName 数据源名称 * @param statement SQL语句 * @param parameter 参数对象 * @return 数据列表对象 */ public static T toObject(String datasourceName ,String statement ,Parameter parameter ,Class resultClass) /** * 执行查询,输出指定对象 * @param datasourceName 数据源名 * @param statement SQL语句 * @param parameter 参数对象 * @param resultClass 返回结果类型 * @param page 分页对象 * @return 返回列表对象 */ public static T toObject(String datasourceName,String statement,Parameter parameter,Class resultClass,Page page) /** * 执行查询,输出指定对象 * @param statementId SQL语句ID * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static T toObjectById(String statementId,Class resultClass) /** * 执行查询,输出指定对象 * @param statementId SQL语句ID * @param parameter 参数对象 * @param resultClass 返回结果类型 * @return 返回列表对象 */ public static T toObjectById(String statementId,Parameter parameter,Class resultClass) /** * 执行查询,输出指定对象 * @param datasourceName 数据源名称 * @param statementId SQL语句ID * @param parameter 参数对象 * @return 数据列表对象 */ public static T toObjectById(String datasourceName,String statementId,Parameter parameter ,Class resultClass) /** * 执行查询,输出指定对象 * @param datasourceName 数据源名 * @param statementId SQL语句ID * @param parameter 参数对象 * @param resultClass 返回结果类型 * @param page 分页对象 * @return 返回列表对象 */ public static T toObjectById(String datasourceName,String statementId,Parameter parameter,Class resultClass,Page page) /** * 执行查询,把map对象转换为指定对象值 * @param statement sql语句 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObject(String statement,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param statement sql语句 * @param parameter 参数对象 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObject(String statement,Parameter parameter,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statement sql语句 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObject(String datasourceName,String statement,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statement sql语句 * @param parameter 参数对象 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObject(String datasourceName,String statement,Parameter parameter,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statement sql语句 * @param parameter 参数对象 * @param callback 回调对象 * @param result 输出对象 * @param cacheKeyTemplate 缓存key模板 */ public static void mapToObject(String datasourceName,String statement,Parameter parameter,ResultConvertCallback callback,T result,String cacheKeyTemplate) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statement sql语句 * @param parameter 参数对象 * @param page 分页对象 * @param callback 回调对象 * @param result 输出对象 * @param cacheKeyTemplate 缓存key模板 */ public static void mapToObject(String datasourceName,String statement,Parameter parameter,Page page,ResultConvertCallback callback,T result,String cacheKeyTemplate) /** * 执行查询,把map对象转换为指定对象值 * @param statementId sql语句 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObjectById(String statementId,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param statementId sql语句 * @param parameter 参数对象 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObjectById(String statementId,Parameter parameter,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statementId sql语句 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObjectById(String datasourceName,String statementId,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statementId sql语句 * @param parameter 参数对象 * @param callback 回调对象 * @param result 输出对象 */ public static void mapToObjectById(String datasourceName,String statementId,Parameter parameter,ResultConvertCallback callback,T result) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statementId sql语句 * @param parameter 参数对象 * @param callback 回调对象 * @param result 输出对象 * @param cacheKeyTemplate 缓存key模板 */ public static void mapToObjectById(String datasourceName,String statementId,Parameter parameter,ResultConvertCallback callback,T result,String cacheKeyTemplate) /** * 执行查询,把map对象转换为指定对象值 * @param datasourceName 数据源名称 * @param statementId sql语句 * @param parameter 参数对象 * @param page 分页对象 * @param callback 回调对象 * @param result 输出对象 * @param cacheKeyTemplate 缓存key模板 */ public static void mapToObjectById(String datasourceName,String statementId,Parameter parameter,Page page,ResultConvertCallback callback,T result,String cacheKeyTemplate) ``` 3. ##### SQL编写说明 ###### 3.1 参数对象说明 参数对象Parameter属于键值对集合,key为字符串值,value为字符串数组 树状结构的数据转化Parameter时生成键值对集合,其中会多很多键值对 示例: {"workList":["中软科技","中科大"],"address":{"qu":"白云区","shi":"广州市","sheng":"广东省"},"userName":"张三","userId":"1"} 转化为Parameter对象,输出如下: {workList=[[中软科技, 中科大]], address_qu=[白云区], address_shi=[广州市], address_sheng=[广东省], userName=[张三], userId=[1]} ###### 3.2 模板解释说明 ###### 3.3 sql编写说明 4. ##### 已定义参数说明 ###### 4.1 自动生成唯一ID参数 ​ 功能简介:自动生成唯一ID参数 自动生成唯一ID,如果带有参数名,会重新设置到请求参数对象中,方便后续可以继续使用该唯一ID ​ 使用方法:[AUTO_ID:参数名] ###### 4.2 全匹配参数 ​ 功能简介:全匹配参数,自动在参数前后加上%,进行全量匹配。 ​ 使用方法:[AV:参数名] ###### 4.3 附件下载参数 ​ 功能简介:附件下载参数 生成附件下载地址,生成地址形如:/core/attachment/download/{id} ​ 使用方法:[DOWNLOAD:参数名] ###### 4.4 图片附件参数 ​ 功能简介:图片附件参数生成附件下载地址,生成地址形如:/core/attachment/image/{id} ​ 使用方法:[IMAGE:参数名] ###### 4.5 Bean方法调用参数 ​ 功能简介:Bean方法调用参数 接口路径指的是类全路径,方法名称为调用的方法,此方法必须是无参数方法 ​ 使用方法:[BEAN_METHOD:接口路径:方法名称] ###### 4.6 大文本参数 ​ 功能简介:大文本参数 ​ 使用方法:[C:参数名]或者[CLOB:参数名] ###### 4.7 上下文路径参数 ​ 功能简介:上下文路径参数 自动赋值当前上下文路径 ​ 使用方法:[CONTEXT_PATH] ###### 4.8 当前日期参数 ​ 功能简介:当前日期参数 赋当前日期 ​ 使用方法:[CURRENT_DATE] ###### 4.9 当前日期时间参数 ​ 功能简介:当前日期时间参数赋值当前日期时间 ​ 使用方法:[CURRENT_TIMESTAMP] ###### 4.10 当前用户参数 ​ 功能简介:当前用户参数,根据指定类型,赋值相应的值 ​ 使用方法:[CUR_USER:loginName|nickName|id|userType|phone|email|deptId|deptName] ###### 4.11 数据权限参数 ​ 功能简介:数据权限参数,根据当前用户所拥的数据权限自动生成IN语句形式,比如:(1,2,3,4)形式 ​ 使用方法:[DR_D:参数名] ###### 4.12 数据权限参数 ​ 功能简介:数据权限参数,根据当前用户所拥的数据权限自动生成IN语句形式,比如:('1','2','3','4')形式 ​ 使用方法:[DR_S:参数名] ###### 4.13 日期增加参数 ​ 功能简介:日期增加参数 根据增加类型及增加数量,生成新的日期对象 ​ 使用方法:[DATE_ADD:参数名:增加类型(Y|M|D|H|MI|S):增加值] ###### 4.14 日期序列号参数 ​ 功能简介:日期序列号参数 ​ 使用方法:[DATE_SN:参数名],生成的日期序列号写入以参数名为key的请求对象 ###### 4.15 日期参数 ​ 功能简介: ​ 使用方法:[D:参数名]或者[DATE:参数名] ###### 4.16 大数字类型参数 ​ 功能简介: ​ 使用方法:[DECIMAL:参数名] ###### 4.17 删除标志参数 ​ 功能简介: ​ 使用方法:[DELETE_FLAG:参数名],当参数名的值为1时,输出1,否则输出0 ###### 4.18 双精度参数 ​ 功能简介: ​ 使用方法:[DL:参数名]或者[DOUBLE:参数名] ###### 4.19 结束日期参数 ​ 功能简介:结束日期参数 在指定日期基础上加上1 ​ 使用方法:[ED:参数名]或者[END_DATE:参数名] ###### 4.20 提取请求URL域名参数 ​ 功能简介: ​ 使用方法:[URL_DOMAIN],获取请求URL域名 ###### 4.21 单精度参数 ​ 功能简介: ​ 使用方法:[F:参数名]或者[FLOAT:参数名] ###### 4.22 IN语句参数 ​ 功能简介:IN语句参数 生成数字型的IN语句,比如:(1,2,3,4) ​ 使用方法:[IN_D:参数名] ###### 4.23 IN语句参数 ​ 功能简介:IN语句参数 生成字符串型的IN语句,比如:('1','2','3','4') ​ 使用方法:[IN_S:参数名] ###### 4.24 整形参数 ​ 功能简介:整形参数 ​ 使用方法:[N:参数名]或者[INT:参数名]或者[INTEGER:参数名] ###### 4.25 JSON参数 ​ 功能简介:JSON参数 根据指定的路径提取json值 ​ 使用方法:[JSON:jsonObjectname:path] ###### 4.26 左匹配参数 ​ 功能简介:左匹配参数 在参数值的左边加通配符* ​ 使用方法:[LV:参数名]或者[LEFT_MATCH:参数名] ###### 4.27 长整形参数 ​ 功能简介: ​ 使用方法:[L:参数名]或者[LONG:参数名] ###### 4.28 模块配置参数 ​ 功能简介: ​ 使用方法:[MC:参数名] ###### 4.29 UUID参数 ​ 功能简介: ​ 使用方法:[UUID:参数名] ###### 4.30 OR参数 ​ 功能简介:OR参数 根据参数名获得多个参数值,生成OR语句,比如:[OR_D:param:field]生成 field=1 or field=2 ​ 使用方法:[DR_D:参数名] ###### 4.31 OR参数 ​ 功能简介:OR参数 根据参数名获得多个参数值,生成OR语句,比如:[OR_D:param:field]生成 field='1' or field='2' ​ 使用方法:[DR_S:参数名] ###### 4.32 页对象参数 ​ 功能简介: ​ 使用方法:[PAGE:参数名] ###### 4.33 参数长度参数 ​ 功能简介:参数长度参数 根据指定参数取得的参数值数组长度 ​ 使用方法:[PL:参数名]或者[PARAMETER-LENGTH:参数名] ###### 4.34 密码参数 ​ 功能简介: ​ 使用方法:[PWD:参数名]或者[PASSWORD:参数名] ###### 4.35 替换参数 ​ 功能简介:替换参数 根据参数名取得参数值,用参数值替换 ​ 使用方法:[REPLACE:参数名] ###### 4.36 请求头参数 ​ 功能简介:请求头参数 根据请求头名替换到指定位置 ​ 使用方法:[REQUEST_HEADER:参数名] ###### 4.37 请求方法参数 ​ 功能简介:请求方法参数 ​ 使用方法:[REQUEST_METHOD:参数名] ###### 4.38 请求URL参数 ​ 功能简介:请求URL参数 用请求URL赋值 ​ 使用方法:[REQUEST_URL:参数名] ###### 4.39 右匹配参数 ​ 功能简介:右匹配参数 在参数值的右边加上通适符* ​ 使用方法:[RV:参数名]或者[RIGHT_MATCH:参数名] ###### 4.40 Schema参数 ​ 功能简介: ​ 使用方法:[SCHEMA:参数名] ###### 4.41 流水号参数 ​ 功能简介:流水号参数 使用方法:[SN:请求参数名:关键字段名1@关键字段名1@关键字段名1:顺序号位数],首先借助关键字段名从请求中取动态值,如果取不到以关键字段名作为值 ​ 使用方法:[SN:参数名]或者[SERIAL_NUMBER:参数名] ###### 4.42 系统ID叁数 ​ 功能简介: 自动填充当前系统ID ​ 使用方法:[SYSTEM_ID] ###### 4.43 系统名称参数 ​ 功能简介:填充当前系统名称 ​ 使用方法:[SYSTEM_NAME] ###### 4.44 获取系统参数 ​ 功能简介: 可以从环境变量读取参数 ​ 使用方法:[SP:参数名]或者[SYSTEM_PARAMETER:参数名] ###### 4.45 获取租户ID参数 ​ 功能简介:填充租户ID,默认为0 ​ 使用方法:[TENANT_ID] ###### 4.46 获取租户名称参数 ​ 功能简介:填充租户名称,默认为spring.application.name指定的名称 ​ 使用方法:[TENANT_NAME] ###### 4.47 时间参数 ​ 功能简介:设置时间参数,输入时间值为:hh:mm:ss或者hh:mm ​ 使用方法:[T:参数名]或者[TIME:参数名] ###### 4.48 日期时间参数 ​ 功能简介:根据指定的日期时间值赋值,日期时间值格式为:yyyy-MM-dd HH:mm:ss/yyyy-MM-dd HH:mm/yyyy-MM-dd HH/yyyy-MM-dd ​ 使用方法:[TS:参数名]或者[TIMESTAMP:参数名] ###### 4.49 生成36位UUID参数 ​ 功能简介:填充36位UUID值 ​ 使用方法:[UUID36] ###### 4.50 生成8位UUID参数 ​ 功能简介:填充8位UUID值 ​ 使用方法:[UUID8] ###### 4.51 生成30位UUID参数 ​ 功能简介:填充30位UUID值 ​ 使用方法:[UUID] ###### 4.52 URL存储参数 ​ 功能简介:根据指定的参数值转化为标准的URL格式 ​ 使用方法:[URL_SAVE:参数名] ###### 4.53 根据指定用户ID赋值用户姓名参数 ​ 功能简介:适用场景,有了用户ID,需要取得用户名的情况 ​ 使用方法:[USER_NAME:参数名] ###### 4.54 字符串参数 ​ 功能简介:填充字符串值 ​ 使用方法:[V:参数名]或者[STRING:参数名] ###### 4.55 yesno参数 ​ 功能简介:根据参数值为1时,赋值为1,否则赋值为0 ​ 使用方法:[YESNO:参数名] 5. ##### 自定义参数说明 5.1 自定义类,继承类com.pesking.core.sqlparser.parameter.SqlParameterProcessor ```java @Component public class VarcharSqlParameterHandler extends SqlParameterProcessor { @Override public void handle(StringBuilder sbSQL, Parameter parameter, List processors, SqlParameter sqlParameter) { sbSQL.append("?"); processors.add(sqlParameter); } @Override public void setParameter(PreparedStatement ps, Parameter parameter, int index,SqlParameter sqlParameter) throws SQLException { String value = parameter.getParameter(sqlParameter.getName()); if (value != null && value.trim().length() > 0) { ps.setString(index,value); } else { ps.setNull(index, java.sql.Types.VARCHAR); } } @Override public List getSqlParameterType() { return Arrays.asList(new String []{"V","STRING"}); } } ``` 备注:参数类型值:必须保证唯一性,重复就会报错 6. ##### freemarker模板使用说明 Freemarker是一款 模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 **Freemarker基础语法种类** 1、注释,即<#-- -->,介于其之间的内容会被freemarker忽略 ```text <#--我是一个freemarker注释--> ``` 2、插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..} ```text Hello ${name} ``` 3、FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。 ```text <# >FTL指令 ``` 4、文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。 ```text <#--freemarker中的普通文本--> 我是一个普通的文本 ``` **集合指令-List** 集合指令List的指令格式如下: ```text <#list> ``` 例子: ```text <#list stus as stu> ${stu_index+1} ${stu.name} ${stu.age} ${stu.money} ``` ${k_index}:得到循环的下标,使用方法是在stu后边加"_index",它的值是从0开始。 **集合指令-Map** 1.获取map中的值 ```text map['keyname'].property map.keyname.property ``` 2.遍历map ```text <#list userMap?keys as key> key:${key}--value:${userMap["${key}"]} ``` if指令 if指令的语法格式如下: ```text <#if expression> <#else> ``` 需求:在list集合中判断学生为小红的数据字体显示为红色。 ```text <#if stu.name='小红'> ${stu_index} ${stu.name} ${stu.age} ${stu.money} <#else > ${stu_index} ${stu.name} ${stu.age} ${stu.money} ``` 在freemarker中,判断是否相等,=与==是一样的。 FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括: ①加法:+ ②减法:- ③乘法:* ④除法:/ ⑤求模(求余):% 常见的比较运算符,和它们用途说明如下表: ![img](https://pic4.zhimg.com/80/v2-0ca6c88b049652a56d5a42d0a4cb37d7_720w.webp) 注意事项:=和!=可以用于字符串、数值和日期来比较是否相等 =和!=两边必须是相同类型的值,否则会产生错误字 符串"x"、"x "、"X"比较是不等的.因为FreeMarker是精确比较 gt代替>, FreeMarker会把>解释成FTL标签的结束字符,可使用括号避免这种情况,如:<#if (x>y)> **空值处理** 1、判断某变量是否存在使用"??"用法为:variable??,如果该变量存在,返回true,否则返回false。 例:为防止stus为空报错可以加上判断如下: ```text <#if stus??> <#list stus as stu> ...... ``` 2、缺失变量默认值使用"!" 使用!要以指定一个默认值,当变量为空时显示默认值,例如${name!''}表示如果name为空显示空字符串。 如果是嵌套对象则建议使用()括起来,例如${(stu.name)!''}表示,如果stu或name为空默认显示空字符串。 **内建函数** 内建函数语法格式:变量+?+函数名称 1.集合的大小。 ```text ${集合名?size} ``` 2.日期格式化 ```text 显示年月日: ${today?date} 显示时分秒:${today?time} 显示日期+时间:${today?datetime} 自定义格式化:${today?string("yyyy年MM月")} ``` 3.内建函数c ```text model.addAttribute("point", 102920122); ``` point是数字型,使用${point}会显示这个数字的值,每三位使用逗号分隔。如果不想显示为每三位分隔的数字,可以使用c函数将数字型转成字符串输出。 ```text ${point?c} ``` 4.将json字符串转成对象 一个例子:其中用到了assign标签,assign的作用是定义一个变量。 ```text <#assign text="{'bank':'工商银行','account':'10101920201920212'}" /> <#assign data=text?eval /> 开户行:${data.bank}账号:${data.account} ```