在Java中键入Safe SQL

字符串,字符串,字符串

无论您使用的是JPA , MyBatis还是Spring Data JDBC之类的框架,最终都将SQL语句声明为Java String。
这种方法的问题在于,您必须为每个语句编写测试,以确保它甚至是有效的SQL。 没有编译时保证将执行SQL语句。

摆脱弦乐!

嵌入式SQL

我于1995年开始在COBOL中的IBM大型机编程上进行专业软件开发。 要访问数据库,我们使用了“嵌入式SQL”:

 EXEC SQL  SELECT lastname, firstname  INTO :lastname, :firstname  FROM employee  WHERE id = :id 

关于嵌入式SQL的最酷的事情是,预编译器将检查每个SQL语句,并且仅在编译后的代码有效的情况下对其进行检查。
在下面您可以看到编译步骤。 (来源: http : //www.redbooks.ibm.com/redbooks/pdfs/sg246435.pdf )

1-Java字符串

SQLJ

当我在2000年首次遇到Java和JDBC时,我很困惑,没有类似的东西存在。 我发现有一个名为SQLJ的计划始于1997年,但从未成功。 我不知道为什么,也许是因为这对于IDE厂商和预编译器很难集成,而Java对Java来说并不常见。 至少编译步骤类似于嵌入式SQL:

2-Java字符串

在比较JDBC和SQLJ时,我们可以看到与编写的代码量没有太大区别,但是#sql之后的所有内容都是类型安全的,因为预编译器会检查语法,就像JDBC一样,其中可能包含一个String任何错误,该错误将在生产后期发生。

然后我找到了jOOQ!

十年前,卢卡斯·埃德(Lukas Eder)发行了jOOQ的第一个版本。 据该网站称,jOOQ是“用Java编写SQL的最简单方法”

让我们尝试使用jOOQ编写与上述相同的查询:

 List<EmployeeDTO> records = create .select(EMPLOYEE.LASTNAME, EMPLOYEE.FIRSTNAME, EMPLOYEE.SALARY) .from(EMPLOYEE) .where(EMPLOYEE.SALARY.between( 80000 , 100000 )) .fetchInto(EmployeeDTO. class ); 

很酷,不是吗? 是的-但是如何运作?

1.代码生成器

jOOQ使用代码生成器从数据库对象生成Java类。

例如,这是jOOQ为表EMPLOYEE生成的类的摘录:

 public class Employee extends TableImpl<EmployeeRecord> { public static final Employee EMPLOYEE = new Employee(); public final TableField<EmployeeRecord, Integer> ID = createField( "ID" , org.jooq.impl.SQLDataType.INTEGER.nullable( false ).identity( true ), this , "" ); public final TableField<EmployeeRecord, String> LASTNAME = createField( "LASTNAME" , org.jooq.impl.SQLDataType.VARCHAR( 50 ).nullable( false ), this , "" ); public final TableField<EmployeeRecord, String> FIRSTNAME = createField( "FIRSTNAME" , org.jooq.impl.SQLDataType.VARCHAR( 50 ).nullable( false ), this , "" ); public final TableField<EmployeeRecord, Integer> SALARY = createField( "SALARY" , org.jooq.impl.SQLDataType.INTEGER, this , "" ); public final TableField<EmployeeRecord, Integer> DEPARTMENT_ID = createField( "DEPARTMENT_ID" , org.jooq.impl.SQLDataType.INTEGER.nullable( false ), this , "" ); public final TableField<EmployeeRecord, Integer> MANAGER_ID = createField( "MANAGER_ID" , org.jooq.impl.SQLDataType.INTEGER, this , "" );  } 

该表和所有列都有常量。 由于这些元数据类,因此无法在数据库中不存在的SQL语句中使用类型。 并且由于您可以每次生成元数据,因此如果发生重大更改,数据库模型更改将不会编译您的代码。

以后的文章中将介绍如何配置生成器以及可能的生成器输入格式。 (敬请关注)

2.领域特定语言

jOOQ的第二部分是DSL(特定于域的语言),它允许用Java编写SQL代码。
与String中的SQL相比,DSL迫使我编写有效的SQL!

例子

因此,让我们来看更多示例。 示例基于此数据模型:

4-Java字符串

 dsl.insertInto(DEPARTMENT) .columns(DEPARTMENT.NAME) .values( "HR" ) .execute(); 

选择

 dsl.select(DEPARTMENT.NAME) .from(DEPARTMENT) .where(DEPARTMENT.NAME.eq( "IT" )) .fetchOne(); 

更新资料

 dsl.update(DEPARTMENT) .set(DEPARTMENT.NAME, "IT2" ) .where(DEPARTMENT.ID.eq(departmentId)) .execute(); 

删除

 dsl.deleteFrom(EMPLOYEE) .where(EMPLOYEE.ID.eq(employeeId)) .execute(); 

下一步是什么?

那只是一个简短的介绍。 在下一篇博客文章中,我们将更深入地了解jOOQ提供的所有功能。

同时,您可以在此处签出代码: https : //github.com/simasch/jooq-hr

翻译自: https://www.javacodegeeks.com/2019/12/type-safe-sql-in-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springmvc怎么设置更改了界面不用重启_Microsoft Visual Studio 2019 更改语言包

第一次写文章&#xff0c;如有格式等问题&#xff0c;请多多包含与指点&#xff01;很多人在编程时更喜欢英文界面&#xff0c;认为与编程语言具有相同的语境&#xff0c;更顺手。但是&#xff0c;在更改环境显示语言时&#xff0c;可能会遇到一些障碍&#xff0c;例如我之前在…

苹果电脑怎么删除软件_误格式化,删除文件怎么恢复?3款最好用的数据恢复软件推荐...

1、EasyRecovery一款威力非常强大的硬盘数据恢复工具&#xff0c;能够恢复丢失的数据以及重建文件系统。主要体现在可以从被病毒破坏或是已经格式化的硬盘中恢复数据。EasyRecovery在使用过程中不会在原始的驱动器中写入任何东西&#xff0c;其主要是在内存中重建文件分区表使数…

设计模式 生成器_生成器设计模式的应用

设计模式 生成器嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将分享我制作的全新设计模式系列的第一个。 构建器设计模式是开发严肃的应用程序时非常有用且通用的模式。 在这篇文章中&#xff0c;我将提供一个很小的构建器模式框架&#xff0c;因此您随时可以回到这里并…

C++ Qt全局异常处理器_QT教程

点击上方 蓝字关注我们今日资源今天的资源是另一套QT教程&#xff0c;某马发的&#xff0c;网上搜集到的。这已经是这个公众号发放的第三套QT教程了。关于QT&#xff1a;Qt(官方发音 [kju:t]&#xff0c;音同 cute)是一个跨平台的 C 开发库&#xff0c;主要用来开发图形用户界面…

无线设置 用户_无线WiFi远距离无线蹭网怎么中继桥接组网【详细介绍】

自从小编每天分享各种各样的无线无线WiFi蹭网、桥接、远距离组网等实例&#xff0c;吸引了很多朋友的兴趣&#xff0c;有很多网友通过关心我后&#xff0c;给我私信&#xff0c;求助我一些相关的问题&#xff0c;还有一些朋友建议我出一些教程。首先小编觉得有些东西只能意会不…

应用宝苹果版_点赞应用ios版下载-点赞应用苹果版下载v1.1

《点赞应用》app是一款实用的视频生成器工具&#xff0c;用户可以利用它为自己的视频添加各种各样的点赞效果。应用内含有多种类型的模板&#xff0c;都是免费使用的&#xff0c;想要将你的视频变得更有趣吗&#xff1f;快来下载体验一下这款应用吧&#xff01;软件特色1、这个…

SQL即服务

自2007年以来&#xff0c;我一直在考虑这一点&#xff0c;大约在Amazon 推出 S3时。 我什至尝试实现了几次&#xff0c;但是在设计阶段之后就失败了。 我听说过一家初创公司&#xff0c;也曾尝试这样做&#xff0c;但也失败了 。 我仍然不确定是否可以这样做&#xff0c;但是它…

c++ vector 一部分_《JACS》:在富电子C-H键位点上实现光控活性聚合

可逆加成-断裂链转移(RAFT)自由基活性聚合是一种调控聚合物结构组成、分子量和分布的重要聚合方法&#xff0c;其中&#xff0c;光诱导电子/能量转移(PET)的RAFT聚合反应是一种更精确的调控手段&#xff0c;因而经常被用于设计具有复杂3D分子结构的聚合物。然而常规的PET-RAFT法…

phpmyadmin忘记mysql密码_忘记phpmyadmin密码怎么重置

忘记phpmyadmin密码怎么重置,新密码,教程,相关文章,重新启动,跳过忘记phpmyadmin密码怎么重置易采站长站&#xff0c;站长之家为您整理了忘记phpmyadmin密码怎么重置的相关内容。1、停止mysql服务&#xff1a;/etc/init.d/mysql stop2、跳过验证启动MySQL/usr/local/mysql/bin/…

纵横免root框架打不开应用怎么办_很好用的软件多开神奇安卓欧皇十框架!!!...

欧皇十框架这是一款兼容安卓10的应用框架&#xff0c;轻松实现应用多开&#xff0c;可以完美免ROOT运行GG修改器&#xff0c;专为和平精英游戏设计&#xff0c;软件体积小&#xff0c;运行稳定。修改说明&#xff1a;1.支持更多应用游戏的多开、双开&#xff0c;使用更稳定、快…

电脑无internet访问_电脑中的代理服务器怎么设置 代理服务器设置方法 - 操作系统...

如何设置电脑中的代理服务器?对于代理服务器&#xff0c;可能大家对其并不是非常了解&#xff0c;其实代理服务器作为一种特殊的网络服务&#xff0c;可以代理网络用户去获取网络信息&#xff0c;提高浏览速度与效率&#xff0c;而且还可以突破自身IP的访问限制&#xff0c;访…

mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义

展开全部先进先出(62616964757a686964616fe58685e5aeb931333433653339FIFO&#xff0c;first-in&#xff0c;first-out)为处理从队列或堆栈发出的程序工作要求的一种方法&#xff0c;它使最早的要求被最先处理。后进先出&#xff0c;从栈中取出数据项的顺序与将它们插入栈的顺序…

敲代码时如何快速移动光标_如何用 Linux 技巧大大提高工作效率?

前言Linux中的一些小技巧可以大大提高你的工作效率&#xff0c;本文就细数那些提高效率或者简单却有效的Linux技巧。命令编辑及光标移动这里有很多快捷键可以帮我们修正自己的命令。接下来使用光标二字代替光标的位置。删除从开头到光标处的命令文本ctrl u&#xff0c;例如&am…

java 异常练习题_java入门异常处理练习题问题

tppe大概方式&#xff1a;1、判断用户输入的类型是否正确&#xff0c;不正确捕获异常&#xff0c;把他包装成我自己定义的异常2、判断用户输入的数是多少2.1、如果是1&#xff0c;则打印“输入图书名称”&#xff0c;用户输入&#xff0c;定义一个Book类型的数组&#xff0c;然…

windows副本不是正版怎么办_盗版系统总是崩溃?别着急,让我来告诉你正版系统怎么下载...

电脑系统崩溃了怎么办&#xff1f;相信很多小伙伴都会选择重装系统&#xff0c;奈何自己又不会&#xff0c;只能搬到修电脑的地方&#xff0c;最后发现安装的还是盗版系统&#xff0c;不能登录微软账号不说&#xff0c;还会被捆绑安装一堆流氓软件&#xff0c;那么&#xff0c;…

sudo spctl --master-disable_量大从优批发--阳离子聚丙烯酰胺--用于生活污水、

量大从优批发--阳离子聚丙烯酰胺--用于生活污水、wkkk量大从优批发--阳离子聚丙烯酰胺--用于生活污水、怎么来辨别聚丙烯酰胺到底是什么型号的呢&#xff1f;下面来介绍型号辨别的消防法。聚丙烯酰胺我们都知道聚丙烯酰基是昂贵的阳离子&#xff0c;其次是非离子聚丙烯酰胺&…

jboss eap_HawtIO在JBoss EAP上(第二部分)

jboss eap我刚刚发布了一篇关于在JBoss Wildfly 8.1上运行HawtIO的条目 。 从那篇文章中&#xff0c;您将了解HawtIO的出色表现 &#xff0c;以及它必须具备的所有 出色 插件&#xff0c;才能从单个仪表板管理基于JVM的技术……好吧…… hawt ……。 但是&#xff0c;出于上一…

alter id order by_声卡id查找表

强烈建议收藏这个表格真的很方便&#xff0c;强烈建议大家收藏&#xff0c;尤其是那些喜欢折腾的人&#xff01;因为有时候会特别需要它声卡ID表芯片型号仿冒ID创作的CA01320x100918仿冒ID值 0,1,2,3,4,5,6,9,10,11,12Cirrus Logic公司CS42100x100101仿冒ID值 13Cirrus Logic公…

JDK 14:CMS GC是OBE

JDK 14 Early Access Build&#xff03;23 &#xff08; 2019/11/13 &#xff09; 现已上市 。 此版本最值得注意的更改之一是删除了并发标记扫描垃圾收集器 。 JEP 291 [“弃用并发标记扫描&#xff08;CMS&#xff09;垃圾收集器”]早在2017年就使用JDK 9和JEP 363 [“删除并…

python 转成摩尔斯电码_一篇文章教会你摩尔斯码

正规的摩尔斯码对照表是这样的其实记住主要的26个字母就够日常用了&#xff0c;而记26个字母有一张更简单的图&#xff1a; 把点和横线以字母的形态呈示出来&#xff0c;基本上看一遍就能记住大半了。不过要注意每个字母下方的一行小字&#xff0c;那是正确的顺序&#xff0c;别…