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中。