自制xml实现SQL动态参数配置
此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台
一. jar包介绍
1. commons-digester3-3.2.jar
2. commons-beanutils-1.9.3.jar
二. 类介绍
1. SqlXmlParser.java,xml 解析器
package com.ims.persistence.base; import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.apache.commons.digester3.Digester;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger; public class SqlXmlParser {
private String sqlXml;
private static Digester digester; private static String webrootPath = System.getProperty("webapp.root")+"sql/";
private static Logger logger = Logger.getLogger(SqlXmlParser.class); static{
digester = new Digester();
digester.setValidating(false); digester.addObjectCreate("set", SqlSet.class); digester.addObjectCreate("set/sql", Sql.class);
digester.addSetProperties("set/sql");
digester.addBeanPropertySetter("set/sql/pattern");
digester.addSetNext("set/sql", "addSql"); digester.addObjectCreate("set/sql/param", SqlParam.class);
digester.addSetProperties("set/sql/param");
digester.addSetNext("set/sql/param", "addParam");
} public SqlXmlParser(String sqlXml){
this.sqlXml = sqlXml;
} public String parse(String sqlName, Map<String, String> params){
InputStream is = null;
String result = null;
try{
is = new FileInputStream(new File(webrootPath+sqlXml));
SqlSet sqlSet = (SqlSet)digester.parse(is);
Sql sql = sqlSet.getSqls().get(sqlName);
List<String> paramList = new ArrayList<String>();
for(SqlParam param : sql.getCondition()){
String value = params.get(param.getName());
paramList.add(param.getPosition(), StringUtils.isBlank(value)?"":value);
}
result = MessageFormat.format(sql.getPattern(), paramList.toArray());
}catch(Exception e1){
logger.error("sql文件解析异常:"+e1);
}finally {
if(is != null) {
try {
is.close();
}catch (Exception e2) {
logger.error("sql文件流关闭异常:"+e2);
} is = null;
digester.clear();
}
} return result;
}
}
2. SqlSet.java
package com.ims.persistence.base; import java.util.HashMap;
import java.util.Map; public class SqlSet {
private Map<String, Sql> sqls = new HashMap<String, Sql>(); public void addSql(Sql sql){
sqls.put(sql.getName(), sql);
} public Map<String, Sql> getSqls() {
return sqls;
}
public void setSqls(Map<String, Sql> sqls) {
this.sqls = sqls;
}
}
3. Sql.java
package com.ims.persistence.base; import java.util.ArrayList;
import java.util.List; public class Sql{
private String name;
private String pattern;
private List<SqlParam> condition = new ArrayList<SqlParam>(); public void addParam(SqlParam param){
condition.add(param);
} public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
} public List<SqlParam> getCondition() {
return condition;
}
public void setCondition(List<SqlParam> condition) {
this.condition = condition;
}
}
4. SqlParam.java
package com.ims.persistence.base;
public class SqlParam {
private String name;
private Integer position;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPosition() {
return position;
}
public void setPosition(Integer position) {
this.position = position;
}
}
三. 使用方法介绍
1. WebContent/sql 下创建包含sql语句的xml文件,例如:
<?xml version="1.0" encoding="utf-8" ?>
<set>
<sql name="codeType">
<pattern>
<![CDATA[
select A.id, A.value, A.text
from sys.code A
left join sys.codeType B on A.codeTypeId = B.id
where (case when "{0}"="" then 1=1 else B.codeType = "{0}" end)
and (case when "{1}"="" then 1=1 else A.isEnable = "{1}" end)
and (case when "{2}"="" then 1=1 else A.isDefault = "{2}" end)
]]>
</pattern> <param name="codeType" position="0" />
<param name="isEnable" position="1" />
<param name="isDefault" position="2" /> </sql>
</set>
2. 类中使用,例如:
public class CodeBSImpl implements CodeBS{
private static final String sqlXml = "sys/code.xml";
@Override
public List<Map<String, Object>> getValueTextListByType(String codeType) {
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("codeType", codeType);
List<Map<String, Object>> list = codeDao.findBySql(new SqlXmlParser(sqlXml).parse("codeType", paramMap));
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
for(Map<String, Object> map:list){
Map<String, Object> temp = new HashMap<String, Object>();
temp.put("value", map.get("value"));
temp.put("text", map.get("text"));
result.add(temp);
}
return result;
}
}
自制xml实现SQL动态参数配置的更多相关文章
- mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))
6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...
- [sql]mysql参数(配置)手册
my-innodb-heavy-4G.cnf配置文件注解 [client] #客户端 port = 3306 #mysql客户端连接时的默认端口号 socket = /application/mysq ...
- Spark2 SQL configuration参数配置
查看当前环境SQL参数的配置 spark.sql("SET -v") key value spark.sql.hive.version 1.2.1 spark.sql.source ...
- Java的sql动态参数
在C#的方法中可以使用params Parameter[] values来动态获取sql语句中的参数值数组.Java中可以自己封装出一个类似于C#的方法 1.获取结果集 /** * 获取结果集 * @ ...
- 01_MyBatis EHCache集成及所需jar包,ehcache.xml配置文件参数配置及mapper中的参数配置
1 与mybatis集成时需要的jar ehcache-core-2.6.5.jar mybatis-ehcache-1.0.2.jar Mybatis.日志.EHCache所需要的jar包如下 ...
- SQL动态配置,动态解析SQL
在项目中使用SQL动态配置的方式可以让后期的维护和发布后的修改变得更加方便,无论使用那种配置方式都离不开解析成最终真正能执行的SQL.下面代码就是一种比较简单的处理方法,SQL的参数以##括起来. 1 ...
- redis动态修改参数配置
./redis-cli -h 10.10.10.11 -p 6401 save # 保存当前快照 # 列出所有当前配置 config get * # 查看指定配置 config get ...
- mybatis 动态sql和参数
mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...
- MySQL中limit使用动态参数的解决方法(拼接SQL字符串语句来执行SQL)
官方好像说过limit已经在5.6版本上支持了动态参数,但是测试时依然还是不行. 那么要解决limit动态参数唯一能做的就是使用字符串SQL拼接的形式,然后再进行执行. 一般有以下方式解决: 1.存储 ...
随机推荐
- Spark 生态系统组件
摘要: 随着大数据技术的发展,实时流计算.机器学习.图计算等领域成为较热的研究方向,而Spark作为大数据处理的“利器”有着较为成熟的生态圈,能够一站式解决类似场景的问题.那你知道Spark生态系统有 ...
- MySQL触发器-条件触发器语法
文章为作者原创,未经许可,禁止转载. -Sun Yat-sen University 冯兴伟 实验4 触发器 )实验目的 掌握数据库触发器的设计和使用方法 )实验内容和要求 定义BEFORE触发 ...
- 小知识:C#可选参数的一个陷阱
一.背景: 互联网行业,为了降低程序维护.升级的部署风险,往往会将程序拆分成很多项目,编译成多个dll部署,这样发布的时候,只需要部署修改过的dll即可. 二.问题: 有一个函数,在很多个地方被使 ...
- H5拍照应用开发经历的那些坑儿
一.项目简介 1.1.项目背景:这是一个在移动终端创新应用的项目,用户在浏览器端(微信/手Q)即可完成与金秀贤的合影,希望通过这样一种趣味体验,引发用户的分享与转发的热潮. 1.2.系统要求:ios6 ...
- 【补充】Gitlab 部署 CI 持续集成
上一篇:<劈荆斩棘:Gitlab 部署 CI 持续集成> 上一篇所配置的.gitlab-ci.yml: stages: - build - test before_script: - ec ...
- 如何通过官方渠道为Windows 10 添加具有中国特色的字体
Windows 10的变化细节上个人认为要比Windows 8多很多,而且很多功能找到之后还是小惊喜,就是挺多好用的地方居然都不正经宣传一下,微软真是搞得悄悄地干活? 今天为大家介绍一下通过官方途径添 ...
- 读书笔记--SQL必知必会13--创建高级联结
13.1 使用表别名 SQL可以对列名.计算字段和表名起别名. 缩短SQL语句 允许在一条SELECT语句中多次使用相同的表. 注意:表别名只在查询执行中使用,不返回到客户端. MariaDB [sq ...
- CSS制作三角形和按钮
CSS制作三角形和按钮 用上一篇博文中关于边框样式的知识点,能制作出三角形和按钮. 我先说如何制作三角形吧,相信大家在平时逛网站的时候都会看到一些导航栏中的三角形吧,比如说: 网易首页的头部菜单栏中, ...
- 仓位管理 – 1.理论篇
看到文章标题中的"仓位管理",读者可能会认为它只适用于股市投资.其实不然.只要是投资都涉及到风险.回报率.投资额度,都会涉及到仓位管理.再者,人生本身就带着无数的抉择.风险和回报, ...
- 『.NET Core CLI工具文档』(十)dotnet-build
说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-build 翻译:dotnet-build 名称 dotnet-build -- 生成项目和所有的依赖 概 ...