jooq

POJO Mapping in JOOQ regardless of parameter order

瘦欲@ 提交于 2020-04-13 10:45:07
问题 When I generate the JOOQ POJOs, the constructor follows the same order for the parameters as the fields in the database table. When querying the table and using fetchInto this works fine, as long as the order of the POJO constructor parameters and the order of the fields in the database table are the same. return create .select() .from(KEY) .fetchInto(Key.class); How can I map the query above into Key.class regardless of the constructor parameter order? E.g. can I use something like mapstruct

单元测试数据库驱动的应用程序的最佳策略是什么?

只愿长相守 提交于 2020-03-21 09:48:15
3 月,跳不动了?>>> 我使用很多Web应用程序,这些应用程序由后端不同复杂程度的数据库驱动。 通常,存在与业务和表示逻辑分离的 ORM 层。 这使得对业务逻辑的单元测试相当简单; 事物可以在离散模块中实现,测试所需的任何数据都可以通过对象模拟来伪造。 但是测试ORM和数据库本身一直充满了问题和妥协。 多年来,我尝试了一些策略,其中没有一个完全满足我。 使用已知数据加载测试数据库。 针对ORM运行测试并确认正确的数据返回。 这里的缺点是您的测试数据库必须跟上应用程序数据库中的任何模式更改,并且可能会不同步。 它还依赖于人工数据,并且可能不会暴露由于愚蠢的用户输入而发生的错误。 最后,如果测试数据库很小,它将不会显示缺失索引等低效率。 (好吧,最后一个不是真的应该使用单元测试,但它不会受到伤害。) 加载生产数据库的副本并对其进行测试。 这里的问题是你可能不知道在任何给定时间生产数据库中有什么; 如果数据随时间变化,您的测试可能需要重写。 有些人指出,这两种策略都依赖于特定的数据,单元测试应该只测试功能。 为此,我见过建议: 使用模拟数据库服务器,并仅检查ORM是否正在发送正确的查询以响应给定的方法调用。 您使用了哪些策略来测试数据库驱动的应用程序? 什么对你有用? #1楼 我实际上已经使用了你的第一种方法取得了相当大的成功,但我认为这种解决方案可以解决一些问题: 保留整个架构和脚本

JOOQ踩坑记录——使用生成的Dao报错问题解决

断了今生、忘了曾经 提交于 2020-03-20 10:26:55
3 月,跳不动了?>>> 初次使用jooq,像往常一样像通过在service注入生成的Dao然后在方法中调用,没想到直接报错:Cannot execute query. No Connection configured;点到UserDao源码里看到如下所示: 我们用 @Autowired 注入的是一个没有任何配置的UserDao,需要我们用第二个构造方法构造一个有configuration的实例; 完整实现方式如下: public class UserServiceImpl implements UserService { @Autowired DSLContext context ; private Configuration configuration ; private UsersDao usersDao ; @PostConstruct//表示在UserServiceImpl构造完成之后执行 private void createDao (){ usersDao = new UsersDao( context .configuration()) ; } private com.example.demo.generator.tables.Users u = com.example.demo.generator.tables.Users. USERS .as( "u" ) ;

How to join 3 tables and iterate results using jooq?

倾然丶 夕夏残阳落幕 提交于 2020-03-19 02:53:35
问题 I have COURSE, STUDENT, SCHEDULE tables. table course(id, name, ....), table student(id, name, ...), table schedule(id, c_id, s_id). Now I want to left join schedule table with course and student table. Question (1): What's the best way to do join these 3 tables in jooq? I assume it's like: TableLike<?> firstjoin = sql .select() .from(Tables.SCHEUDLE) .leftOuterJoin(Tables.COURSE) .on(Tables.SCHEDULE.CID.eq(Tables.COURSE.ID)) .asTable(); Result<?> result = sql .select() .from(firstjoin)

六、jOOQ 和 Spring 整合

亡梦爱人 提交于 2020-03-05 06:24:35
本章主要讲解 jOOQ 和 Spring 的基础整合方式,包括数据源的自动注入,DAO自动注入,以及事务管理。 Spring Maven 相关依赖 在原来依赖的基础上,还需要添加 Spring 相关的依赖,另外,利用Spring Spring 的基本依赖主要是其中的容器,注解,以及数据源相关依赖,连接池这里用的 HikariCP ,号称 Java 性能最高的数据库连接池 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency>

七、Spring Boot和jOOQ整合

自作多情 提交于 2020-03-04 10:21:38
在当前微服务盛行的情况下, Spring Boot 或 Spring Cloud 为基础的微服务体系是主流, 也是目前业务场景中新的选型方向 相对于直接使用Spring来说,利用Spring Boot来整合jOOQ相对来说简单很多 Maven 依赖 Spring Boot 官方有对 jOOQ 的支持,所以只需要简单的引用 spring-boot-starter-jooq 和对应的jdbc驱动即可 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jooq</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope

八、为DAO添加分页扩展

左心房为你撑大大i 提交于 2020-03-04 10:19:01
为什么要对DAO进行扩展? 在之前的篇幅中,我有介绍到,由jOOQ生成的DAO带有一些基础的CURD方法,另外还会针对每个字段生成一些查询方法。 但是这些方法比较单一,都是以单一字段为基础,进行查询操作,不足以面对复杂的业务场景。 例如,我们业务中常用到的分页查询、多条件查询等,都没有在被封装在DAO中,只能用 DSLContext 的API来完成。 其实这些方法比较通用,我们可以通过一些的封装,让我们能够以更简单的方式进行这些操作 如何进行 通过jOOQ生成的DAO代码可以发现,所有的DAO都继承了 DAOImpl 抽象类,那么我们只需要自己创建一个类去继承 DAOImpl 然后让所有的DAO类继承我们自己创建的类,那么就可以在自己创建的类内,来扩展一些公共方法,给每个DAO去使用 假设我们创建的类名称叫 AbstractExtendDAOImpl ,以 S1UserDao 为例,继承关系如下: S1UserDao [extends] -> AbstractExtendDAOImpl [extends] -> DAOImpl [implement] -> DAO 但是jOOQ生成的代码每次都是根据配置全量生成的,他会删除原有的目标路径然后重新生成,所以在DAO生成后直接修改生成后的代码是不可行的。那么我们只能在生成阶段,去修改最终的生成目标代码 jOOQ 生成器的配置内可以通过

九、POJO的扩展

安稳与你 提交于 2020-03-04 10:09:03
由 jOOQ 生成的 POJO 是针对单个表的字段进行生成。在关联查询中,通常我们要将多个表的数据存放在一个类里。这种情况下,我们可以自行创建一个类,去添加我们需要的多表字段成员变量 对于这种比较常见的情况来说,手动创建类显得很繁琐,我们可以在生成 POJO 的同时,创建一个空白的并且继承原有POJO的类,需要添加字段的时候,直接在我们生成的类上添加想要的其他表字段 要想达到以上效果,我们还是需要自定义代码生成器,添加针对这些继承类(这里先称之为 Entity)的创建代码逻辑。通过之前的需求分析,这些代码创建后需要由我们自行修改的,所以只能生成一次, 文件存在的时候就不能再进行覆盖或者被代码生成器删除 所有生成的 Entity 我们需要放在 jOOQ 配置的目标包平行的父级包内。这样 jOOQ 在生成代码前清空指定目录的包内容时,我们自己的包不会被波及到。并且在生成逻辑中,需要判断目标 Entity 文件是否已存在,如果存在就忽略 通过这些逻辑,在我们为 Entity 添加关联表的成员变量的时候,就不会被 jOOQ 的代码生成器所覆盖或删除。可以安全的去增加代码,实现我们想要的逻辑 Entity 生成 一个初始的 Entity 很简单,只需要继承 jOOQ 生成的 POJO 即可 package com.diamondfsd.jooq.learn.entity; import

四、jOOQ 系列教程 - Record 详解

╄→гoц情女王★ 提交于 2020-03-04 09:38:09
Record 形式 Record 是jOOQ定义的用于储存数据库结果记录的一个接口,其主要是将一个表字段的列表和值的列表使用相同的顺序储存在一起,可以看做是一个用于储存列/值的映射的对象。通常有以下几种形式 表记录 与数据库表一一对应,如果包含主键,会继承 UpdatableRecordImpl 类,该类提供了使用 update , delete API进行数据操作。进行查询操作时,jOOQ会将结果集包装为一个 TableRecord 对象。 在使用代码生成器的时候,会生成更详细的表记录类,包含表的每个字段操作等,通常以表名为开头 XxxxRecord 此类 Record 对象一般都有对应字段的 getter/setter 方法,但其都只是去调用 get/set 方法。其储存的方式还是通过两个数组来储存对应列/值的数据的,所以 Record 对象是不能被 JSON 直接序列化和反序列化的 UDT 记录 通常用于 Oracle 等支持用户自定义数据类型的数据库记录,这里接触较少,不作讲解 明确数据的记录 通用记录类型的一种,当你的字段不超过22个时,会根据字段个数反射成 Record1 , Record2 ... Record22 类的对象。这些对象需要的泛型个数和后面的数字一致,类型和字段类型一致。jOOQ自动生成的 Record 对象里,如果字段个数不超过 22 个,会同时实现

基于 Java 的 Active Record 开源项目

狂风中的少年 提交于 2020-03-01 05:41:33
Active Record 是什么?也许很多做 Java 的朋友并没有听说过这个概念,但它确实很早就已经出现了。 确切地说,应该是在 2003 年,由世界大师级人物 Martin Fowler(马丁 · 福勒)在他写的一本叫做《企业应用架构模式》书里就描述过这个模式。不可否认,马丁是软件架构的泰斗,他写的每本书,我都买过,虽然很多内容我还看不懂,但每次阅读都有新的认识,虽然这些文字已经很陈旧了。 如果您想了解关于 Active Record 的权威定义,可以点击下面的维基百科地址: http://zh.wikipedia.org/wiki/Active_Record 当然,如果您想听到更通俗易懂的言语,我可以试着描述一下: 它是面向领域对象的设计模式 它为每个领域对象提供一组 CRUD 方法 以上提到的 领域对象 实际上就是我们经常说的 Entity (实体)。 Active Record 模式最早是在 Ruby on Rails(RoR)里取得了最佳实践,然后其它开发语言开始效仿,比如:PHP、Python 等,当然 Java 也不例外。 这几天我收集了几款基于 Java 的 Active Record 开源项目,这些项目都非常优秀,让我收获良多、受益匪浅!所以我忍不住想与大家分享一下我的学习心得与体会。 需要申明的是:本文仅代表个人看法,本人仅站在使用者的角度来体验这些产品