《你不知道的 JAVA》博客系列 💘 — 隐藏在数据库增删改查中的秘密

学会这款 全新设计的 Java 脚手架 ,从此面试不再怕!

Trump-mjga-logo.png

书接上文

自从上一篇 Blog https://www.codefather.cn/post/1875096998770561026 发出以后,有同学提出了这样一种观点:「我管你这那的,数据库我只用增删改查,连分页都不用一样能写程序」。

image.png

这篇文章不讨论这种做法的对错,只介绍 JOOQ 针对这种使用方式的解决方案。

Simple CRUD

上述的使用方式在数据库操作中有个专业名词,叫做 Simple CRUD。这不是什么神奇的功能,大多数数据操作库都会提供这个功能的解决方案。当然,原始的 Mybatis 没有这个功能——所以我们常说:Mybatis 是一个上古时代的框架。

言归正传,对于这样一个 SQL 来说,Mybatis Plus 和 JOOQ 中的 Simple CRUD 分别如下所示:

sql
复制代码
SELECT * FROM user WHERE username = 'John';

Mybatis Plus

java
复制代码
public interface UserMapper extends BaseMapper<User> { } @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { } QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("username", "John"); List<User> userList = userMapper.selectList(queryWrapper);

JOOQ

java
复制代码
@Autowired private DSLContext dsl; List<User> users = dsl.selectFrom(USER).where(USER.USERNAME.eq("John")).fetchInto(User.class);

DSLContext 是什么

JOOQ 不需要什么额外的样板代码,DSLContext 就是 JOOQ 和数据库交互的核心 API——当和 SpringBoot 进行集成时,通过 @Autowired private DSLContext dsl便可在任意地方注入进行使用,就算你在 Controller 里面用也可以。

Q:有好事者问了,那我不用 SpringBoot,使用 JOOQ 还像这样方便吗? A:是的,那更方便了。

java
复制代码
DSL.selectFrom(USER).fetch()

查询数据

上面我们已经介绍过了,除此之外还能使用 fetchOne 等其他变体。

java
复制代码
User user = dsl.selectFrom(USER).fetchOne();

插入数据

通过 newRecord 创建的对象叫做 UpdatableRecords,这是一个隐含了数据库链接的对象,store 就是插入数据的方法。

java
复制代码
UserRecord userRecord = dsl.newRecord(USER); userRecord.setUsername("9hrb5Fv@gmail.com"); userRecord.setPassword("falr2b9nCVY5hS1o"); userRecord.store();

更新数据

store 是一个 upsert 操作,它不仅能够插入数据,还能够更新数据。这是全自动的,当对象在数据库里已经存在时,再调用 store 就是更新操作。

java
复制代码
// 插入新数据 UserRecord userRecord = dsl.newRecord(USER); userRecord.setUsername("9hrb5Fv@gmail.com"); userRecord.setPassword("falr2b9nCVY5hS1o"); userRecord.store(); // userRecord 插入完毕后再次调用 store 则自动更新 userRecord.setPassword("JHMDoQPKuEcgILE6"); userRecord.store();

删除数据

java
复制代码
UserRecord userRecord = dsl.fetchOne(USER, USER.USERNAME.eq("testUserA")); userRecord.delete();

刷新数据

一个被查询出的UpdatableRecords 代表的数据库状态可能不是最新的,因为别的线程可能在你之后改变了数据库状态。调用 refresh 可以刷新对象的属性为数据库的最新状态。

java
复制代码
// 线程A UserRecord fetchedOne = dsl.fetchOne(USER, USER.USERNAME.eq("9hrb5Fv@gmail.com")); assertThat(fetchedOne.getPassword()).isEqualTo("falr2b9nCVY5hS1o"); // 线程B userRecord.setPassword("JHMDoQPKuEcgILE6"); userRecord.store(); // 线程A fetchedOne.refresh(); assertThat(fetchedOne.getPassword()).isEqualTo("JHMDoQPKuEcgILE6");

致其他语言的开发者

虽然 JOOQ 不是一个 ORM(Mybatis 当然更不是),但是对于使用 C# 和 PHP 及 Ruby 的开发者来说,当你在项目中不得不使用 Java 时,JOOQ 会不会稍微让你对这个领域的 CRUD 生态提起一点点信心?

写在最后

我是 Chuck1sn,欢迎关注我的账号,今后我将更新更多 Jvm 生态相关的博客和文章。欢迎大家一起心态 open 的讨论技术、分享技术、热爱技术。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
Chuck1sn
下载 APP