xsqlbuilder使用说明
动态构造sql的利器:rapid-xsqlbuider详细说明
- 动态构造sql条件语句,提供sql拼接与使用占位符两种方式
- 数据类型的修饰
- 对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还需过滤反斜框
}
xsqlbuilder使用说明的更多相关文章
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- awk使用说明
原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- Oracle 中 union 和union all 的简单使用说明
1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...
- Map工具系列-02-数据迁移工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- Map工具系列-03-代码生成BySQl工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- jQuery验证控件jquery.validate.js使用说明
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...
- gdbsever 使用说明
gdbsever 使用说明 在新塘N3292x平台下 编译 gdbsever ./configure --target=arm-linux --host=arm-linux arm-linux-gdb ...
- mongoVUE的增删改查操作使用说明
mongoVUE的增删改查操作使用说明 一. 查询 1. 精确查询 1)右键点击集合名,再左键点击Find 或者直接点击工具栏上的Find 2)查询界面,包括四个区域 {Find}区,查询条件格式{& ...
随机推荐
- Tsinghua dsa mooc pa1
第一题Range 关键:二分查找,查找不大于一个数的最大下标. #include <cstdlib> #include <cstdio> 4 int compare (cons ...
- 【(阶乘的质因数分解)算组合数】【TOJ4111】【Binomial efficient】
n<=10^6 m<=10^6 p=2^32 用unsigned int 可以避免取模 我写的SB超时 阶乘分解代码 #include <cstdio> #include &l ...
- last reboot
last reboot是一个linux命令,查看上次重启时间等相关信息
- Linux学习1——首次登录
一.写在前面 在本节将介绍首次登录Linux系统(本文中为CentOS)所需要了解的一些基本操作.二.完成目标 1.了解GNOME和KDE窗口管理程序 2.使用在线求助man和info 3.基本命令操 ...
- java中获取类加载路径和项目根路径的5种方法
import java.io.File; import java.io.IOException; import java.net.URL; public class MyUrlDemo { publi ...
- C++ extern "C",C与C++的区别
1. C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数.但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同. 2 ...
- 深搜基础题目 杭电 HDU 1241
HDU 1241 是深搜算法的入门题目,递归实现. 原题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1241 代码仅供参考,c++实现: #incl ...
- MySql中游标使用总是多循环一次的解决方法
CREATE DEFINER = 'root'@'%' PROCEDURE deyestest.procedure2() BEGIN DECLARE v_id INT; DECLARE v_userN ...
- js选项卡切换效果
选项卡切换在页面中比较常见,这里是我利用js闭包还有setTimeout定时器实现的一个比较实用的选项卡功能. <!DOCTYPE html> <html lang="en ...
- css实现两端对齐的3种方法
两端对齐在移动端非常见,说到两端对齐,大家并不陌生,在word.powerpoint.outlook等界面导航处,其实都有一个两端对齐(分散对齐)的按钮,平时使用的也不多,我们更习惯与左对齐.居中对齐 ...