php 命令执行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

php 命令执行crud

php 命令执行crud_使用活动记录执行CRUD相关推荐

  1. 使用活动记录执行CRUD

    本文是我们学院课程的一部分,标题为jOOQ –类型安全的数据库查询 . 在SQL和特定关系数据库很重要的Java应用程序中,jOOQ是一个不错的选择. 当JPA / Hibernate抽象过多,JDB ...

  2. t-sql执行结果_用于记录流程执行的T-SQL设计模式

    t-sql执行结果 介绍 (Introduction) Context 语境 Back in my days at school, I followed a course entitled " ...

  3. 用source命令执行脚本和用sh执行脚本之间的区别

    问题: 有很多方式可以执行脚本, 1).source test.bsh 2).. test.bsh 3).chmod a+x test.bsh;./test.bsh 4).sh test.bsh 它们 ...

  4. “adb不是内部或外部命令,也不是可执行的应用程序”错误原因及解决方法

    用SQLite时,可能会出现这样的错误. 原因可能是环境变量PATH没有配置或配置不正确.应该把adb.exe 所在目录加入到PATH环境变量.例如:C:\Program Files\android- ...

  5. 软件测试是采用(A)执行软件的活动,测试(Test)测试是一项采用测试用例执行软件的活动,在这.ppt...

    测试(Test)测试是一项采用测试用例执行软件的活动,在这.ppt Beta 测试是从用户角度进行的测试.( Y ) 项目立项前测试人员不需要提交任何文档. ( Y ) 单元测试能发现大部分的软件缺陷 ...

  6. php 命令执行脚本文件路径,php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法...

    在php命令行下执行.php文件时,执行环境的工作目录(getcwd( ))是php命令程序(php.exe)所在目录,所以如果想在文件内使用相对路径时,要先切换当前的工作目录才行. 小测试程序: $ ...

  7. java解析shell命令_Android中执行java命令的方法及java代码执行并解析shell命令

    这篇文章给大家介绍Android中执行java命令的方法及java代码执行并解析shell命令,需要的朋友一起学习 android中执行java命令的方法大家都晓得吗,下面一段内容给大家带来了具体解析 ...

  8. python执行的命令_如何在Python中执行外部命令

    Python子进程模块允许生成新进程,从Python脚本执行外部命令. 您可以使用这些教程来安装最新版本的Python. 此外,还有许多可用于Python IDE. 就像在Ubuntu系统上安装PyC ...

  9. linux中用at命令5分钟后执行,我使用过的Linux命令之at - 在指定时间执行一次任务...

    我使用过的Linux命令之at - 在指定时间执行一次任务 用途说明 at命令用于在指定时间执行一次任务.如果任务需要重复执行,需用crontab. atq用于打印队列中的任务,atrm用于删除任务. ...

最新文章

  1. ThinkPHP源码学习 data_to_xml函数 数据转成xml格式
  2. 计算机网络 实验六 静态路由配置,实验六-静态路由配置.doc
  3. Python3 配置文件(configparser)(转载)
  4. (( 系统的自协调与抽象而成的自动反馈
  5. 数据库系统工程师考c语言吗,2019年数据库系统工程师考点:DBMS的基本功能
  6. 移动语音引擎相关开发笔记
  7. 软件测试工程师-计算机基础
  8. 60-40-030-序列化-传统Avro序列化
  9. 4月23日 MySQL学习-DDL
  10. 《完美软件》笔记8:如何应对防卫反应
  11. POM (Project Object Model)简介
  12. MySQL5.0安装图文教程
  13. word文档保护密码忘 了,怎么取消格式和编辑保护
  14. 阿里云oss出现Unable to execute HTTP request: bucket.二级域名.域名: nodename nor servname provided, or not known
  15. 索尼最小最轻全画幅微单Alpha 7C面世
  16. 【小菜虫的学习笔记--n5x刷机root】
  17. zenmap使用方法
  18. Java实时处理 - Spring Integration - MQ Message
  19. 多线程实现4个窗口卖100张票
  20. ubuntu-20.04-desktop-amd64.iso下载/rufus-3.10.exe下载

热门文章

  1. POJ3614,P2887-Sunscreen(防晒霜)【贪心】
  2. jzoj4025-找回密码【后缀自动机】
  3. 【2018.4.7】模拟赛之六-ssl2387 树【图论,树】
  4. 【数学】Natasha, Sasha and the Prefix Sums(CF1204E)
  5. 【SAM】差异(P4248)
  6. 2018年10月17日普级B组【模拟赛】
  7. 常用公有云接入——谷歌
  8. JVM-对象的存活与死亡
  9. (十一)Spring 基础注解(对象创建相关注解、注入相关注解)
  10. C++描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 ||