java 键入_在Java中键入Safe SQL

java 键入

字符串,字符串,字符串

无论您使用的是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

java 键入

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

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

相关文章

filter过滤后重新添加_Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

前言在 Spring Boot 中已经移除了 web.xml 文件&#xff0c;如果需要注册添加 Servlet、Filter、Listener 为 Spring Bean&#xff0c;在 Spring Boot 中有两种方式&#xff1a;使用 Servlet 3.0 API 的注解 WebServlet、WebFilter、Listener 用来配置。Spring Boot JavaConfig…

对象克隆+深浅拷贝

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 对象拷贝 的概念 &#xff0c; 特别是对 深拷贝和浅拷贝 的理解&#xff1b; 0.2&#xff09; 最后&#xff0c;我们还要看一个 clone 的荔枝&#xff1b; 【1】对象克隆相关 1…

read cache_通过READ-BEHIND CACHE控制您的慢速生产者

read cache在我们的互联世界中&#xff0c;我们经常使用我们不拥有或无权改善的API中的数据。 如果一切顺利&#xff0c;他们的表现就会很好&#xff0c;每个人都会高兴。 但是太多次&#xff0c;我们不得不使用延迟小于最佳延迟的 API。 当然&#xff0c;答案是缓存该数据 。…

azkaban mysql参数_azkaban参数详解

参数传递是调度字体工作流运行时非常重要的一部分&#xff0c;工作流的执行&#xff0c;单个作业的执行&#xff0c;多个工作流之间的依赖执行&#xff0c;历史任务重算&#xff0c;都涉及到参数传递和同步。1 参数类型综述azkaban的工作流中的参数可以分为如下几个类型&#x…

接口与回调

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 接口与回调 概念 &#xff1b; 【1】接口与回调相关 1.1&#xff09;回调定义&#xff1a; 回调是一种常见的程序设计模式&#xff0c; 在这种模式中&#xff0c; 可以指出某个…

spring react_使用Spring Cloud Gateway保护React式微服务

spring react朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证&#xff0c;管理和保护。 所以你想完全React&#xff0c;是吗&#xff1f; 大&#xff01; React式编程是使…

mysql断电同步不起作用_mysql主从同步因断电产生的不能同步问题

偶尔因为断电导致mysql slave 出现复制错误“Could not parse relay log event entry”Could not parse relay log event entry. The possible reasons are: the masters binary log is corrupted (you can check this by running mysqlbinlog on the binary log), the slaves …

图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)

【0】README 0.1&#xff09;为什么有这篇文章&#xff1f;因为 Dijkstra算法的优先队列实现 涉及到了一种新的数据结构&#xff0c;即优先队列&#xff08;二叉堆&#xff09;的操作需要更改以适应这种新的数据结构&#xff0c;我们暂且吧它定义为Distance&#xff0c; 而不是…

cucumber测试_如何在Cucumber中进行后端测试

cucumber测试Cucumber是一种规范语言的执行框架。 它并不是要成为测试语言&#xff0c;而是用于创建测试自动化。 Cucumber最适合出现一些实际参与者互动并取得某种成果的情况。 当可以从用户的角度编写它时&#xff0c;它特别有用。 Given Sarah is a premium club member W…

linux mysql删除密码忘记了_linux下忘记mysql密码的几种找回方法(推荐)

今天我们主要是讲一下关于linux忘记mysql密码处理方法&#xff0c;下面提供了5种linux忘记mysql密码找回方法哦。方法一(先进入root权限)&#xff1a;# /etc/init.d/mysql stop# mysqld_safe --usermysql --skip-grant-tables --skip-networking &# mysql -u rootmysql>…

Dijkstra 算法——计算有权最短路径(边有权值)

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在理解 Dijkstra 的思想并用源代码加以实现&#xff1b; 0.2&#xff09;最短路径算法的基础知识&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/article/detail…

spring使用自定义注解_用Spring组成自定义注释

spring使用自定义注解Java批注在2004年随Java 5一起引入&#xff0c;是一种将元数据添加到Java源代码中的方法。 如今&#xff0c;许多主要框架&#xff08;如Spring或Hibernate&#xff09;都严重依赖注释。 在本文中&#xff0c;我们将介绍一个非常有用的Spring功能&#xf…

打印结果和调试结果不一样(C语言)

【0】README 0.1&#xff09;本文旨在阐述 个人的debug经历&#xff0c;遇到的各种debug 奇葩问题&#xff0c; 说是奇葩&#xff0c;其实也是自己 不小心或者说是编程习惯不好&#xff1b; 【1】debug和running的运行结果不一致&#xff08;乍眼一看&#xff0c;你肯定醉了&a…

mysql add default_MySQL中create table DEFAULT 用法

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)][table_options] [select_statement]TEMPORARY&#xff1a;该关键字表示用create table新建的表为临时表&#xff0c;此表在当前会话结束后将自动消失。临时表主要被应用于存储过程中&#xff0c;…

jakarta ee_Jakarta EE贡献–入门

jakarta ee您是否有兴趣帮助Jakarta EE向前发展&#xff1f; 我也是。我想提供一些详细信息&#xff0c;以帮助有兴趣入门的人。 第1步&#xff1a; 开始捐款的第一步是签署Eclipse Foundation Committer and Contributor Agreement&#xff08;ECA&#xff09;&#xff1a; …

最小生成树基础

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在 review 最小生成树的基础知识&#xff1b; 0.2&#xff09;了解本文的内容是 分析 Prim算法&#xff08;普利姆算法&#xff09;和 Kruskal算法&#xff08;克鲁斯卡…

mysql dump gtid_mysqldump命令详解 Part 3- 备份全库

前面说了MySQL Linux平台和Windows平台的安装下面开始是MySQL的一些学习笔记前面我们说了如果构造数据这节开始说MySQL 的备份环境为MySQL 5.7.25在解释命令之前我们先弄清楚数据库中有哪些对象上一节我们建立了数据库并建立相关的对象数据库表存储过程函数触发器事件这节讲一些…

apache lucene_Apache Lucene中的并发查询执行

apache luceneApache Lucene是一个出色的并发纯Java搜索引擎&#xff0c;如果您愿意&#xff0c;它可以轻松地使服务器上的可用CPU或IO资源饱和。 “典型” Lucene应用程序的并发模型在搜索时每个查询一个线程&#xff0c;但是您是否知道Lucene也可以使用多个线程同时执行一个查…

最小生成树——Prim(普利姆)算法

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 源代码均为原创&#xff0c; 旨在 理解Prim算法的idea 并用 源代码加以实现&#xff1b; 0.2&#xff09;最小生成树的基础知识&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/article/details…

mysql grant usage on_grant 权限 on 数据库对象 to 用户

grant 权限 on 数据库对象 to 用户一、grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。grant select on testdb.* to common_user’%’grant insert on testdb.* to common_user’%’grant update on testdb.* to common_user’%’grant del…