此文章是基于  搭建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动态参数配置的更多相关文章

  1. mybatis由浅入深day01_6SqlMapConfig.xml(6.2settings全局参数配置_6.3typeAliases(类型别名)_6.4typeHandlers(类型处理器)_6.5mappers(映射配置))

    6 SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) settings(全局配置参数) typeAli ...

  2. [sql]mysql参数(配置)手册

    my-innodb-heavy-4G.cnf配置文件注解 [client] #客户端 port = 3306 #mysql客户端连接时的默认端口号 socket = /application/mysq ...

  3. Spark2 SQL configuration参数配置

    查看当前环境SQL参数的配置 spark.sql("SET -v") key value spark.sql.hive.version 1.2.1 spark.sql.source ...

  4. Java的sql动态参数

    在C#的方法中可以使用params Parameter[] values来动态获取sql语句中的参数值数组.Java中可以自己封装出一个类似于C#的方法 1.获取结果集 /** * 获取结果集 * @ ...

  5. 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包如下 ...

  6. SQL动态配置,动态解析SQL

    在项目中使用SQL动态配置的方式可以让后期的维护和发布后的修改变得更加方便,无论使用那种配置方式都离不开解析成最终真正能执行的SQL.下面代码就是一种比较简单的处理方法,SQL的参数以##括起来. 1 ...

  7. redis动态修改参数配置

    ./redis-cli -h 10.10.10.11 -p 6401   save  # 保存当前快照   # 列出所有当前配置 config get *   # 查看指定配置 config get  ...

  8. mybatis 动态sql和参数

    mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...

  9. MySQL中limit使用动态参数的解决方法(拼接SQL字符串语句来执行SQL)

    官方好像说过limit已经在5.6版本上支持了动态参数,但是测试时依然还是不行. 那么要解决limit动态参数唯一能做的就是使用字符串SQL拼接的形式,然后再进行执行. 一般有以下方式解决: 1.存储 ...

随机推荐

  1. 基于HTTP的断点传输

    最近项目需要做一个类似于迅雷的文件下载功能,这类需求可能比较常见,希望可以帮助到有需要的同学 要求: 1.支持断点传输 2. 多文件同时下载 3. 由于是客户内部试用,服务器只支持HTTP文件下载不支 ...

  2. 大数据之Oozie——源码分析(一)程序入口

    工作中发现在oozie中使用sqoop与在shell中直接调度sqoop性能上有很大的差异.为了更深入的探索其中的缘由,开始了oozie的源码分析之路.今天第一天阅读源码,由于没有编译成功,不能运行测 ...

  3. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  4. GitHub实战系列~4.把github里面的库克隆到指定目录+日常使用 2015-12-11

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  5. $.extend({},defaults, options) --(初体验三)

    1.$.extend({},defaults, options) 这样做的目的是为了保护包默认参数.也就是defaults里面的参数. 做法是将一个新的空对象({})做为$.extend的第一个参数, ...

  6. Android之自定义View的实现

    对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...

  7. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  8. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  9. 现代3D图形编程学习-基础简介(1) (译)

    本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...

  10. domReady的实现

    我们都知道JQ的 $(document).ready(fn) 方法.可以在页面准备就绪后才执行脚本,该方法相比传统的window.onload 事件,它的优势体现于onload事件是需要等到页面中所有 ...