再摘一段JDBC多条件查询的单元测试实例(源码可在jSQLBox项目下找到),大家知道在条件不确定的情况下,执行动态拼接生成的SQL,即要保证SQL安全性,防止SQL注入,又要保证编码的简洁性,这一直是一个头痛的问题。 jSQLBox利用ThreadLocal解决了这个问题:
Java代码 收藏代码
public class ConditionQueryTest {
@Before
public void setup() {
TestPrepare.dropAndRecreateTables();
User u = new User(); // use default SqlBoxContext
u.setUserName("User1");
u.setAddress("Address1");
u.setAge(10);
u.insert();
}
@After
public void cleanUp() {
TestPrepare.closeDefaultContexts();
}
public int conditionQuery(int condition, Object parameter) {
User u = SqlBox.createBean(User.class);
String sql = "Select count(*) from " + u.table() + " where ";
if (condition == 1 || condition == 3)
sql = sql + u.userName() + "=" + q(parameter) + " and " + u.address() + "=" + q("Address1");
if (condition == 2)
sql = sql + u.userName() + "=" + q(parameter);
if (condition == 3)
sql = sql + " or " + u.age() + "=" + q(parameter);
return SqlBox.queryForInteger(sql);
}
@Test
public void doJdbcConditionQuery() {
Assert.assertEquals(1, conditionQuery(1, "User1"));
Assert.assertEquals(0, conditionQuery(2, "User does not exist"));
Assert.assertEquals(1, conditionQuery(3, 10));
Assert.assertEquals(0, conditionQuery(3, 20));
}
}
再顺便说一下u.userName()也可以直接写成"username"字串,写成u.userName()是jSQLBox项目鼓励的一种方式,当User类字段名重构或字段名不变但是数据库列名更改时(配置文件变化),所有JDBC SQL语句自动适应更改,不需要一个个手工检查和改正SQL,保证了SQL语句的建壮性。另外u.UserName()这种写法在查询中还会利用到,因为项目还在开发中,就不多说了,总之个人认为这是一种比较好的编程风格,在不改变SQL语法的前提下实现了SQL支持重构。
分享到:
相关推荐
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
应用ThreadLocal进行多线程处理,经典小例子。可运行。
ThreadLocal
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
ThreadLocal原理及在多层架构中的应用
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现bug的原因如何解决SimpleDateFormat多线程安全问题局部变量使用...
JDBC事务的封装和Threadlocal实例,参考博客:http://blog.csdn.net/daijin888888/article/details/50988053
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。
DbUTils中用ThreadLocal类
正确理解ThreadLocal.pdf
首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。
主要介绍ThreadLocal的原理,实例分析以及注意事项
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量
java 简单的ThreadLocal示例