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串联字符串拒绝使用的原因实例的详细内容,更多关于jOOQ串联字符串的资料请关注我们其它相关文章!

(0)

相关推荐

  • 简单了解java ORM框架JOOQ

    这篇文章主要介绍了简单了解java ORM框架JOOQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 今天给大家介绍一个新的ORM框架->JOOQ,可能很多朋友还没有听说过这个框架,码农哥之前也是一直在使用Mybatis框架作为Java工程中的持久层访问框架,但是最近的一些项目采用JOOQ框架开发后,码农哥表示再也不想用Mybatis了! 为什么这么说呢?因为JOOQ在代码层面要比Mybatis简洁得多,而且性能也非常优异.相信大家都有过

  • jOOQ串联字符串拒绝使用的原因实例

    jOOQ开箱即支持大量的SQL语法.因此,大多数用户在使用JDBC编写动态SQL时,不会像以前那样采用字符串连接的方式. 但时不时地,jOOQ不支持某个厂商的特定功能(是的,它发生了).在这种情况下,jOOQ支持各种"普通SQL "API,它可以用来构造几乎所有类型的jOOQ API元素,比如: 但是,有时候,你需要动态地传递一个参数给这样的函数,比如说另一个列的表达式.而你想以一种类型安全的方式做到这一点,因为jOOQ代码生成器已经产生了类型安全的列表达式.所以你可能会倾向于串联,尽

  • java 字符串的拼接的实现实例

    java 字符串的拼接的实现实例 在实际的开发工作中,对字符串的处理是最常见的编程任务.本题目即是要求程序对用户输入的串进行处理.具体规则如下: 1. 把每个单词的首字母变为大写. 2. 把数字与字母之间用下划线字符(_)分开,使得更清晰 3. 把单词中间有多个空格的调整为1个空格. 例如: 用户输入: you and     me what  cpp2005program 则程序输出: You And Me What Cpp_2005_program 用户输入: this is     a  

  • php获取字符串前几位的实例(substr返回字符串的子串用法)

    在实际项目应用中,经常遇到使用php获取字符串前几位用来比较.赋值等等.今天给大家分享使用php substr 获取字符串前几位.后几位.指定位的用法. substr (PHP 4, PHP 5) substr - 返回字符串的子串 说明 string substr ( string $string , int $start [, int $length ] ) 返回字符串 string 由 start 和 length 参数指定的子字符串. 参数 string 输入字符串. start 如果

  • 运用El表达式截取字符串/获取list的长度实例

    ${fn:substring(wjcd.lrsj, 0, 16)} 使用functions函数来获取list的长度 ${fn:length(list)} <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 函数名 函数说明 使用举例 fn:contains 判断字符串是否包含另外一个字符串 <c:if test="${fn:contains(name

  • C语言之实现字符串小写变大写的实例

    C语言之实现字符串小写变大写的实例 输入字符串单词,将单词小写全部变为大写. #include <iostream> #include <string> #include <vector> using namespace std; int main() { vector<string> ss; string s; while(cin>>s) ss.push_back(s); for(int i=0;i<ss.size();i++) { fo

  • C语言实现去除字符串中空格的简单实例

    在网上看了些去除空格的代码,觉得都不是很简洁,就自己写代码实现它本着高效率,不使用额外存储空间的想法实现该功能去除空格一共有三种: 1.去除全部空格: 2.一种是去除左边空格: 3.去除右边空格  想去除左右两边空格,只要先去除左边再去除右边的就行了 以下是实现代码: /*去除字符串中所有空格*/ voidVS_StrTrim(char*pStr) { char *pTmp = pStr; while (*pStr != '/0') { if (*pStr != ' ') { *pTmp++ =

  • ajax响应json字符串和json数组的实例(详解)

    最近上班太忙,晚上抽空整理一下ajax请求中,后台返回json字符串和json数组的场景,以及前台的处理示例. 直接看代码. json字符串的后台响应 package com.ajax; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.serv

  • Python 字符串大小写转换的简单实例

    ①所有字母都转换为大写 # -*- coding:utf-8 -*- if __name__ == "__main__":     a = 'hello, world!'     print(a.upper())输出: HELLO, WORLD! ②所有字母都转换为小写 # -*- coding:utf-8 -*- if __name__ == "__main__":     a = 'HELLO, WORLD!'     print(a.lower())输出: h

  • java 实现截取字符串并按字节分别输出实例代码

    java 实现截取字符串并按字节分别输出实例代码 前言: 请编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串.但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF"6,应该输出"我ABC",而不是"我ABC"+"汉"字的半个. 2.解析思想 本题容易产生困惑的是中文字符和英文字符如何处理,在这里需要考虑汉字和英文字符的占用字节

  • Java字符串去除特殊字符内容的实例

    如下所示: //带有特殊符号字符串示例 String str = "我的名字(测试)"; //去除特殊字符内容 其中的"()"为特殊字符 str.replaceAll("[^0-9a-zA-Z\u4e00-\u9fa5.,,.?""]+",""): //去除特殊符号后字符串内容: System.out.println("字符串str:" + str");// str:我的名字测

随机推荐