一、事务

通常在 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. Python中多线程的简单使用

    from threading import Timer import time def run1(): print(1) print(2) print(3) def run2(): print(&qu ...

  2. this的二种使用方式

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

  3. INFINI Console 与华为鲲鹏完成产品兼容互认证

    何为华为鲲鹏认证 华为鲲鹏认证是华为云围绕鲲鹏云服务(含公有云.私有云.混合云.桌面云)推出的一项合作伙伴计划,旨在为构建持续发展.合作共赢的鲲鹏生态圈,通过整合华为的技术.品牌资源,与合作伙伴共享商 ...

  4. MYSQL 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:未将对象引用设置到对象的实例。

    一: 中文提示 : 连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:未将对象引用设置到对象的实例.DbType="MySql";ConfigId=&quo ...

  5. 2 分钟,搞懂 SLO 最佳实践

    本文是<SRE,Google运维解密>读书笔记,连载第三篇.微信公众号修改了推文逻辑,尤其是 iOS,建议对本公众号 SRETalk 加星标,以免错过后续系列推文. 本文介绍 SLO,曾经 ...

  6. 《Android开发卷——程序自动登录》

    Android程序的自动登录功能 因为是公司的项目,所以这里不方便说出项目名称,这里就说我在做这个项目中用到的一些功能或者叫技术问题吧. 咱们经常用的Android程序中有一个情况,就是当你第一次注册 ...

  7. js金额格式化

    function fmoney(s, n) //s:传入的float数字 ,n:希望返回小数点几位 { n = n > 0 && n <= 20 ? n : 2; s = ...

  8. es语法 rest api 模拟query 根据中文姓名搜索demo

    es语法 rest api 模拟query 根据中文姓名搜索demo order_info_es/_doc/40094182abc GET order_info_es/_settings?pretty ...

  9. spring使用RedisCacheManager管理key的一些问题

    spring可以很好地管理各种内存的快速缓存. 这些常见的内存缓存库实现方式有redis,Ehcache. 本文阐述的是redis,毕竟这个东西相当容易使用. spring通过 org.springf ...

  10. Freertos学习:05-内核控制

    --- title: rtos-freertos-05-kernel-control date: 2020-06-22 11:10:19 categories: tags: - kernel - fr ...