冒个泡,jSQLBox项目已启动,欢迎有兴趣的加入:https://github.com/drinkjava2/jSQLBox
jSQLBox项目要完成的基本功能有: CRUD方法、 JDBC包装、一级缓存、脏检查、纯JAVA方式配置,配置可动态生成修改。
在jSQLBox编写过程中,刚完成对JDBC的包装,突然发现一种超简单的将SQL包装成PrepraredStatement的方法,利用ThreadLocal将参数暂存,从而将字符串连接的SQL自动包装为PreparedStatement从而实现防SQL注入,提高性能,且不损害SQL的可读性。 这个比较好, 如果软件怎么写也可以申请专利的话,而且以前也没人干过,我得去申请专利了:
public class Tester {
public void tx_insertDemo() {
Dao.dao.execute("delete from user");
Dao.dao.execute("insert user (username,age) values(" + W("user1") + "," + W(10) + ")");
Dao.dao.execute("insert user (username,age) values(" + W("user2", 20) + ")");
Dao.dao.execute("insert user (username,age) values(?,?)" + K("user3") + K(30));
Dao.dao.execute("insert user (username,age) values(?,?)" + K("user4", 40));
Dao.dao.execute(
"insert " + User.Table + " (" + User.UserName + "," + User.Age + ") values(" + W("user5", 50) + ")");
Dao.dao.execute("update user set username=?,address=? " + K("Sam", "BeiJing") + " where age=" + W(50));
User user = new User();
user.setUsername("user3");
user.setAge(40);
user.dao().save(); //TODO
}
public void tx_batchInsertDemo() {
for (int i = 6; i < 100000; i++)
Dao.dao.cacheSQL("insert user (username,age) values(?,?)" + K("user" + i, 60));
Dao.dao.executeCatchedSQLs();
}
public static void main(String[] args) {
Tester tester = BeanBox.getBean(Tester.class);//获取代理实例
tester.tx_insertDemo();//包装在Spring的声明式事务中
tester.tx_batchInsertDemo();
}
}
以上代码实测通过,已上传。 简单说明一下上面代码,User表中只有id, username, address, age四个字段,上例分别用几种不同的SQL写法进行插入和更新,batchInsertDemo方法是包装了JDBC的批量插入,插入10万行数据大约需时1秒。上面代码中W表示将参数暂存在ThreadLocal中并返回问号,K表示返回为空,都是静态引入的方法。如果你还在苦恼于使用JDBC的繁琐,可以借签一下上面的做法。 目前常见的做法是将参数全部放在方法的最后一个参数传入,可读性极差,把set和where的参数写在一起传进去,参数多时很难维护。 上面的做法避免了这一缺点,可以非常灵活地将参数织入到SQL中。