甘肃手机版建站系统哪个好,销售人员培训课程有哪些,网站建设如何做报价,wordpress 主题 中国风java 键入字符串#xff0c;字符串#xff0c;字符串 无论您使用的是JPA #xff0c; MyBatis还是Spring Data JDBC之类的框架#xff0c;总会最终将SQL语句声明为Java String。 这种方法的问题在于#xff0c;您必须为每个语句编写测试#xff0c;以确保它甚至是有效SQ… 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 SQLJ 当我在2000年首次遇到Java和JDBC时我很困惑没有类似的东西存在。 我发现有一个名为SQLJ的计划始于1997年但从未成功。 我不知道为什么也许是因为这对于IDE供应商和预编译器很难集成而Java对Java来说并不常见。 至少编译步骤类似于嵌入式SQL 在比较JDBC和SQLJ时我们可以看到与编写的代码量没有太大区别但是#sql之后的所有内容都是类型安全的因为预编译器会检查语法与JDBC一样其中可能包含一个String任何错误该错误将在生产后期发生。 然后我找到了jOOQ 十年前卢卡斯·埃德Lukas Eder发行了jOOQ的第一个版本。 据该网站称jOOQ是“用Java编写SQL的最简单方法” 让我们尝试使用jOOQ编写与上述相同的查询 ListEmployeeDTO 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 TableImplEmployeeRecord { public static final Employee EMPLOYEE new Employee(); public final TableFieldEmployeeRecord, Integer ID createField( ID , org.jooq.impl.SQLDataType.INTEGER.nullable( false ).identity( true ), this , ); public final TableFieldEmployeeRecord, String LASTNAME createField( LASTNAME , org.jooq.impl.SQLDataType.VARCHAR( 50 ).nullable( false ), this , ); public final TableFieldEmployeeRecord, String FIRSTNAME createField( FIRSTNAME , org.jooq.impl.SQLDataType.VARCHAR( 50 ).nullable( false ), this , ); public final TableFieldEmployeeRecord, Integer SALARY createField( SALARY , org.jooq.impl.SQLDataType.INTEGER, this , ); public final TableFieldEmployeeRecord, Integer DEPARTMENT_ID createField( DEPARTMENT_ID , org.jooq.impl.SQLDataType.INTEGER.nullable( false ), this , ); public final TableFieldEmployeeRecord, 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.htmljava 键入