利用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支持重构。
基于SSM+JSP+MySQL的羽毛球交流平台系统设计与实现 Java Web开发是构建动态网站和Web应用的核心技术,其核心在于理解MVC(Model-View-Controller)架构模式,该模式将业务逻辑、数据与界面显示分离,提升了代码的可维护性和可扩展性。其实现原理通常依赖于成熟的框架组合,例如经典的SSM(Spring + Spring MVC + MyBatis)框架,它们分别负责依赖注入与事务管理、Web请求分发以及数据库对象关系映射。这种技术栈的价值在于为开发者提供了一套标准化、高效率的企业级开发解决方案,广泛应用于内容管理系统、电商平台及各类社区论 阅读详情

相关推荐

Java中JDBC实现动态查询的实例详解

从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询。下面通过实例代码给大家讲解JDBC实现动态查询的方法,需要的朋友参考下吧

java sql xml_Java动态拼接组装sql 多条件动态配置 放弃xml文件 直接连接jdbc

package com.cn.sdjr.common;import java.util.List;import java.util.Map;// 参数名称/参数值/值补充/是否必填/字段类型/是否主键//默认值 / / /F不必填 /F字符串 /F不是主键//默认值 / / ...

weixin_32235191的博客 596

ubuntu18.04美化主题(完整版)

和网上的美化一样,但是我当初跟着博客美化的时候遇到一些问题,按博客的做法无法解决。 所以我自己也写一篇关于ubuntu18.04美化主题的博客。 第一步:安装主题工具:GNOME Tweaks sudo apt-get update sudo apt-get install gnome-tweak-tool 然后安装完成后我们打开Tweaks(截图如下): 第二步,修改窗口按钮位...

B丶atty的博客 7万+

Spring JdbcTemplate实现自定义动态sql拼接功能

sql 需要能满足支持动态拼接,包含 查询字段、查询表、关联表、查询条件、关联表的查询条件、排序、分组、去重等。11,核心类之 BasicConditionQueryCriteria(入参)7,核心类之 PredicateCondition。8,核心类之 PropertyCondition。10,核心类之 ExecutionSql。9,核心类之 SqlBuilder。6,核心类之 Condition。2,创建项目并引入 pom依赖。4,核心类之 Column。5,核心类之 Table。

thinkers 1925

使用LSTM(长短期记忆)模型处理文本数据的典型流程

对于序列到序列的任务(如机器翻译),可以使用LSTM的隐状态来生成目标序列。这些向量捕获了词之间的语义关系,每个词都被表示为一个高维空间中的点,语义上相似的词在向量空间中彼此靠近。这通常是通过创建一个词汇表(vocabulary)来实现的,词汇表中的每个词都会被分配一个唯一的数字ID。:由于LSTM等循环神经网络(RNN)需要固定长度的输入,所以需要将不同长度的句子填充到相同的长度。由于计算机不能直接理解连续的文本,第一步是将文本分割成独立的词或标记(token)。:将词嵌入作为输入传递给LSTM模型。

YHKKun的博客 2500

ROS2零拷贝避坑指南:Fast DDS共享内存配置常见问题与排查方法

本文深入解析ROS2 Humble中Fast DDS的零拷贝机制,提供共享内存配置的常见问题排查方法。从环境变量设置、XML配置文件到运行时诊断工具,全面指导开发者高效实现进程间数据传输优化,避免低效拷贝问题。特别针对/dev/shm无文件生成等典型场景给出解决方案。

weixin_30379531的博客 478

JDBC动态拼接sql语句

public class Demo1 { private static String url = "jdbc:mysql://127.0.0.1:33056/test"; private static String username = "root"; private static String password = "123456"; ...

LuckFairyLuckBaby的博客 4810

win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结

之前安装过一次VMware虚拟机,后来由于某些已遗忘原因把它卸载了,但是没有卸载完全,为以后安装留下了一些麻烦,现在根据我google很多内容总结后写下了自己的解决办法。 一些我搜的的可以用的VM12的注册码 5A02H-AU243-TZJ49-GTC7K-3C61N ZZ510-DYX47-48ERP-D6XZG-YCKU2 YV5MU-2FX5H-M841P-LZX5X-PYHX8

Jeason的博客 2万+

用jdbc做查询操作时动态拼接参数报SQL语法错误的问题

主要是在java中使用jdbc做查询操作动态拼接查询语句的参数时遇到的问题

Builder_Taoge的博客 3346

DSPACE仿真平台的使用

DSPACE仿真平台的使用 文章目录DSPACE仿真平台的使用1.ModelDesk新建项目2.MotionDesk引入项目3.ControlDesk引入项目4.项目整合运行 我们使用DSPACE仿真平台软件来模拟小汽车的自动驾驶。 总共需要用到DSPACE大类下的三个软件:ModelDesk、ControlDesk、MotionDesk。 1.ModelDesk新建项目 在桌面上点击ModelDesk图标,打开DSPACE—ModelDesk 选择 File 标签,侧边栏选择 New,点击 New A

qq_42582489的博客 7528

Cesium创建无人机视锥,同步视锥与鹰眼地图视角,实现视锥键盘控制。解决视锥初始化位置不准确问题等

本文描述了一个基于Cesium的3D视锥体可视化系统开发过程。系统实现了主视图与鹰眼视图的双屏联动,支持通过键盘控制视锥体的空间移动(WASD前后左右,Q/E旋转,C/Z升降),并实时同步更新两个视图。关键技术包括:1)基于主视图Scene创建Camera实现视锥体精确绘制;2)通过PerspectiveFrustum设置视锥参数;3)建立双视图的相机位置及视角同步机制。目前暂未实现视锥体far/near边界在鹰眼视图中的可视化,该系统可应用于无人机视角监控等三维场景交互需求。

coder_bin的博客 1593

动态sql

动态sql 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。 if if 是最基本的动态 SQL 标签,其 test 属性是一个用于判断输入参数的 OGNL 表达式,当条件判断为真时会拼接其中的内容。与编程语言不同,mybatis 没有 else 标签,if 标签仅用于最基本的条件判断,如果有

JLKQUB的博客 447

单细胞实战之数据净化三部曲:细胞周期校正、双胞体剔除与RNA污染清理——技术解析与实战指南

本文深入解析单细胞数据分析中至关重要的数据净化步骤,即细胞周期校正、双胞体剔除与RNA污染清理。通过实战代码演示与原理剖析,指导读者如何有效识别并去除技术噪音,从而获得更纯净、可靠的数据,为后续的细胞分群、差异表达等高级分析奠定坚实基础。

weixin_29274337的博客 205

Java基础面试题总结《九》

选择 16384 是为了将集群状态同步的网络开销控制在 2KB 左右,同时又能支持上千个节点的集群规模,是工程实践中的最优解。默认使用#{}:它是安全的、高性能的,能覆盖 95% 以上的参数传递需求。谨慎使用${}:仅在动态表名、列名等无法使用预编译的场景下使用,且必须做好参数校验。面试加分点:能说出#{}底层是${}底层是字符串拼接,并能结合 SQL 注入原理进行解释。@Mapper:适合小型项目或者只有少量 Mapper 接口的场景,或者作为的补充(例如某些特殊接口不在扫描路径下)。

qq_55862497的博客 220

JavaFX 概述

要从 JavaFX 中充分受益,了解 JavaFX 的设计方式以及对 JavaFX 包含的功能有一个很好的概述是很有用的。本文的目的是为您提供 JavaFX 概述。本文将首先介绍一般的 JavaFX 设计,然后介绍 JavaFX 中的各种特性。如果您熟悉 Flash/Flex,您会发现 JavaFX 在某种程度上受到了 Flash/Flex 的启发。JavaFX 中也有一些相同的想法。一般来说,JavaFX 应用程序包含一个或多个对应于窗口的阶段。每个阶段都有一个场景。

2012年开始工作,全栈开发老兵,目前已是一个老师,分享这么多年的心得体会 408

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdbc中SQL语句拼接java变量,format用法

jdbc中SQL语句拼接java变量

a770115126的博客 1407

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

动态拼装sql写入mysql_Mybatis动态拼接SQL语句篇

MyBatis常用OGNL表达式使用OGNL表达式,类似EL表达式。使用如下标签,类似JSTL标签以下介绍的标签基本都在操作标签内(、、、)1、:相当于给sql语句后面自动添加一个 where 1=1,避免sql语句where后面紧跟着一个and即第一个条件为假2、:if语句test:对属性的条件,填写OGNL表达式,3、: 对拼接后的sql语句再进行最后的修改prefix:给拼串后的整个字符串加...

weixin_35009071的博客 932

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Mybatis 动态 SQL 拼接

Mybatis 动态 SQL 拼接,包括 if 标签、where 标签、trim 标签、choose、when、otherwis 标签、foreach 标签和 SQL 片段等

快乐的小三菊的博客 2122

mybatis -动态SQL

动态 SQL

woruosuifenglang的博客 277

JDBC连接数据库

JDBC指的是Java数据库连接,是一种标准Java应用编程接口,每个数据库厂商需要实现这套接口,我们只需要调用就可以用Java实现连接数据库。下载地址为:https://downloads.mysql.com/archives/c-j/ 下载后,将其解压。 驱动分为两类:旧版本:mysql-connector-java-5.1.46-bin.jar; 新版本:mysql-connector-java-8.0.11.jar。 不同版本的驱动在连接数据库时有所不同。旧版本的驱动名称为:;新版本的驱动名称为。

zhangzhang_one的博客 333

别再手动拼接 SQL 了,MyBatis 动态 SQL 写法应有尽有,建议收藏!

一、MyBatis动态 sql 是什么动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。动态SQL(code that is execu...

码农code之路 152

SpringBoot动态拼接sql的两种方式

今天搭建了一个简易的demo项目,测试了两种动态拼接sql的方式,特此记录一下,以备后用。 项目结构如下: 方式一:在基类上增加共有属性params,所有的需要过滤数据的业务实体可以继承该基类,在需要的 package com.chrisf.intercepter; import com.chrisf.aspectj.annotation.InterceptAnnotation; import org.apache.ibatis.executor.statement.StatementHan.

Crisf的博客 5897

史上最全ThreadLocal 详解

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。

qq_43842093的博客 1万+

ThreadLocal在数据库连接中的应用

之前一直觉得ThreadLocal没用,后来看到别人在数据库连接中的相关讲解后发现这个类真的很实用。 在数据库连接中为了提高服务器的响应速度,通常都会采用数据库连接池的方式来获取数据库连接。 C3P0Utils实现 public class C3P0Utils { private static DataSource source;//数据源 static{ source = new

u010386139的博客 5778

JDBC的多条件动态查询

  前面我已经提到了现在的项目无非就是列表里的分页加多条件查询,在http://xdwangiflytek.iteye.com/blog/1358080里我已经简单的归纳了一下分页的实现手段和JDBC里的分页,这里我们在来说说JDBC里的多条件动态查询,为什么说多条件,因为在项目列表中,不可能只有只有一个字段,所以说条件也不可能只有一个,所以这里我们还是说一下多条件下的查询,多条件ok了那么单个...

王旭东 1374

Java查询讲解,Java中JDBC实现动态查询的实例详解

一 概述1.什么是动态查询?从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询。2.动态查询的难点可供选择的查询条件多,组合情况多,难以一一列举。3.最终查询语句的构成一旦用户向查询条件中输入数据,该查询条件就成为最终条件的一部分。二 基本原理1.SQL基本框架无论查询条件如何,查询字段与数据库是固定不变的,这些固定不变的内容构成SQL语句的基本框架,如2.Strin...

weixin_42537919的博客 582
上一篇: 发现一种超简单的将SQL包装成PrepraredStatement的方法
下一篇: 利用JDK自带的Logger防止Log冲突
Drinkjava2
博客等级 码龄11年 9粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值