我在做网站的时候有一个需要在不同的插入时间改变查询的逻辑结构,这个时候用PreparedStatement就不太适合了灵活性太差。所以我就写了一个sql拼接工具。它的原理是将sql语句段与值绑定在一起,然后在最后拼接的时候把值按顺序传人给PreparedStatement。这样我们任意拼接我们的sql语句还可以防止sql注入的困扰。
平时我都是用Hibernate进行操作,但有时我多表查询是Hibernate的灵活性就也受到了限制,所以sqlHandle还是适用不少情况的。
我已经将代码上传到osc代码托管服务了http://git.oschina.net/plug/sqlHandle 欢迎有兴趣的同学可以加入进来来优化一下。
package com.sql.db;
/**
* sql拼接测试代码
* @author 梁前武
* www.apkplug.com
*/
public class test {
/**
* @param args
*/
public static void main(String[] args) {
//1
sqlHandle sql1=new sqlHandle();
sql1.Add("select * from user where " ,"",null).
Add("name=?","", "liling").
Add("age=?","and", 10);
System.out.println(sql1);
//select * from user where name=? and age=?
sql1.AddMore("LIMIT ?,?", "", new Object[]{1,2});
System.out.println(sql1);
//select * from user where name=? and age=? LIMIT ?,?
//2
sqlHandle sql2=new sqlHandle();
sql2.Add("select * from friend where " ,"",null).
Add("myfriend=?","", "liling");
System.out.println(sql2);
// select * from friend where myfriend=?
sql1.AddMoreAndRep(" in(%s) ",sql2, "and", null);
System.out.println(sql1);
//select * from user where name=? and age=? LIMIT ?,? and
//in( select * from friend where myfriend=? )
//很明显sqlHandle添加时的顺序很关键
}
}