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

利用ThreadLocal完美解决JDBC动态拼接SQL的多条件查询

阅读更多
再摘一段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支持重构。
分享到:
评论

相关推荐

    ThreadLocal原理及在多层架构中的应用.pdf

    在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程...

    使用ThreadLocal解决代码分层问题

    javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。

    事务的封装和Threadlocal实例

    总的来说,结合JDBC的事务管理和ThreadLocal,我们可以在多线程环境中更好地实现数据库操作,确保数据的一致性,并提高代码的可复用性和安全性。通过使用ThreadLocal,我们可以创建线程安全的变量,使得每个线程都能...

    ThreadLocal

    ThreadLocal是Java编程语言中的一个类,用于在多线程环境中提供线程局部变量。它是一种特殊类型的变量,每个线程都有自己的副本,互不影响,从而实现线程间数据隔离。ThreadLocal通常被用来解决线程共享数据时可能...

    ThreadLocal应用示例及理解

    - ThreadLocal不是线程同步机制,不能用来解决多个线程访问共享资源的问题。 - 不要将ThreadLocal用作全局变量,否则可能导致内存泄漏。 - 使用ThreadLocal时,要特别注意线程结束后的清理工作,防止内存泄漏。 - ...

    ThreadLocal原理及在多层架构中的应用

    **线程局部变量(ThreadLocal)是Java编程中一个非常重要的概念,主要用于在多线程环境中为每个线程提供独立的变量副本。ThreadLocal不是一种数据结构,而是一种解决线程间共享数据的方式,它提供了线程安全的局部...

    java事务 - threadlocal

    Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...

    ThreadLocal:如何优雅的解决SimpleDateFormat多线程安全问题

    目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现bug的原因如何解决SimpleDateFormat多线程安全问题局部变量使用...

    SpringBoot整合mybatis-plus实现多数据源的动态切换且支持分页查询.pdf

    在SpringBoot项目中,整合Mybatis-Plus并实现多数据源的动态切换,同时支持分页查询是一项常见的需求。以下将详细阐述这个过程中的关键步骤和技术要点。 首先,我们需要引入必要的Maven依赖。这里提到了四个关键...

    day18 10.使用ThreadLocal来解决问题

    ThreadLocal通常用于解决多线程环境中的数据隔离问题,避免了线程之间的数据共享,从而简化了并发编程。 **ThreadLocal的工作原理** ThreadLocal维护了一个线程局部存储的映射表,其中键是ThreadLocal实例,值是...

    设计模式及ThreadLocal资料

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的模板。这些模式在多次使用后被广泛认可,成为了经验丰富的开发者之间的一种通用语言。本资料主要聚焦于两种设计模式以及Java中的ThreadLocal...

    threadLocal

    2. 并发编程:ThreadLocal是解决并发问题的一种策略,它提供了一种避免共享状态的方式,减少了锁的使用。 3. 内存管理:了解Java的内存模型和垃圾回收机制,才能理解ThreadLocal的内存泄漏风险和弱引用的作用。 4. ...

    java 简单的ThreadLocal示例

    在多线程环境中,当每个线程需要有自己的状态(如计数器),ThreadLocal提供了一种优雅的解决方案。 尽管ThreadLocal在很多场景下都非常有用,但它也有一些潜在的问题需要注意,比如内存泄漏和过度使用可能导致...

    ThreadLocal整理.docx

    ThreadLocal 整理 ThreadLocal 是 Java 中的一个重要组件,它能够在每个线程中保持独立的副本。这个功能是通过 Thread 类中的 threadLocals 属性来实现的,这个属性实际上是一个 Entry 数组,其中的每个 Entry 都...

    正确理解ThreadLocal.pdf

    `ThreadLocal`是Java平台提供的一种线程局部变量的解决方案,它为每一个使用该变量的线程都提供了独立的变量副本,使得每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。这不同于普通的静态...

    ThreadLocal的几种误区

    ThreadLocal是Java编程中一种非常特殊的变量类型,它主要用于在多线程环境下为每个线程提供独立的变量副本,从而避免了线程间的数据共享和冲突。然而,ThreadLocal在理解和使用过程中容易产生一些误区,这里我们将...

    ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案.docx

    ThreadLocal 中内存泄漏和数据丢失问题的问题浅析及解决方案 ThreadLocal 是 Java 中的一种线程本地存储机制,它可以解决线程之间的数据传递问题。然而,在使用 ThreadLocal 时,可能会出现内存泄漏和数据丢失问题...

    理解ThreadLocal

    理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal

    java中ThreadLocal详解

    在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,可能会引发线程安全问题。而`ThreadLocal`则提供了另一种...

Global site tag (gtag.js) - Google Analytics