`
drinkjava2
  • 浏览: 40921 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

发现一种超简单的将SQL包装成PrepraredStatement的方法

阅读更多
冒个泡,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中。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics