动态构造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() > ) {
    sql = sql + " and user_id = " + user_id;
 }
 String age = (String)filters.get("age");
 if(age != null && age.length() > ) {
    sql = sql + " and age > " + age;
 }
 

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

rapid-xsqlbuilder构造SQL例子

示例:

 1 // 清晰的sql语句,/~ ~/为一个语法块
 2  String sql= "select * from user where 1=1 " 
 3          + "/~ and username = {username} ~/"   
 4          + "/~ and password = {password} ~/";   
 5  
 6  // filters为参数
 7  Map filters = new HashMap();   
 8  filters.put("username", "badqiu"); 
 9  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 '�dqiu%'

大拓号只是起到标记作用,用于占位符
原始方法是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其中的一个源码分析

 
 
 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的增删改查及列表页面

xsqlbuilder使用说明的更多相关文章

  1. Atitit.项目修改补丁打包工具 使用说明

    Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...

  2. awk使用说明

    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...

  3. “我爱背单词”beta版发布与使用说明

    我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院  拒 ...

  4. Oracle 中 union 和union all 的简单使用说明

    1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...

  5. Map工具系列-02-数据迁移工具使用说明

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  6. Map工具系列-03-代码生成BySQl工具使用说明

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  7. jQuery验证控件jquery.validate.js使用说明

    官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...

  8. gdbsever 使用说明

    gdbsever 使用说明 在新塘N3292x平台下 编译 gdbsever ./configure --target=arm-linux --host=arm-linux arm-linux-gdb ...

  9. mongoVUE的增删改查操作使用说明

    mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{& ...

随机推荐

  1. zepto 获取checked selected元素

    原文阅读:WISER CODER 1. Zepto.js and the :selected and :checked selectors 如果你已经看上了jQuery那残弱的表兄弟, Zepto.j ...

  2. zendStudio安装Xdebug项目断点调试

    1,首先安装xdebug插件 传送门 2,配置php.ini文件如下: [XDebug] xdebug.profiler_append = xdebug.profiler_enable = xdebu ...

  3. Qt5 文本编辑

    [应用场景]:在编辑框中输入一段文字,用鼠标选取文字,修改工具栏上的字体.字号大小.加粗.斜体等属性,选取的文字即发生相应的变化.       一. 任何一个文本编辑器的程序都要用到QTextEdit ...

  4. jquery.session.js使用

    // jquery.session.js 简单使用方法 添加数据    $.session.set('key', 'value') 删除数据    $.session.remove('key'); 获 ...

  5. scikit-learn的主要模块和基本使用

    1.加载数据(Data Loading) 假设输入是特征矩阵或者csv文件,首先数据被载入内存. scikit-learn的实现使用了NumPy中的arrays,所以,使用NumPy来载入csv文件. ...

  6. Linux的用户和用户组管理

      Linux是个多用户多任务的分时操作系统,所有一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并控 ...

  7. Delphi窗体最大化按钮不可用情况下的最大化

    最大化按钮不可用,而且窗体最大化,我以前一直这样设置:在Object Inspector下把BorderIcons属性下的biMaximize属性设置为False,然后把WindowState属性设置 ...

  8. PixelFormat 图像颜色的数据格式

    PixelFormat: (指定图像中每个像素的颜色数据的格式) Delphi                                        微软                    ...

  9. GDKOI 2016

    GDKOI 2016 day 1 第一题 魔卡少女 题目描述:维护一个序列,能进行以下两个操作:1.将某一个位置的值改变.2.求区间的连续子串的异或值的和. solution 因为序列的数的值都小于\ ...

  10. Unity2D屏幕适配方案

    看了cnblogs里的一篇文章,终于理解了Unity2D的摄像机系统:http://www.cnblogs.com/flyFreeZn/p/4073655.html 我根据他的方案,改写了两种适配方案 ...