使用活动记录执行CRUD

本文是我们学院课程的一部分,标题为jOOQ –类型安全的数据库查询 。

在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多,JDBC过多时,这是一种替代方法。 它显示了一种现代的领域特定语言如何可以极大地提高开发人员的生产率,从而将SQL内部化为Java。

在本课程中,我们将看到如何使用jOOQ有效地查询数据库。 在这里查看 !

目录

1.简介 2.简单的活动记录操作 3.乐观锁

1.简介

虽然SQL是一种非常有表现力的语言,但是您的大多数SQL可能都是CRUD(创建,读取,更新,删除)。 编写这样的CRUD既无聊又重复,这就是为什么像Hibernate这样的ORM出现并成功提高开发人员生产力的原因。 但是,当您经常只想对表中的单个记录进行操作时,Hibernate对您的体系结构进行了许多假设(和限制)。

也可以从org.jooq.academy.section2包中获得本节中显示的示例 。

2.简单的活动记录操作

jOOQ知道“活动记录”或UpdatableRecords ,可以将其装入“特殊”种类的SELECT语句,然后在内部跟踪脏标志。 这是在不编写过多SQL的DATE_OF_BIRTH下更新作者DATE_OF_BIRTH

AuthorRecord author = dsl.selectFrom(AUTHOR).where(AUTHOR.ID.eq(1)).fetchOne();
author.setDateOfBirth(Date.valueOf("2000-01-01"));
author.store();

由于上面的示例仅通过selectFrom()从一个表中进行选择,因此jOOQ知道结果记录类型将为AuthorRecord ,即由代码生成器生成的对象。 AuthorRecord实现UpdatableRecord ,它具有多种有用的方法:

  • store() INSERTUPDATE记录
  • insert() INSERT记录
  • update() UPDATE记录
  • delete() DELETE记录
  • refresh()从数据库刷新记录

以下示例部分将指导您完成创建,读取,更新,删除此类记录的整个生命周期:

AuthorRecord author;// Create a new record and store it to the database. This will perform an INSERT statement
author = dsl.newRecord(AUTHOR);
author.setId(3);
author.setFirstName("Alfred");
author.setLastName("Hitchcock");
author.store();// Read the record by refreshing it based on the primary key value
author = dsl.newRecord(AUTHOR);
author.setId(3);
author.refresh();// Update the record with a new value
author.setDateOfBirth(Date.valueOf("1899-08-13"));
author.store();// Delete the record again
author.delete();

jOOQ的UpdatableRecords跟踪每列内部的“脏”或“已更改”状态,在调用store()以便仅插入/更新已在UpdatableRecord更改的值时使用该状态。

3.乐观锁

执行CRUD时,并发数据访问通常是一个可以通过两种方法解决的问题:

  • 通过使用悲观锁定
  • 通过使用乐观锁定

悲观锁定很少是一个好选择,因为当两个进程以不同的顺序锁定表中的几行以等待彼此完成时,死锁很容易发生。 乐观锁定是更合适的解决方案。 一个过程可能很幸运,可以在另一个过程尝试(失败)之前完成交易。 这是jOOQ的工作方式。

在我们的样本数据中, BOOK表具有一个特殊的“系统”列,称为REC_TIMESTAMP 。 每当您在BookRecord上运行CRUD操作时,jOOQ都会完全管理此列的内容,而不必保持最新状态。 考虑以下代码示例:

// Enable optimistic locking
DSLContext dsl = DSL.using(connection, new Settings().withExecuteWithOptimisticLocking(true));// Perform the CRUD with the above setting
BookRecord book1 = dsl.selectFrom(BOOK).where(BOOK.ID.eq(1)).fetchOne();
book1.setTitle("New Title");
book1.store();

jOOQ现在将执行一条UPDATE语句,该语句还将更新并检查REC_TIMESTAMP值:

update "PUBLIC"."BOOK"
set    "PUBLIC"."BOOK"."TITLE" = 'New Title',"PUBLIC"."BOOK"."REC_TIMESTAMP" = timestamp '2014-09-08 18:40:39.416'
where ("PUBLIC"."BOOK"."ID" = 1 and "PUBLIC"."BOOK"."REC_TIMESTAMP" is null)

注意如何在SET子句REC_TIMESTAMP设置为当前时间,同时在WHERE子句中还将其检查为NULL (示例数据库中的初始值)。

如果我们现在有两个相互竞争的进程(或同一进程中的代码部分)进行此更新,如下所示:

BookRecord book1 = dsl.selectFrom(BOOK).where(BOOK.ID.eq(1)).fetchOne();
BookRecord book2 = dsl.selectFrom(BOOK).where(BOOK.ID.eq(1)).fetchOne();book1.setTitle("New Title");
book1.store();book2.setTitle("Another Title");
book2.store();

…然后,在对store()的第二次调用(缩短的堆栈跟踪)上,我们将见证DataChangedException

org.jooq.exception.DataChangedException: Database record has been changed or doesn't exist any longerat org.jooq.impl.UpdatableRecordImpl.checkIfChanged(UpdatableRecordImpl.java:420)at org.jooq.impl.UpdatableRecordImpl.storeUpdate(UpdatableRecordImpl.java:193)at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:129)at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:121)

乐观锁定适用于UpdatableRecord操作,包括insert()update()delete()

jOOQ支持三种乐观锁定模式:

  • 使用专用的TIMESTAMP列来跟踪修改日期
  • 使用专用的NUMBER列跟踪版本号
  • 使用价值比较。 如果没有为代码生成器配置任何时间戳或版本列,则为默认设置

翻译自: https://www.javacodegeeks.com/2015/09/perform-crud-with-active-records.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java undo_用JAVA实现Undo、Redo,Copy、Paste、Cut_java

programlover原作package clipborad;import javax.swing.JTextArea;import java.awt.datatransfer.*;import java.awt.*;import javax.swing.*;import java.io.*;import javax.swing.undo.*;http://www.gaodaima.com/64851.html用JAVA实现Undo、Redo,Copy、Paste、Cut_javaimpo…

项目管理控件Project Management Library

Project Management Library是一款项目管理控件,包含了项目管理相关的Windows客户端控件,如:ProjectView, ResourcesView, ScheduleView, StatisticsView。支持所有.NET语言,可以用于Windows桌面应用程序,具有标准的界面和操作自定义设置、拖…

maven aspectj_使用Spring AspectJ和Maven进行面向方面的编程

maven aspectjSpring框架附带AOP支持。 实际上,如Spring参考文档中所述 , “ Spring的关键组件之一是AOP框架。 尽管Spring IoC容器不依赖于AOP,这意味着您不需要使用AOP,但AOP是对Spring IoC的补充,以提供一种功能强…

ios 查询mysql数据库操作系统_iOS数据库FMDB--增删改查(模糊查询)详细介绍

简介:很早就想整理一下数据库的使用了,刚好最近接触较多,加之可以安排出空余的时间,所以瓜子我贡献出自己喝咖啡的时间整理一下FMDB的使用,以下是对FMDB的介绍以及基本使用 --- insert、delete、update、select。其中s…

java arraylist 重复_Java中ArrayList去除重复元素

Java中ArrayList去除重复元素//删除ArrayList中重复元素public static void removeDuplicate(ArrayList list) {for ( int i 0 ; i for ( int j list.size() - 1 ; j > i; j -- ) {ForCytoLevel3 jjj (ForCytoLevel3)list.get(j);ForCytoLevel3 i…

c#时间转换

转自 http://blog.csdn.net/yysyangyangyangshan/article/details/6782874最近做ASP.NET的一个项目,获取时间的时候,由于我的系统时间设置了上午和下午,结果DateTime.Now老是写不到数据库中,然后,上网查了个[csharp]vi…

SQL Server 2008 R2如何生成带数据的数据库脚本

1.对想要复制的数据库右键,“任务”,“生成脚本” 2.下面需要注意的是,默认情况下,只会生成仅架构的脚本,也就是说仅仅有表结构,而没有数据的空壳。所以需要额外的设置。 在设置脚本编写选项,选…

java saxreader_JAVA解析XML,SAXReader无法使用

写了段代码要解析XML文件。for (int p 0; p < files.length; p) {System.out.println("Dom4jxml2:333::"p);if (files[p].isFile() && files[p].getName().startsWith("CN_MT1101_")) {File f new File(files[p].getPath());System.out.print…

methodhandle_概览Java 7 MethodHandle及其用法

methodhandle由于Java的Reflection API&#xff0c;我们已经能够在运行时检查和更改程序执行。 特别是&#xff0c;我们可以在运行时观察接口/类/方法和字段&#xff0c;而无需在编译时知道它们的名称。 JDK 7为这种动态/运行时检查引入了一个新的参与者&#xff0c;即方法句柄…

quartz CronExpression表达式

一个cron表达式有至少6个&#xff08;也可能7个&#xff09;有空格分隔的时间元素。按顺序依次为1.秒&#xff08;0~59&#xff09;2.分钟&#xff08;0~59&#xff09;3.小时&#xff08;0~23&#xff09;4.天&#xff08;月&#xff09;&#xff08;0~31&#xff0c;但是你需…

java两个字符串前缀_java – 找到两个字符串的最长公共前缀

我想找到两个字符串的最长公共前缀.有没有办法循环我的最后几个if语句,以便我可以结束彼此不匹配的最后几个字符&#xff1f;System.out.println("Enter the first string: ");String s input.nextLine();System.out.println("Enter the second string: "…

Codeforces 427 D. Match amp; Catch

后缀数组.... 在两个串中唯一出现的最小公共子串 D. Match & Catchtime limit per test1 secondmemory limit per test512 megabytesinputstandard inputoutputstandard outputPolice headquarter is monitoring signal on different frequency levels. They have got two …

gwt 同步和异步_GWT Spring和Hibernate进入数据网格世界

gwt 同步和异步利用Infinispan Data Grid的功能最大化Hibernate性能。 一个GWT &#xff0c; Spring &#xff0c; JPA &#xff0c; Hibernate &#xff0c; Infinispan集成教程。 在本教程中&#xff0c;我们将讨论如何将Infinispan用作Hibernate二级缓存提供程序。 Infinis…

java分页 jar_零基础学java之javaEE,分页

【分页】一 分页1.1分页概念引入什么是分页?分页(英语&#xff1a;Paging)&#xff0c;是一种操作系统里存储器管理的一种技术&#xff0c;可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块&#xff0c;称…

查看修改MySQL字符集

查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) 转载▼标签&#xff1a; 字符集 mysql数据库 mysql字符集查看 mysql启动命令 修改mysql字符集 分类&#xff1a; 网站开发MySQL字符集多种多样…

java上传文件需要的依赖_SpringBoot使用commons-fileupload上传文件的类

网上找了一些&#xff0c;都是基本介绍&#xff0c;没有直接就可以使用类&#xff0c;在实际工作当中都有适合当前项目的上传文件的方法&#xff0c;本人写了一个类&#xff0c;比较基础&#xff0c;但呆以满足项目的上传文件功能&#xff0c;使用了commons-fileupload这个组件…

ArcGIS for Android示例解析之离线地图-----LocalTiledLayer

转自&#xff1a;http://blog.csdn.net/wozaifeiyang0/article/details/7327423 LocalTiledLayer 看到这个标题是否是很激动&#xff0c;如题&#xff0c;该示例就是添加一个离线地图&#xff0c;这应该是很多开发人员期盼已久的功能了吧&#xff0c;正式版一处这个应该是一个很…

md5 算法java实现_java实现MD5算法

import java.security.MessageDigest;/** 加密工具*author 刘彦青***/public class EncryptUtil {/** MD5加密** param jiami* 源字符串* return 加密后的字符串 */public final static String md5(String jiami) {char hexDigits[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C,…

wikioi 1017--乘积最大

给定一个数串&#xff0c;以及K&#xff0c;求对这个数串K划分的乘积最大值。 DP思路&#xff1a;一开始肯定想到的是递归&#xff0c;假设在某两个字符间有一个乘号&#xff0c;那么乘积最大就是乘号两边的区间接着划分的乘积最大值。 于是状态空间表示如下dp[i][k]表示从0~i之…

java在线找错_平台配置及测试错误提示及解决方案

平台配置错误提示及解决方案开发者在点击提交服务的时候可能会遇到以下各种各样的问题&#xff0c;本文列举出部分平台会弹出的提示&#xff0c;以便解决提交出现的问题。1、 请完成分发国家配置原因&#xff1a;未选择分发国家或未保存解决&#xff1a;在配置-发布国家中&…