一、事务

通常在 Java ORM 中有一个显式连接或管理器对象(JPA 中的 EntityManager,Hibernate 中的 SessionManager 等)。

ActiveJDBC 中没有这样的对象。

下面是一个没有事务管理的最基本的 ActiveJDBC 应用程序示例:

public static void main(String[] args) {
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/test", "the_user", "the_password");
Employee e = new Employee();
e.set("first_name", "John");
e.set("last_name", "Doe");
e.saveIt();
Base.close();
}

该调用Base.open()打开一个连接并将其附加到当前线程。

所有模型的所有后续方法都重用此连接。、

该调用Base.close()关闭连接并将其从当前线程中删除。

事务API

?到目前为止一切顺利,但要进行交易。

ActiveJDBC 确实提供了一些与事务相关的便利调用:

开始交易:

Base.openTransaction();

提交交易:

Base.commitTransaction();

并回滚:

Base.rollbackTransaction();

所有这些方法都简单地调用java.sql.Connection.setAutocommit(false),java.sql.Connection.commit()java.sql.Connection.rollback()分别在 INFO 级别包装异常和记录事件。

正如您所看到的,ActiveJDBC 在这里并没有尝试做太多事情,只是想不碍事。

如果您需要更精细的控制,您可以获取当前连接并对其执行纯 JDBC 操作:

java.sql.Connection con = Base.connection();
con.setAutocommit(false);
...//or:
Base.connection().setAutocommit(false);

事务完整事例:

一个使用事务的简单程序如下所示:

public static void main(String[] args) {
try{
Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/test", "the_user", "the_password");
Base.openTransaction();
Employee e = new Employee();
e.set("first_name", "John");
e.set("last_name", "Doe");
e.saveIt();
Base.commitTransaction();
catch(Exception e){
Base.rollbackTransaction();
}finally{
Base.close();
}
}

和JNDI组合:

但是通常情况下,连接是从容器池中请求的,而事务配置已经由容器配置提供。

在这些情况下,用法是相同的(几乎),但您必须意识到某些调用可能不会成功,或者驱动程序可能会产生意想不到的副作用。

例如,如果您从池中请求连接,则事务可能会在那时开始,并且在您调用时:

Base.connection().setAutocommit(true/false);

,您可能会不小心提交正在进行的事务(?或者驱动程序将忽略您的调用并且什么也不做)。

ActiveJDBC 并没有在 J2EE 和 JDBC 已经提供的东西上添加任何特殊的东西。

以下是 MessageDriven Bean (JMS) 中使用的 ActiveJDBC 示例:

public void onMessage(Message m){
Base.open("myConnectionJNDIName");
TextMessage tm = (TextMessage)m;
String content = tm.getText();
String name = tm.getStringProperty("name");
try{
Article.create("name", name, "content", content).saveIt();
}
catch(Exception e){
ctx.setRollbackOnly(); // == this will send the message back into queue
}
finally{
Base.close();//always close connection
}
}

在上面的示例中,容器将管理事务。它将同时回滚:JDBC 和 JMS 事务。

二、IN条件的特殊处理

在某些情况下,您需要编写如下内容:

SELECT my_column FROM my_table where search_column IN (?)

不幸的是,JDBC 不支持此功能,因此我们有如下解决方法:Preparedstatement IN 子句替代方案/StackOverflow

 

IN子句解决方法

解决方法很简单,如果你想执行这个:

String sql = "name IN ('John', 'Hellen', 'Henry')";

然后你用单引号和逗号加入这个列表:

List names = Collections.list("John", "Hellen", "Henry");
List<Person> people = Person.where("name IN ('" + Util.join(names, "', '") + "')");

您可以将此方法用于相对较小的列表,因为列表越大,生成的查询越长。每个数据库对查询的大小都有限制,因此您的里程可能会有所不同。

请参阅对Util#joinCollections#list方法的引用。这些类已经在每个 ActiveJDBC 应用程序的类路径上。

【ActiveJdbc】05的更多相关文章

  1. 【C】 05 - 声明和定义

    仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里 ...

  2. 【二叉查找树】05根据升序的链表构造二叉查找树【Convert Sorted List to Binary Search Tree】

    利用递归,构造二叉查找树, ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 给一个 ...

  3. 【SpringCloud】05.Eureka的高可用

    1.简单情况 2.为了达到Eureka的高可用,可以多个Eureka互相注册. 3.我们需要修改两处: Eureka Client Eureka Server 3.1 Eureka Client 在C ...

  4. 【SpringBoot】05.SpringBoot整合Listener的两种方式

    SpringBoot整合Listener的两种方式: 1.通过注解扫描完成Listener组件的注册 创建一个类实现ServletContextListener (具体实现哪个Listener根据情况 ...

  5. 【scikit-learn】06:make_blobs聚类数据生成器

      版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/kevinelstri/article/ ...

  6. 【博客美化】05.添加GitHub链接

    博客园美化相关文章目录: [博客美化]01.推荐和反对炫酷样式 [博客美化]02.公告栏显示个性化时间 [博客美化]03.分享按钮 [博客美化]04.自定义地址栏logo [博客美化]05.添加Git ...

  7. 【WCF--初入江湖】05 WCF异步编程

    05 WCF异步编程 一.服务设计最佳实践 在设计之初,是否用异步,应该由客户端来决定,而不应该去考虑服务的调用者调用的方式. 优点:充分利用多核CPU, 改善用户体验 缺点:滥用异步,会影响性能 二 ...

  8. 【FLUENT案例】05:DDPM模型

    本例利用FLUENT的DDPM模型对提升管进行模拟. 1 介绍 本案例演示在FLUENT中利用稠密离散相模型(Dense discrete phase model,DDPM)模拟2D提升管.DDPM模 ...

  9. 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  10. 【VB编程】05.MsgBox与InputBox函数

    在VBA程序中,数据的输入输出是通过函数实现的,其实现的方式是通过对话框的形式表示出来的.例如MsgBox,Inputbox等,不要误认为是输入输出语句的关键字,其实仅仅是一个普通函数而已. [Msg ...

随机推荐

  1. c# 拖拽列表顺序 | 拖拽合并分组 | 移除分组功能

    动图演示: 背景: 一开始做功能的时候没有增加排序的索引(sort-index),后来要求做拖拽排序功能:所以写了这个不需要初始排序就可以完成的拖拽功能:如果是table表格排序逻辑和这个相似,这里拿 ...

  2. this的二种使用方式

    package com.ht.TestThis; public class TestThisKey { public static void main(String[] args) { // TODO ...

  3. 喜讯!INFINI Easysearch 在墨天轮数据库排名中挺进前30!

    近日,2023 年 10 月的 墨天轮中国数据库流行度排行 火热出炉,本月共有 283 个数据库参与排名,中国数据库行业竞争日益激烈.其中,极限科技旗下软件产品 INFINI Easysearch 稳 ...

  4. .net6 asp.net core mvc 中使用NLog ILogger

    1.用VS2022新建一个.NET6 MVC项目. 2.使用nuget引用NLog.Extensions.Logging. 3.项目中新建一个NLog.config配置文件,右键属性设置为" ...

  5. The requested operation cannot be completed because the connection has been broken

    具体报错 The requested operation cannot be completed because the connection has been broken. -- xxxForyy ...

  6. 安装并使用 openssl 生成证书

    1. 安装 openssl参考链接: OpenSSL加密算法库使用系列教程_openssl算法哭调用-CSDN博客 安装包下载地址: 安装包下载地址(正常情况需要将 openssl 源码下载后, 自己 ...

  7. spring mvc GET请求方式及传参

    spring mvc GET请求方式及传参 @Api(tags = "管理接口") @Slf4j @RestController @RequestMapping("/my ...

  8. FinalReference 如何使 GC 过程变得拖拖拉拉

    本文基于 OpenJDK17 进行讨论,垃圾回收器为 ZGC. 提示: 为了方便大家索引,特将在上篇文章 <以 ZGC 为例,谈一谈 JVM 是如何实现 Reference 语义的> 中讨 ...

  9. 张高兴的 MicroPython 入门指南:(一)环境配置、Blink、部署

    目录 什么是 MicroPython 环境配置 硬件部分 软件部分 Hello World! Blink Pico 的引脚 常见电子元件 面包板 跳线 开关 发光二极管 电阻 使你的 Pico 闪烁 ...

  10. IEC61850方案分享,基于全志、瑞芯微国产平台实现!

    什么是IEC61850协议? IEC61850是一种用于在电力自动化系统中进行数据交换和控制的通信协议.它定义了一种标准化的通信和数据模型,以支持设备和系统之间的数据交换和互操作性. IEC61850 ...