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

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

动态构造sql条件语句,提供sql拼接与使用占位符两种方式

数据类型的修饰

对SQL注入攻击的防范

问题:

手工构造SQL语句的情况

1 String sql = "select * from user where 1=1 ";2 String user_id = (String)filters.get("user_id");3 if( user_id != null && user_id.length() > 0) {4 sql = sql + " and user_id = " + user_id;5 }6 String age = (String)filters.get("age");7 if(age != null && age.length() > 0) {8 sql = sql + " and age > " + age;9 }

过多的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"); 10 11 XsqlFilterResult result = new XsqlBuilder().generateHql(sql,filters);12 13 assertTrue(result.getAcceptedFilters().containsKey("username"));14 assertFalse(result.getAcceptedFilters().containsKey("sex"));15 assertEquals("select * from user where 1=1 and username = :username ", result.getXsql());16

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

被过滤掉的东西:

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

filters过滤: sexfilters中由于没有类似/~ 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过滤

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

SafeSqlProcesser其中的一个源码分析

1 5 public String process(String value) {6 if(value == null) return null;7 return value.replaceAll("'", "''"); // Mysql还需过滤反斜框8 }9

Project Home: http://code.google.com/p/rapid-xsqlbuilder/

最后不忘为rapid-framework宣传一下,本工具也集成在里面

rapid-framework简介:

一个类似 ruby on rails 的java web快速开发脚手架,本着不重复发明轮子的原则,框架只是将零散的struts(struts2)+spring+hibernate各个组件组装好在一起,并对struts及struts2进行改造,提供零配置编程,并内置一个强大的代码生成器及模板文件, 可以生成java的hibernat model,dao,manager,struts+struts2 action类,可以生成jsp的增删改查及列表页面

相关推荐

爱奇艺电脑怎么关弹幕
365bet官方网站

爱奇艺电脑怎么关弹幕

📅 09-25 👁️ 4998
当兵去哪个军区好?五大战区特点及新兵选择指南
beat365正版网站唯一官网app

当兵去哪个军区好?五大战区特点及新兵选择指南

📅 01-10 👁️ 7228
雅马哈酷奇110c:新手友好,动力强劲
365最专业的数据服务平台

雅马哈酷奇110c:新手友好,动力强劲

📅 01-11 👁️ 2580
伉俍的意思
365最专业的数据服务平台

伉俍的意思

📅 08-31 👁️ 9234
2025十大免费思维导图软件排行,好用的思维导图软件推荐
365最专业的数据服务平台

2025十大免费思维导图软件排行,好用的思维导图软件推荐

📅 07-21 👁️ 9078
LOL黎明使者锐雯皮肤价格 LOL黎明使者锐雯多少钱
365最专业的数据服务平台

LOL黎明使者锐雯皮肤价格 LOL黎明使者锐雯多少钱

📅 08-18 👁️ 1148
不用花钱也能找客户?试试这些免费精准获客工具
365最专业的数据服务平台

不用花钱也能找客户?试试这些免费精准获客工具

📅 08-24 👁️ 3107