自制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.存储 ...
随机推荐
- 搭建 windows(7)下Xgboost(0.4)环境 (python,java)以及使用介绍及参数调优
摘要: 1.所需工具 2.详细过程 3.验证 4.使用指南 5.参数调优 内容: 1.所需工具 我用到了git(内含git bash),Visual Studio 2012(10及以上就可以),xgb ...
- 推荐一个不错的在线制图网站---ProcessOn
http://www.processon.com/ 它是什么? ProcessOn是一个面向垂直专业领域的作图工具和社交网络,成立于2011年6月并于2012年启动.ProcessOn将全球的专家顾问 ...
- 4. SVM分类器求解(2)
最优间隔分类器(optimal margin classifier) 重新回到SVM的优化问题: 我们将约束条件改写为: 从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数,也 ...
- How to debug .NET Core RC2 app with Visual Studio Code on Windows?
Simone Chiaretta (http://codeclimber.net.nz/archive/2016/05/20/How-to-debug-NET-Core-RC2-app-with-Vi ...
- ECharts 初识(基于MVC+jQuery+Angularjs实现的Demo)
一.背景: 我们这行做web开发的,很多时候都需要做数据统计报表,现在我所使用的是来自百度团队的ECharts.官方网址:http://echarts.baidu.com/ 我们知 ...
- eclipse打开文件所在目录
设置 添加扩展工具,添加步骤如下: Run-->External Tools-->External Tools Configurations... new 一个 programlocati ...
- linq to js使用汇总
用途:方便js操作查询json数据. 下载网址:http://jslinq.codeplex.com/ 使用方法:只需要引用linq.js即可. 查询方法: 一.where查询 var myList ...
- 在DevExpress程序中使用TeeList控件以及节点查询的处理
在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件, ...
- agsXMPP
agsXMPP使用 agsXMPP中的例子已经有注册.登录.添加好友.接收好友添加请求.发送消息.接收消息等功能. 修改用户密码 登录后可用以下方法修改密码 IQ iq = new IQ(IqType ...
- JAVA使用JDBC技术操作SqlServer数据库
JDBC(JavaData Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组 ...