一、事务

通常在 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. FRDM-MCXN947开发板之i2c应用

    介绍 MCXN947 NXP FRDM-MCXN947开发板是一款基于MCXN947 MCU的低成本评估板,MCU集成了双核Arm Cortex-M33微控制器和一个神经处理单元(NPU).开发板由一 ...

  2. 使用 OpenTelemetry 构建可观测性 04 - 收集器

    在之前的博文中,我们讨论了如何使用 SDK 和链路追踪生产者来导出进程中的遥测数据.尽管有多种类型的导出器可供选择,但其中一个常见的目标是将数据导出到 OpenTelemetry Collector. ...

  3. Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初始化方法

    Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBean, bean Map寻找方式,Java Map定义和初 ...

  4. 判断日期是否为周六周日,BigDecimal比较大小

    判断日期是否为周六周日,BigDecimal比较大小 package com.example.core.mydemo.date; import java.math.BigDecimal; import ...

  5. metal invalid pixel format xx

    这个时候要考虑CAMetalLayer.pixelFormat是否设置设置正确,虽然MTLPixelFormat有很多枚举值,但是CAMetalLayer支持的也就只有五个: MTLPixelForm ...

  6. 在Linux驱动中使用gpio子系统

    reference: https://blog.csdn.net/shiyongyue/article/details/75103446 http://blog.rongpmcu.com/gpiozi ...

  7. 化腐朽为神奇!揭开ISP图像处理的神秘面纱,基于瑞芯微RK3568J工业平台!

    ISP图像处理前后图像对比 化腐朽为神奇!经过ISP图像处理的图片前后对比是如此惊人!从下图中可以观察到,未经处理的原始图像偏绿且暗淡,而经ISP图像处理的图像能够清晰地还原现场真实的颜色细节! 图1 ...

  8. 使用flume将数据sink到HBase

    ===========>先创建Hbase表和列族<================案例1:源数据一行对应Hbase的一列存储(hbase-1.12没有问题)================ ...

  9. Java类全路径冲突解决方法

    1. 问题 今天在开发中遇到这样一个问题,A同事在导入了我们的实验SDK后,发现实验无法正常获取,查看日志发现了NoClassDefFoundError异常,无法加载的的类中逻辑比较简单,只依赖了另外 ...

  10. 随机数据下 Sqrt Tree 的平替实现

    原理 在随机数据下,把原序列分成 \(\sqrt n\) 个块,维护每个块的前缀后缀最大值,那么,在随机询问下,对于在一个块中的询问,暴力查询. 复杂度 概率 $ n ^ {-\frac{1}{2}} ...