`
badqiu
  • 浏览: 674489 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

动态构造sql利器:rapid-xsqlbuider 详细说明

阅读更多

特性列表:

  1. 动态构造sql条件语句,提供sql拼接与使用占位符两种方式
  2. 数据类型的修饰
  3. 对SQL注入攻击的防范

问题:

手工构造SQL语句的情况

 
String sql = "select * from user where 1=1 ";
String user_id = (String)filters.get("user_id");
if( user_id != null && user_id.length() > 0) {
   sql = sql + " and user_id = " + user_id;
}
String age = (String)filters.get("age");
if(age != null && age.length() > 0) {
   sql = sql + " and age > " + age;
}
 

过多的if判断导致sql语句不清晰,我们再来看下rapid-xsqlbuilder的做法

rapid-xsqlbuilder构造SQL例子

示例:

// 清晰的sql语句,/~ ~/为一个语法块
 String sql= "select * from user where 1=1 " 
         + "/~ and username = {username} ~/"   
         + "/~ and password = {password} ~/";   
 
 // filters为参数
 Map filters = new HashMap();   
 filters.put("username", "badqiu"); 
 filters.put("sex", "F");  
 
 XsqlFilterResult result = new XsqlBuilder().generateHql(sql,filters);
 
 assertTrue(result.getAcceptedFilters().containsKey("username"));
 assertFalse(result.getAcceptedFilters().containsKey("sex"));
 assertEquals("select * from user where 1=1  and username = :username ", result.getXsql());
 

XsqlFilterResult为处理完返回的东西,包含两个属性xsql,acceptedFilters

被过滤掉的东西:

SQL过滤: /~ and password = {password} ~/
这一段由于在filters中password不存在而没有被构造出来

filters过滤: sex
filters中由于没有类似/~ sex={sex} ~/ 这一段,所以在过滤完的filters中不存在

最终构造生成的结果

HQL: XsqlFilterResult.xsql属性

select * from user where 1=1 and username=:username

构造后返回的Map filters: XsqlFilterResult.acceptedFilters 属性
username=badqiu

语法

语法

/~ {key} ~/
/~ [key] ~/
/~ {key_1} [key_2] ... {key_3} ~/
/~ {key?modifier} ~/
/~ {key?modifier(arg1,arg2) ~/
/~ {key?modifier?modifier?...?modifier} ~/

示例:

/~ username = {username} ~/
/~ password like '%[password]%' ~/
/~ birthDate > {startBirthDate} and birthDate < [endBirthDate] ~/

数据据类型修饰

将Map filters中的数据类型修饰为另外一种类型

/~ {username} ~/
/~ {age?int} ~/
/~ {birthDate?timestamp(yyyy年MM月dd日)} ~/

中括号[]与大括号{}的区别

中括号会直接替换为其值,用于拼接SQL
在XsqlFilterResult.getAcceptedFilters()中不会存在该key的值
如 /~ username like '%[username]%' ~/,如果filters中username=badqiu
则会生成: username like '%badqiu%'

 

大拓号只是起到标记作用,用于占位符
原始方法是XsqlBuilder.applyFilters(sql,filters);
如"/~ and username = {username} ~/",过滤完还是为 and username = {username}
但在这时我们使用将{username}替换为HQL的:username或是SQL的?号

SQL注入攻击的防范

问题:
拼接的SQL如果不对单引号(有些数据库有反斜杠)进行过滤,则会存在SQL注入攻击问题

解决:
使用SafeSqlProcesser,进行sql过滤

XsqlBuilder builder = new XsqlBuilder(SafeSqlProcesserFactory.getMysql());
 

SafeSqlProcesser其中的一个源码分析

/**
 * 过滤单个单引号为双引号的SafeSqlFilter<p>
 * 适用数据库(MS SqlServer,Oracle,DB2)
 */
public String process(String value) {
	if(value == null) return null;
	return value.replaceAll("'", "''"); // Mysql还需过滤反斜框
}
 
最后不忘为rapid-framework宣传一下,本工具也集成在里面
rapid-framework简介:
一个类似 ruby on rails 的java web快速开发脚手架,本着不重复发明轮子的原则,框架只是将零散的struts(struts2)+spring+hibernate各个组件组装好在一起,并对struts及struts2进行改造,提供零配置编程,并内置一个强大的代码生成器及模板文件, 可以生成java的hibernat model,dao,manager,struts+struts2 action类,可以生成jsp的增删改查及列表页面
7
4
分享到:
评论
7 楼 atgoingguoat 2010-08-30  
XsqlBuilder builder = new XsqlBuilder(SafeSqlProcesserFactory.getMysql()); 你是作者?
如果不是,那你只是复制来的。
能否给个例子。
6 楼 littcai 2008-12-11  
大括号最好支持模糊匹配
5 楼 spiritfrog 2008-08-07  
String sql= "select * from user where 1=1
能不能把这个1=1去掉?看着不顺眼
4 楼 lzmhehe 2008-08-06  
比较实用的小工具
#  String sql= "select * from user where 1=1 "  
#          + "/~ and username = {username} ~/"    
#          + "/~ and password = {password} ~/";    
#   

这个sql 能通过代码生成工具生成
那么条件查询就简单多了


3 楼 badqiu 2008-08-06  
影响样式的问题只需修改一下css就可以了

[url]http://svn.javascud.org/svn/si/validation/trunk/doc/index.html [/url]

你看下同行显示,validation正在开发,计划下周发布一个版本.
2 楼 flyfan 2008-08-06  
又多了一个工具了,现在在等你验证框架的新版,不知什么时候出
1 楼 lxy19791111 2008-08-06  
不错,有时间一定好好使用一下,badqiu好样的!

相关推荐

    动态构造sql的利器rapid-xsqlbuider

    总的来说,Rapid-XSQLBuilder 是一款优秀的工具,它使得动态构造 SQL 语句变得更加简洁、安全,极大地提高了代码的可读性和可维护性,特别适合在代码生成器或者需要动态构建复杂查询的场景中使用。通过掌握其特有的...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    它详细介绍了T-SQL的内部体系结构,包含了非常全面的编程参考,提供了使用Transact-SQL(T-SQL)的专家级指导,囊括了非常全面的编程参考,揭示了基于集合的查询的强大威力,并包含大量来自专家们的参考和建议。...

    Microsoft SQL Server 2005技术内幕:T-SQ程序设计 【中文版】 1

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计 中文版本的 第一部分 第二部分地址:http://download.csdn.net/source/2680866

    Inside Microsoft SQL Server 2008 T-SQL Programming.pdf

    本书主要聚焦于T-SQL(Transact-SQL)编程语言的使用,T-SQL是SQL Server使用的SQL方言,它不仅包括标准SQL的功能,还扩展了许多专为SQL Server设计的独特特性。T-SQL编程基础部分涵盖了以下内容: - **SQL语句语法...

    Microsoft SQL Server 2005技术内幕:T-SQL查询 pdf 中文版 2

    Microsoft SQL Server 2005技术内幕:T-SQL查询 pdf 中文版 第二部分 第一部分地址:http://download.csdn.net/source/2684220

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计 中文版 2(4-2)

    Microsoft.Press.Inside.Microsoft.SQL.Server.2005.T-SQL.Querying

    sqlserver2005技术内幕:t-sql程序设计part1(中文完整版分4份下)

    本书是InsideMicrosoftSQLServer2005系列四本著作中的一本

    maven 下载 sqljdbc4-4.0.jar

    在Java编程环境中,连接Microsoft SQL Server数据库通常需要特定的驱动程序,这就是所谓的JDBC驱动程序。`sqljdbc4-4.0.jar`是Microsoft提供的一个适用于Java的SQL Server JDBC驱动程序,它允许Java应用程序通过JDBC...

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计 中文版 4(4-4)

    Microsoft SQL Server 2005技术内幕: T-SQ程序设计 Microsoft.Press.Inside.Microsoft.SQL.Server.2005.T-SQL.Querying

    SQL Server 2005技术内幕系列打包(涵盖4本PDF).part3

    ——《Microsoft SQL Server 2005 技术内幕:T-SQL程序设计》、《Microsoft SQL Server 2005 技术内幕:T-SQL查询》、《Microsoft SQL Server 2005 技术内幕:查询、调整和优化》、《Microsoft SQL Server 2005 技术...

    sql-map-2.dtd和sql-map-config-2.dtd

    本文将深入探讨与“sql-map-2.dtd”和“sql-map-config-2.dtd”相关的知识点,以及它们在Ibatis中的作用。 Ibatis是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在配置文件中,通过XML映射...

    rapid-framework-3.9.3.20100923

    在深入探讨其详细知识点之前,我们先了解下"Rapid"一词在IT领域的含义,它通常表示快速开发或快速原型设计,意味着该框架旨在提高开发速度并降低复杂性。 **1. 框架概述** Rapid-Framework 是一套全面的软件开发...

    多功能SQL构造器SQLBuilder.Core库 C#源码

    项目名称:多功能SQL构造器SQLBuilder.Core 项目概述: SQLBuilder.Core是一个C#编写的多功能SQL构造器库,旨在简化不同数据库系统下的SQL语句构建工作。该库支持主流的数据库平台,包括SqlServer、MySql、Oracle、...

    springside4.3.0的jar包

    我找了很久,都是那种hubgit上的那种,一直没明白怎么用,终于后来会了,不明白为什么不直接提供jar包,还要自己生成。...仅支持Oracle, H2, MySql, PostgreSql, SQLServer。包括core和utils,以及source源码

    PL/SQL 用户指南与参考

    - 执行动态构造的SQL。 #### 第十二章 PL/SQL应用程序性能调优 - **性能优化技巧**: - 索引使用。 - 查询优化。 - 存储过程与包的高效使用。 - **调试工具**: - 跟踪与调试。 - 性能分析器。 通过以上章节...

    SQL Server 2005技术内幕系列打包(涵盖4本PDF).part1

    ——《Microsoft SQL Server 2005 技术内幕:T-SQL程序设计》、《Microsoft SQL Server 2005 技术内幕:T-SQL查询》、《Microsoft SQL Server 2005 技术内幕:查询、调整和优化》、《Microsoft SQL Server 2005 技术...

    sql server 导入超大SQL脚本文件

    SQL Server 导入超大 SQL 脚本文件 SQL Server 是一种关系型数据库管理系统,广泛应用于各种行业。然而,在实际应用中,我们经常会遇到导入超大 SQL 脚本文件的问题。本文将介绍如何使用 osql 工具来导入超大 SQL ...

    xmljava系统源码-rapid-generator:基于FreeMarker的rapid-generator代码生成器

    基于数据库,内建好数据库的model,并支持多种数据库(mysql,sql server,oracle测试通过) 半手工方式,生成的代码放在某个目录,再手工拷贝回来工作区 易于做二次开发,整个生成器本身就是java源代码,源代码核心十分精简,...

    g构造sql注入点 g构造sql注入点

    根据给定的文件信息,我们将深入探讨SQL注入的相关知识点,特别是如何通过构造SQL注入点来实现对系统的攻击。首先,我们需要了解SQL注入的基本概念、原理以及防范措施。 ### SQL注入基本概念 SQL注入是一种常见的...

    sql server 2005 技术内幕 T-SQL查询 中文清晰pdf part4

    学习sql server 和sql 的两本经典的著作: 《sql server 2005 技术内幕 T-SQL查询》 《sql server 2005 技术内幕 T-SQL程序设计》 网上大多的资源都是英文的,好容易找到中文的了,上传上来和大家分享。 这两本书都...

Global site tag (gtag.js) - Google Analytics