一、简介 JOOQ全称Java Object Oriented Querying,基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可以轻松的使用Java面向对象语法来实现各种复杂的sql。 JOOQ 既吸取了传统ORM操作数据的简单性和安全性,又保留了原生sql的灵活性,它更像是介于 ORMS和JDBC的中间层。可以使用Java代码写出sql的感觉来。 如同官网[https://www.jooq.org/]所说: get back in control of your sql二、原理 jOOQ,是一个ORM框架,利用其生成的Java代码和流畅的API,可以快速构建有类型约束的安全的SQL语句 jOOQ使重心可以放在业务逻辑上,而Java与SQL的基础交互部分,都可以交给jOOQ去处理。jOOQ支持很多数据库,而且有商业版本和社区版本区别,商业版本和社区版本区别主要是支持数据库不一样,可以在其授权说明页面上看到各个版本对于数据库的支持情况,开源版本只支持部分开源数据库如MySQL等 jOOQ的核心优势是可以将数据库表结构映射为Java类,包含表的基本描述和所有表字段。通过jOOQ提供的API,配合生成的Java代码,可以很方便地进行数据库操作 生成的Java代码字段类型是根据数据库映射成的Java类型,在进行设置和查询操作时,因为是Java代码,都会有强类型校验,所以对于数据的输入,是天然安全的,极大的减少了SQL注入的风险 jOOQ的代码生成策略是根据配置全量生成,任何对于数据库的改动,如果会影响到业务代码,在编译期间就会被发现,可以及时进行修复 三、流程 官网文档提到7步走 Step 1: Preparation Step 2: Your database Step 3: Code generation Step 4: Connect to your database Step 5: Querying Step 6: Iterating Step 7: Explore 开发流程大致就是 三步: 创建/更新 数据库表 通过JOOQ插件生成Java代码 进行业务逻辑开发 四、使用Maven配置 jOOQ 提供了 Maven 插件 jooq-codegen-maven ,通过配置可以进行代码生成操作,配置项主要是jdbc连接,目标数据库,表,以及生成的路径包名等3.15.3 mysql mysql-connector-java8.0.18 org.jooq jooq${jooq.version} 代码生成 代码生成的原理就是通过读取数据库的元数据,将其转换为Java代码,并生成指定的文件,存放到配置好的指定目录 jOOQ的生成代码的目标路径建议配置单独的子包,因为每次代码生成都是全量的,如果和其他业务代码混合在一起,会被生成器误删 # 通过此命令里可以调用 jooq-codegen-maven 插件进行代码生成 mvn jooq-codegen:generate 代码生成器执行完成后,会生成以下目录: src/main/java/.../codegen ---- // 生成路径 tables --------------------- // 表定义目录 pojos ------------------- // 存放和表一一对应的 POJO 类 records ------------------ // 储存一条表记录的字段和值,提供了一系列针对行记录对象的操作方法,如get、set等 interfaces ----------- // 由records和pojos实现,便于进行record和pojo之间的转换 daos ----------- // 提供了常用的查询操作的封装 表数据 ----------- // 表描述信息,提供了获取表字段、索引、主键、重命名等方法供daos和records中的类调用 DefaultCatalog ------------- // Catalog对象,包含Schema常量 Indexes -------------------- // 包含数据库所有的索引常量 Keys ----------------------- // 包含数据库所有表的主键、唯一索引常量 Jooq ------------------ // 数据库`jooq`常量,包含该库所有表描述常量 Tables --------------------- // 包含所有数据库表常量操作 1.直接通过SQL执行器DSLContext,DSLContext抽象了所有SQL操作 2.针对特定记录的操作可以直接调用Record对象的方法API org.jooq.Result 结果集接口,此接口实现了List接口,可以当做一个集合来操作,是一个数据库查询结果集的包装类,除了集合的相关方法,该接口还提供了一些结果集转换,格式化,提取字段等方法。通常我们查询出来的结果都是此接口的实现类,掌握好此接口是jOOQ的基础接口,基本所有的SQL查询操作,都会碰到这个接口 org.jooq.Record 此接口再使用关系型数据库时,主要用于定义数据库表记录,储存的内容是一条表记录的字段和值,每个值会储存对应字段的类型,可以通过通用的 getValue(Field field) 方法,取到对应字段的值,也可以将这个接口看做是一条记录的字段/值映射 在使用了代码生成器后,会基于此接口生成对应表的实现类,该实现类基于数据库表字段生成所有字段的 get /set 方法,可以通过 getXXX /setXXX(..) 直观的获取或设置指定的值用于读取/更新等后续操作。对于编码来说,代码的可读性大大提升 org.jooq.DSLContext jOOQ的核心接口之一,可以理解为一个SQL执行器,通过静态方法 DSL.using ,可以获取一个 DSLContext 实例,此实例抽象了所有对于SQL的操作API,可以通过其提供的API方便的进行SQL操作/** * 通过数据库连接和方言配置来创建一个执行器对象 * @param connection 数据库连接 * @param dialect 指定方言, 传入此参数的目的是,在jOOQ渲染SQL的语句的时候,会根据SQL方言配置,使用不同的语法规则去生成SQL语句字符串。 */ public static DSLContext using(Connection connection, SQLDialect dialect) { return new DefaultDSLContext(connection, dialect, null); } maven-compiler-plugin 1.8 org.jooq jooq-codegen-maven${jooq.version} com.mysql.cj.jdbc.Driver jdbc:mysql://127.0.0.1:3306/jooq root 123456 * jooq com.learn.jooq.codegen /src/main/java