jOOQ串联字符串拒绝使用的原因是什么

本篇内容介绍了“jOOQ串联字符串拒绝使用的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!jOOQ开箱即支持大

本篇内容介绍了“jOOQ串联字符串拒绝使用的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

jOOQ串联字符串拒绝使用的原因是什么

jOOQ开箱即支持大量的SQL语法。因此,大多数用户在使用JDBC编写动态SQL时,不会像以前那样采用字符串连接的方式。 但时不时地,jOOQ不支持某个厂商的特定功能(是的,它发生了)。在这种情况下,jOOQ支持各种"普通SQL "API,它可以用来构造几乎所有类型的jOOQ API元素,比如:

但是,有时候,你需要动态地传递一个参数给这样的函数,比如说另一个列的表达式。而你想以一种类型安全的方式做到这一点,因为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后面)

“jOOQ串联字符串拒绝使用的原因是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡网网站,小编将为大家输出更多高质量的实用文章!

本站部分文章来自网络或用户投稿,如无特殊说明或标注,均为本站原创发布。涉及资源下载的,本站旨在共享仅供大家学习与参考,如您想商用请获取官网版权,如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
开发者

怎么使用C++实现页面的缓冲区管理器

2022-8-3 21:14:52

开发者

Node.js各版本间有哪些区别

2022-8-3 21:14:57

搜索