字符串,字符串,字符串

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


SQLJ

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


在比较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!

例子

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


 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中键入Safe SQL相关推荐

  1. java 键入_在Java中键入Safe SQL

    java 键入 字符串,字符串,字符串 无论您使用的是JPA , MyBatis还是Spring Data JDBC之类的框架,总会最终将SQL语句声明为Java String. 这种方法的问题在于, ...

  2. Java 中如何使用 SQL 查询文本

    [摘要]         使用 SQL 查询语言,你只能查询位于数据库里面的数据,但是当你面对的数据是一些 Excel 表格或者 Txt 文本格式时,有什么办法能直接对着文件进行 Select 查询呢 ...

  3. Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?

    昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用? 之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类 ...

  4. java中模糊查询sql怎么写,mybatis模糊查询sql,

    mybatis模糊查询sql, 今天下午做的一个功能,要用到模糊查询,字段是description,刚开始我的写法用的是sql中的模糊查询语句, 但是这个有问题,只有将字段的全部值传入其中,才能查询, ...

  5. JAVA中直接执行sql语句示例

    代码: import java.sql.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; ...

  6. Java中使用hql,sql查询--多表查询后的新实体构建方法

    2019独角兽企业重金招聘Python工程师标准>>> SQL> select r.roleid,r.rolename from dsp_role r,dsp_userinfo ...

  7. JAVA中直接执行sql语句

    获取数据库链接 /*** @return* @throws Exception* @功能描述: 获取数据库连接*/public static Connection getMySqlConnection ...

  8. java 查询sql_Java 中如何使用 SQL 查询文本

    [摘要] 使用 SQL 查询语言,你只能查询位于数据库里面的数据,但是当你面对的数据是一些 Excel 表格或者 Txt 文本格式时,有什么办法能直接对着文件进行 Select 查询呢?去乾学院看个究 ...

  9. java mysql 占位符_在Java中编写带占位符的SQL语句

    C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...

最新文章

  1. 判断long类型是否为空_数据类型
  2. mRNA定位数据库mRNALocater使用指南
  3. DDoS攻击愈演愈烈,反射攻击举足轻重
  4. 干不掉的钉钉:从哪来,往哪去?
  5. Python入门--函数的参数总结
  6. 阶段3 2.Spring_07.银行转账案例_10 使用动态代理实现事务控制
  7. android 判断是夜神模拟器,查看夜神模拟器版本的三种技巧
  8. 市场调查报告写作的基本要求
  9. oracle12c生命周期,Oracle 12c 新特性之: ILM 数据生命周期管理
  10. 04、HTMLCSS-盒子模型
  11. 构造中小型园区网实训案例
  12. 用微信 远程遥控 服务器
  13. HZ服务器装系统速度变慢,360Hz刷新率有些什么厉害的地方?响应时间系统延迟测试...
  14. 学java被“劝退”的第三天
  15. Java工程师学习指南(2019最新版)
  16. 最小覆盖模型matlab_MATLAB求解最小球覆盖问题
  17. DateTime计算时间差
  18. 2013——自我反思
  19. MATLAB中ANFIS的使用教程
  20. 怎么把图片弄成logo_ps怎样把logo图案添加在照片上?

热门文章

  1. P2114-[NOI2014]起床困难综合症【位运算】
  2. 【启发式合并】【dfs】树数树(nowcoder 20107-C)
  3. Spring @Import注解配置类方法内部调用没有注入属性值的坑
  4. Hadoop生态Flume(三)拦截器(Interceptor)介绍与使用(1)
  5. MySQL存储引擎中MyISAM和InnoDB区别
  6. Java成神之路技术整理
  7. Java生成随机数的几种高级用法
  8. JAVA面试题-小白
  9. Java数组,字符串
  10. 20级:班级日常分享,一天一瞬间