当前位置:网站首页>不要用jOOQ串联字符串
不要用jOOQ串联字符串
2022-08-02 00:05:00 【YYniannian】

jOOQ开箱即支持大量的SQL语法。因此,大多数用户在使用JDBC编写动态SQL时,不会像以前那样采用字符串连接的方式。 但时不时地,jOOQ不支持某个厂商的特定功能(是的,它发生了)。在这种情况下,jOOQ支持各种"普通SQL "API,它可以用来构造几乎所有类型的jOOQ API元素,比如。
// Static import is implied, as always
import static org.jooq.impl.DSL.*;
// Column expressions
Field<String> f = field("cool_function(1, 2, 3)", String.class);
// Predicates
Condition c = condition("col1 <fancy operator> col2");
// Tables
Table<?> t = table("wicked_table_valued_function(x, y)");
复制代码但是,有时候,你需要动态地传递一个参数给这样的函数,比如说另一个列的表达式。而你想以一种类型安全的方式做到这一点,因为jOOQ代码生成器已经产生了类型安全的列表达式。所以你可能会倾向于串联,尽管如此。
field("cool_function(1, " + MY_TABLE.MY_COLUMN + ", 3)");
复制代码**千万不要这样做!**因为这些原因。
- 尽管jOOQ在一般情况下是非常安全的SQL注入,但事实上你还是可以在这里引入一个普通的SQL注入漏洞。在这种情况下不会,因为该列是生成的代码,但也许,你会把用户的输入连接起来。请注意,为了增加SQL注入保护,可以通过添加我们的PlainSQL检查器,使用检查器框架或Google ErrorProne,在全局范围内防止普通SQL的使用,只在需要时允许本地使用。
- 和以往的字符串连接一样,你很容易出现SQL语法错误。在这种情况下,生成的SQL不针对任何方言,因为
MY_TABLE.MY_COLUMN.toString(),没有任何上下文信息,如SQLDialect和所有其他配置标志。
相反,使用jOOQ的普通SQL模板小语言,它允许模板占位符,如{0}, {1}, {2} 。
field("cool_function(1, {0}, 3)", MY_TABLE.MY_COLUMN);
复制代码如果你经常这样做,你可以在你自己的迷你DSL中考虑这个调用。
public static Field<String> coolFunction(Field<?> field) {
field("cool_function(1, {0}, 3)", field);
}
复制代码而现在,像这样调用。
coolFunction(MY_TABLE.MY_COLUMN)
复制代码作为一个经验法则:使用jOOQ,你应该永远不需要借助于SQL字符串连接,你可以始终使用以下两种方法。
- 类型安全的jOOQ DSL API
- 普通的SQL模板API(最好是把这种用法隐藏在你自己的类型安全DSL API后面)。
边栏推荐
- 利用“栈”快速计算——逆波兰表达式
- How does JSP use request to get the real IP of the current visitor?
- Arduino Basic Syntax
- 22. The support vector machine (SVM), gaussian kernel function
- How to solve the error when mysql8 installs make
- security CSRF Vulnerability Protection
- 基于相关性变量筛选偏最小二乘回归的多维相关时间序列建模方法
- IO流基础
- Short video SEO optimization tutorial Self-media SEO optimization skills and methods
- SphereEx Miao Liyao: Database Mesh R&D Practice under Cloud Native Architecture
猜你喜欢

【加密周报】经济衰退在加息气氛中蔓延 美联储“放手一搏”?盘点上周加密市场发生的重大事件

扑克牌问题

【三子棋】C语言实现简易三子棋

接地气讲解TCP协议和网络程序设计

如何优雅的消除系统重复代码

控制电机的几种控制电路原理图

Detailed explanation of Zadig's self-testing and tuning environment technical solution for developers

How to solve the error when mysql8 installs make

OpenCV DNN blogFromImage()详解

OpenCV DNN blogFromImage() detailed explanation
随机推荐
[头条]笔试题——最小栈
图解LeetCode——1161. 最大层内元素和(难度:中等)
Axure tutorial - the new base (small white strongly recommended!!!)
路由策略
工业信息物理系统攻击检测增强模型
以交易为生是一种什么体验?
LeetCode_322_零钱兑换
面试必问的HashCode技术内幕
如何重装Win11?一键重装Win11方法
Play NFT summer: this collection of tools is worth collecting
ROS dynamic parameters
JSP 如何获取request对象中的路径信息呢?
The Statement update Statement execution
bgp 聚合 反射器 联邦实验
After an incomplete recovery, the control file has been created or restored, the database must be opened with RESETLOGS, interpreting RESETLOGS.
How to reinstall Win11?One-click method to reinstall Win11
在不完全恢复、控制文件被创建或还原后,必须使用 RESETLOGS 打开数据库,解释 RESETLOGS.
协作乐高 All In One:DAO工具大全
QML package management
如何设计循环队列?快进来学习~