此文章是基于  搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台

一. jar包介绍

  1. commons-digester3-3.2.jar

  2. commons-beanutils-1.9.3.jar

二. 类介绍

  1. SqlXmlParser.java,xml 解析器

  1. package com.ims.persistence.base;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStream;
  6. import java.text.MessageFormat;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Map;
  10.  
  11. import org.apache.commons.digester3.Digester;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.apache.log4j.Logger;
  14.  
  15. public class SqlXmlParser {
  16. private String sqlXml;
  17. private static Digester digester;
  18.  
  19. private static String webrootPath = System.getProperty("webapp.root")+"sql/";
  20. private static Logger logger = Logger.getLogger(SqlXmlParser.class);
  21.  
  22. static{
  23. digester = new Digester();
  24. digester.setValidating(false);
  25.  
  26. digester.addObjectCreate("set", SqlSet.class);
  27.  
  28. digester.addObjectCreate("set/sql", Sql.class);
  29. digester.addSetProperties("set/sql");
  30. digester.addBeanPropertySetter("set/sql/pattern");
  31. digester.addSetNext("set/sql", "addSql");
  32.  
  33. digester.addObjectCreate("set/sql/param", SqlParam.class);
  34. digester.addSetProperties("set/sql/param");
  35. digester.addSetNext("set/sql/param", "addParam");
  36. }
  37.  
  38. public SqlXmlParser(String sqlXml){
  39. this.sqlXml = sqlXml;
  40. }
  41.  
  42. public String parse(String sqlName, Map<String, String> params){
  43. InputStream is = null;
  44. String result = null;
  45. try{
  46. is = new FileInputStream(new File(webrootPath+sqlXml));
  47. SqlSet sqlSet = (SqlSet)digester.parse(is);
  48. Sql sql = sqlSet.getSqls().get(sqlName);
  49. List<String> paramList = new ArrayList<String>();
  50. for(SqlParam param : sql.getCondition()){
  51. String value = params.get(param.getName());
  52. paramList.add(param.getPosition(), StringUtils.isBlank(value)?"":value);
  53. }
  54. result = MessageFormat.format(sql.getPattern(), paramList.toArray());
  55. }catch(Exception e1){
  56. logger.error("sql文件解析异常:"+e1);
  57. }finally {
  58. if(is != null) {
  59. try {
  60. is.close();
  61. }catch (Exception e2) {
  62. logger.error("sql文件流关闭异常:"+e2);
  63. }
  64.  
  65. is = null;
  66. digester.clear();
  67. }
  68. }
  69.  
  70. return result;
  71. }
  72. }

  

  2. SqlSet.java

  1. package com.ims.persistence.base;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. public class SqlSet {
  7. private Map<String, Sql> sqls = new HashMap<String, Sql>();
  8.  
  9. public void addSql(Sql sql){
  10. sqls.put(sql.getName(), sql);
  11. }
  12.  
  13. public Map<String, Sql> getSqls() {
  14. return sqls;
  15. }
  16. public void setSqls(Map<String, Sql> sqls) {
  17. this.sqls = sqls;
  18. }
  19. }

  

  3. Sql.java

  1. package com.ims.persistence.base;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Sql{
  7. private String name;
  8. private String pattern;
  9. private List<SqlParam> condition = new ArrayList<SqlParam>();
  10.  
  11. public void addParam(SqlParam param){
  12. condition.add(param);
  13. }
  14.  
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21.  
  22. public String getPattern() {
  23. return pattern;
  24. }
  25. public void setPattern(String pattern) {
  26. this.pattern = pattern;
  27. }
  28.  
  29. public List<SqlParam> getCondition() {
  30. return condition;
  31. }
  32. public void setCondition(List<SqlParam> condition) {
  33. this.condition = condition;
  34. }
  35. }

  

  4. SqlParam.java

  1. package com.ims.persistence.base;
  2.  
  3. public class SqlParam {
  4. private String name;
  5. private Integer position;
  6.  
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13.  
  14. public Integer getPosition() {
  15. return position;
  16. }
  17. public void setPosition(Integer position) {
  18. this.position = position;
  19. }
  20. }

  

三. 使用方法介绍  

  1. WebContent/sql 下创建包含sql语句的xml文件,例如:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <set>
  3. <sql name="codeType">
  4. <pattern>
  5. <![CDATA[
  6. select A.id, A.value, A.text
  7. from sys.code A
  8. left join sys.codeType B on A.codeTypeId = B.id
  9. where (case when "{0}"="" then 1=1 else B.codeType = "{0}" end)
  10. and (case when "{1}"="" then 1=1 else A.isEnable = "{1}" end)
  11. and (case when "{2}"="" then 1=1 else A.isDefault = "{2}" end)
  12. ]]>
  13. </pattern>
  14.  
  15. <param name="codeType" position="0" />
  16. <param name="isEnable" position="1" />
  17. <param name="isDefault" position="2" />
  18.  
  19. </sql>
  20. </set>

  

  2. 类中使用,例如:

  1. public class CodeBSImpl implements CodeBS{
  2. private static final String sqlXml = "sys/code.xml";
  3.  
  4. @Override
  5. public List<Map<String, Object>> getValueTextListByType(String codeType) {
  6. Map<String, String> paramMap = new HashMap<String, String>();
  7. paramMap.put("codeType", codeType);
  8. List<Map<String, Object>> list = codeDao.findBySql(new SqlXmlParser(sqlXml).parse("codeType", paramMap));
  9. List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
  10. for(Map<String, Object> map:list){
  11. Map<String, Object> temp = new HashMap<String, Object>();
  12. temp.put("value", map.get("value"));
  13. temp.put("text", map.get("text"));
  14. result.add(temp);
  15. }
  16. return result;
  17. }
  18.  
  19. }

自制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. 搭建 windows(7)下Xgboost(0.4)环境 (python,java)以及使用介绍及参数调优

    摘要: 1.所需工具 2.详细过程 3.验证 4.使用指南 5.参数调优 内容: 1.所需工具 我用到了git(内含git bash),Visual Studio 2012(10及以上就可以),xgb ...

  2. 推荐一个不错的在线制图网站---ProcessOn

    http://www.processon.com/ 它是什么? ProcessOn是一个面向垂直专业领域的作图工具和社交网络,成立于2011年6月并于2012年启动.ProcessOn将全球的专家顾问 ...

  3. 4. SVM分类器求解(2)

    最优间隔分类器(optimal margin classifier) 重新回到SVM的优化问题: 我们将约束条件改写为: 从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数,也 ...

  4. 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 ...

  5. ECharts 初识(基于MVC+jQuery+Angularjs实现的Demo)

    一.背景:      我们这行做web开发的,很多时候都需要做数据统计报表,现在我所使用的是来自百度团队的ECharts.官方网址:http://echarts.baidu.com/      我们知 ...

  6. eclipse打开文件所在目录

    设置 添加扩展工具,添加步骤如下: Run-->External Tools-->External Tools Configurations... new 一个 programlocati ...

  7. linq to js使用汇总

    用途:方便js操作查询json数据. 下载网址:http://jslinq.codeplex.com/ 使用方法:只需要引用linq.js即可. 查询方法: 一.where查询 var myList ...

  8. 在DevExpress程序中使用TeeList控件以及节点查询的处理

    在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件, ...

  9. agsXMPP

    agsXMPP使用 agsXMPP中的例子已经有注册.登录.添加好友.接收好友添加请求.发送消息.接收消息等功能. 修改用户密码 登录后可用以下方法修改密码 IQ iq = new IQ(IqType ...

  10. JAVA使用JDBC技术操作SqlServer数据库

    JDBC(JavaData Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组 ...