`
西门吹牛
  • 浏览: 227226 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

仿valuelist式动态sql拼装

    博客分类:
  • java
阅读更多
   非常喜欢valuelist拼sql的处理方式,遂写了该工具类,这下也可以弥补hibernate动态sql的缺陷了,将来应该会用到
<?xml version="1.0" encoding="UTF-8" ?>
<sql-definition>
	<sqls>
		<sql name="sql1">
			select 1 from dual
			where 1=1
			/~name: and name={name}~/
			/~age: and age={age}~/
			order by 1
		</sql>
		<sql name="sql2">
			select 1 from dualx
			where 1=1
			/~name: and name={name}~/
			/~age: and age={age}~/
			order by 1
		</sql>
	</sqls>
</sql-definition>


public class SqlUtil {
	
	private static String startToken = "/~";
	private static String endToken = "~/";
	private static String XML_FILE_PATH="sql.xml";
	private static Map<String, StringBuilder> sqls=new HashMap<String, StringBuilder>();
	
	static {
		init();
	}
	
	public static StringBuilder getSql(String sqlName,Map<String, Object> queryMap){
		return  manipulate(sqls.get(sqlName), queryMap);
	}
	
	private static StringBuilder manipulate(StringBuilder text ,Map<String , Object> model){
		for (int start = 0, end = text.indexOf(endToken); ((end = text.indexOf(endToken)) >= 0);){
			start = text.lastIndexOf(startToken, end);
	        String key = text.substring(start + 2, text.indexOf(":", start));
	        Object modelValue = model.get(key);
	        if(modelValue==null){
	        	text.replace(start, end + 2, "");
	        }else{
	        	text.replace(start, end + 2, text.substring(text.indexOf(":", start) + 1, end));
	        }
	        
		}
		String valueStartToken="{";
		String valueEndToken="}";
		for (int start = 0, end = text.indexOf(valueEndToken); ((end = text.indexOf(valueEndToken)) >= 0);){
			start=text.lastIndexOf(valueStartToken,end);
			String key = text.substring(start + valueStartToken.length(), end);
			Object modelValue = model.get(key);
	        if(modelValue==null){
	        	text.replace(start, end + valueEndToken.length(), "");
	        }else{
	        	String value;
	        	if(modelValue instanceof String){
	        		
	        		value="'"+modelValue+"'";
	        	}else{
	        		value=modelValue+"";
	        	}
	        	text.replace(start, end + valueEndToken.length(), value);
	        }
		}
		return text;
	}
	
	@SuppressWarnings("unchecked")
	private static void init(){
		try {
			Configuration config = new XMLConfiguration(XML_FILE_PATH);
			List<String> sqllist =config.getList("sqls.sql");
			for (int i = 0; i < sqllist.size(); i++) {
				String sql = config.getString("sqls.sql("+i+")");
				String name = config.getString("sqls.sql("+i+")[@name]");
				sqls.put(name, new StringBuilder(sql));
			}
		} catch (ConfigurationException e) {
			e.printStackTrace();
		}
	}
	@Deprecated
	public static void reInit(){
		sqls.clear();
		init();
	}
	
	
	public static void main(String[] args) {
		Map<String, Object> map=new HashMap<String, Object>();
		map.put("name", null);
		map.put("age", 45);
		StringBuilder sql = SqlUtil.getSql("sql1", map);
		System.out.println(sql);
	}

}
分享到:
评论

相关推荐

    分离valuelist的sql拼装

    本话题聚焦于“分离valuelist的SQL拼装”,这是一个常见的编程需求,尤其是在处理批量数据插入、更新或者查询时。在描述中提到的博文链接已经失效,无法直接获取详细内容,但我们可以根据这个主题进行深入的探讨。 ...

    java分页插件valuelist

    2. **数据库查询优化**:Valuelist可能采用SQL动态拼接技术,只查询所需的数据,而不是全表扫描,这显著提高了查询效率。 3. **结果封装**:将数据库查询结果转化为适合分页展示的对象列表,同时包含总条数、总页数...

    ValueList_delphiValueList_

    在Delphi编程环境中,`ValueList`是一种非常实用的组件,尤其对于初学者来说,它提供了方便的方式来管理和处理数据集合。`ValueList`组件通常用于存储键值对,类似于其他编程语言中的字典或哈希表。在这个压缩包中,...

    valueList 分页插件的使用

    本实例使用SSH框架整合开发,sqlserver2000数据库,valueList 插件,目的是练习分页插件的使用。由于jar包文件太多,故把jar包删去了,使用者只要加上SSH的jar文件,导入eclipse就可以运行

    valuelist

    "valuelist"是一个专为高性能表格展示设计的组件,主要应用于J2EE环境中,它提供了丰富的功能,如分页、分组以及排序等,旨在优化数据处理和用户体验。在这个项目中,我们可以看到一系列的JSP文件,这些文件是Web...

    兔八哥ValueList的文档0.3

    兔八哥ValueList文档翻译 概述:ValueList是一个强大的数据访问工具,它可以帮助开发者快速构建数据驱动的应用程序。本文档是ValueList的官方文档翻译,旨在帮助开发者更好地理解和使用ValueList。 一、ValueList...

    ValueList的文档

    3. `ValueListAdapter` 执行 SQL 查询,将查询结果转换为 `ValueList`,其中包含一组Java对象,这些对象反映了数据库中的记录。 4. 可以遍历 `ValueList`,处理或展示返回的数据。 **总结** ValueList 是一个简化...

    valuelist war

    valuelist;valuelist;valuelist;valuelist; 不错的表格控制技术

    包括应用示例的功能强大的分页组件valuelist0.1.8

    - **兼容性**: 兼容多种数据库,包括MySQL、Oracle、SQL Server等,同时支持JDBC和ORM框架如Hibernate、MyBatis。 - **应用示例**:随组件提供的应用示例帮助开发者快速理解和使用,通过实际操作了解其工作原理和...

    ValueList技术分享 ValueList技术应用.doc

    在传统的JDBC操作中,从数据库获取数据通常涉及大量的SQL编写和结果集遍历,这不仅繁琐且容易出错。ValueList技术引入了一种新的处理方式,它鼓励开发者使用ValueListHandler服务来统一处理从service层获取到的POJO...

    功能强大的JSP分页组件 valuelist0.1.8

    功能强大的JSP分页组件 valuelist0.1.8 封装的很好

    权限控制(struts2+hibernate+spring+struts-menu+valuelist)

    Struts2处理请求和展示,Hibernate管理数据持久化,Spring提供整体架构支持并负责整合其他组件,struts-menu实现动态菜单,而valuelist则优化了数据检索和展示。这样的设计不仅提高了开发效率,也保证了系统的稳定性...

    如何通过配置自动实现ValueList中hql语句的整型参数转换

    这样,每次ValueList在拼装HQL之前,会先调用`IntegerSetter`中的`setParameter`方法,将接收到的String参数转换为Integer类型,然后再传递给HQL语句。这样既简化了代码,也避免了数据库迁移时的兼容性问题。 总结...

    c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    sql.Append($"INSERT INTO TableName ({columnList}) VALUES ({valueList});"); } command.CommandText = sql.ToString(); command.ExecuteNonQuery(); ``` 这里,`columnList`和`valueList`应根据实际列和值...

    Android高仿微信支付密码输入控件

    在initData()方法中,填充了一个包含这些键值的列表valueList,并为GridView设置适配器。当用户点击GridView中的项时,会触发onItemClick()监听器,处理相应的输入或删除操作。 在onItemClick()方法中,可以通过...

    用JDBC实现数据库的级联删除与更新

    public int updateSchools(String condition, List&lt;Object&gt; valueList, School sch) throws DBException; public List&lt;School&gt; findSchools(String conditions, List&lt;Object&gt; ValueList) throws DBException; ...

    动态给表添加删除字段并同时修改它的插入更新存储过程

    本文将深入探讨如何在SQL Server环境中动态地为表添加或删除字段,并同时修改与这些字段相关的插入和更新存储过程。 首先,我们需要创建一个辅助表[A],它有两个字段:[ID](自增长)和[FieldName]。表[A]的设计...

Global site tag (gtag.js) - Google Analytics