SQL Map API 力求简洁。它为程序员提供 4 种功能:配置一个 SQL Map,执行 SQL update操作,执行查询语句以取得一个对象,以及执行查询语句以取得一个对象的 List。

  • 配置 SQL Map

一旦您创建了 SQL Map XML 定义文件和 SQL Map 配置文件,配置 SQL Map 就是一件 极其简单的事情。SQL Map 使用 XmlSqlMapClientBuilder 来创建。这个类有一个静态方法 叫 buildSqlMap。方法 buildSqlMap 简单地用一个 Reader 对象为参数,读入 sqlMap-config.xml 文件(不必是这个文件名)的内容。

 String resource = “com/ibatis/example/sqlMap-config.xml”;
Reader reader = Resources.getResourceAsReader (resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMap(reader);
  • 事务处理

    缺省情况下 ,调用 SqlMapClient  对象的任 意 executeXxxx() 方法将 缺省地自 动 COMMIT/ROLLBACK。这意味着每次调用 executeXxxx()方法都是一个独立的事务。这确实 很简单,但对于需要在同一个事务中执行多个语句的情况(即只能同时成功或失败),并不 适用。这正是事务处理要关心的事情。

    如果您在使用 Global Transaction(在 SQL Map 配置文件中设置),您可以使用自动提交 并且可以得到在同一事务中执行的效果。但为了提高性能,最好是明确地划分事务的范围, 因为这样做可以减少连接池的通讯流量和数据库连接的初始化。

    SqlMapClient 对象拥有让您定义事务范围的方法。使用下面 SqlMapClient 类的方法,可 以开始、提交和/或回退事务:

     public void startTransaction () throws SQLException 
     public void commitTransaction () throws SQLException
    public void endTransaction () throws SQLException

    开始一个事务,意味着您从连接池中得到一个连接,打开它并执行查询和更新 SQL 操 作。使用事务处理的例子如下:

     private Reader reader = new Resources.getResourceAsReader( "com/ibatis/example/sqlMapconfig.xml");
    private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);
    public updateItemDescription (String itemId, String newDescription) throws SQLException {
    try {
    sqlMap.startTransaction ();
    Item item = (Item) sqlMap.queryForObject ("getItem", itemId);
    item.setDescription (newDescription); sqlMap.update ("updateItem", item); sqlMap.commitTransaction ();
    } finally { sqlMap.endTransaction (); } }

    注意!事务不能嵌套。在调用 commit()或 rollback()之前,从同     一线程多次调用.startTransaction,将引起抛出例外。换句话说,对于每个 SqlMap 实例,每个线程最多只能打开一个事务。

    注意!SqlMapClient 事务处理使用 Java 的 ThreadLocal 保存事务对象。这意味着在处理 事务时,每个调用 startTransaction()的线程,将得到一个唯一的 Connection 对象。将一个 Connection  对象返回数据源(或关闭连接)唯一的方法是调用 commitTransaction()或 rollbackTransaction()方法。否则,会用光连接池中的连接并导致死锁。

  • 自动的事务处理

    虽然极力推荐使用明确划分的事务范围,在简单需求(通常使只读)的情况下,可以使 用简化的语法。如果您没有使用 startTransaction(),commitTransation()和 rollbackTransaction()方法来明确地划分事务范围,事务将会自动执行。例如:

     private Reader reader = new Resources.getResourceAsReader
    
     ("com/ibatis/example/sqlMapconfig.xml");
    
     private SqlMapClient sqlMap = XmlSqlMapBuilder.buildSqlMap(reader);
    
     public updateItemDescription (String itemId, String newDescription) throws SQLException {
    
     try {
    
     Item item = (Item) sqlMap.queryForObject ("getItem", itemId);
    
     item.setDescription (“TX1”);
    
     //No transaction demarcated, so transaction will be automatic (implied)
    
     sqlMap.update ("updateItem", item); item.setDescription (newDescription); item.setDescription (“TX2”);
    //No transaction demarcated, so transaction will be automatic (implied) sqlMap.update("updateItem", item); } catch (SQLException e) { throw (SQLException) e.fillInStackTrace(); } }

    注意!使用自动事务处理要非常小心。虽然看起来很有吸引力,但如果有多个数据更新操作要在同一事务中处理时,您会遇到麻烦。在上面的例子中,如果第二个“updateItem”操作失败,第一个“updateItem”操作仍然会执行,description 会更新成“TX1”。

  • 全局(分布式)事务

    SQL Map 框架支持全局事务。全局事务也叫分布式事务,它可以允许您在同一事务中 更新多个数据库(或其他符合 JTA 规范的资源),即同时成功或失败。

    * External/Programmatic Global  事务

    您可以选择外部管理或手工编程管理全局事务,或实现一个象 EJB 一样的架构。使用 EJB,您可以通过使用 EJB 的描述文件定义事务范围。要支 持外部管理或手工编程管理全局事务,必须在 SQL Map 配置文件中(参见前面章节的内容) 设定<transactionManager>的 type 属性为 EXTERNAL。使用外部管理的全局事务,SQL Map 事务控制方法变得有的多余,因为事务的开始、提交和回退都由外部的事务管理器来控制。 但是,使用 SqlMapClient 的 startTransaction(),commitTransaction()或 rollbackTransaction()来划分事务范围(相对于自动的事务处理),还是对提高性能有帮助。继续使用这些方 法,可以保持编程规范的一致性。另一个好处是,在某些情况下,您可能需要改变关闭资源 的顺序(不幸的是,不同的应用服务器和事务管理器具有不同的规则)。除了这些考虑,要 使用全局事务,不需要改变您的 SQL Map 代码。

    * 受管理的(Managed)全局事务

    SQL Map 框架也可以为您管理全局事务。要支持受管理的全局事务,必须在 SQL Map 配置文件中设定<transactionManager>的 type 属性为 JTA,并设定“UserTransaction”属性为 JNDI 的全名,以使 SqlMapClient 实例能找到 UserTransaction 对象。

    使用全局事务编程,代码没有多大的不同,但有几个小小的地方要注意。例如:

     try {
    
     orderSqlMap.startTransaction(); storeSqlMap.startTransaction(); orderSqlMap.insertOrder(…); orderSqlMap.updateQuantity(…);
    
     storeSqlMap.commitTransaction();
    
     orderSqlMap.commitTransaction();
    
     } finally {
    
     try {
    
     storeSqlMap.endTransaction()
    
     } finally {
    
     orderSqlMap.endTransaction()
    
     }
    
     }

    上面的例子中,假设我们通过两个 SqlMapClient 来使用两个不同的数据库。第一个开始事务的 SqlMapClient(orderSqlMap)同时也开始了一个全局事务。在这之后,所有其他的操作将被看作是这个全局事务的一部分,直到同一个 SqlMapClient(orderSqlMap)调用 commitTransaction()或 rollbackTransaction(),届时全局事务被提交并完成其他所有的操 作。

    警告!虽然这些看起来很简单,但记住不要滥用全局(分布式)事务,这点很重要。这 样做既有性能方面的考虑,同时也是因为全局事务会让应用服务器和数据库驱动程序的设置 变得更复杂。虽然看起来简单,您可能还是会遇到一些困难。

  • 批处理

    如果要执行很多非查询(insert/update/delete)的语句,您可能喜欢将它们作为一个批处 理来执行,以减少网络通讯流量,并让 JDBC Driver 进行优化(例如压缩)。SQL Map API 使用批处理很简单,可以使用两个简单的方法划分批处理的边界:

     sqlMap.startBatch();
    //…execute statements in between
    sqlMap.executeBatch();

    当调用 endBatch()方法时,所有的批处理语句将通过 JDBC Driver 来执行。

Ibatis学习总结6--使用 SQL Map API 编程的更多相关文章

  1. Ibatis学习总结7--SqlMapClient 执行 SQL 语句

    SqlMapCient 类提供了执行所有 mapped statement 的 API.这些方法如下: public int insert(String statementName, Object p ...

  2. Ibatis学习总结3--SQL Map XML 映射文件

    在前面的例子中,只使用了 SQL Map 最简单的形式.SQL Map 的结构中还有其他更多 的选项.这里是一个 mapped statement 较复杂的例子,使用了更多的特性. <sqlMa ...

  3. Ibatis学习总结1--ibatis简介和SQL Maps

    最佳维护的一个项目使的是ibatis框架,在闲暇之余将手头的开发手册和平时开发的理解做一下总结,言归正传. 简介 使用 SQL Map,能够大大减少访问关系数据库的代码.SQL Map 使用简单的 X ...

  4. Ibatis学习总结5--动态 Mapped Statement

    直接使用 JDBC 一个非常普遍的问题是动态 SQL.使用参数值.参数本身和数据列都 是动态的 SQL,通常非常困难.典型的解决方法是,使用一系列 if-else 条件语句和一连串 讨厌的字符串连接. ...

  5. Ibatis学习总结2--SQL Map XML 配置文件

    SQL Map 使用 XML 配置文件统一配置不同的属性,包括 DataSource 的详细配置信息, SQL Map 和其他可选属性,如线程管理等.以下是 SQL Map 配置文件的一个例子: Sq ...

  6. Ibatis学习总结4--SQL Map XML 映射文件扩展

    SQL Map XML 映射文件除了上文提到的属性还有一些其他重要的属性,下文将详细介绍这些属性. 缓存 Mapped Statement 结果集 通过在查询 statement 中指定 cacheM ...

  7. ibatis 的 "This SQL map does not contain a MappedStatement"的错误

    This SQL map does not contain a MappedStatement named List 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有 ...

  8. 【web开发学习笔记】ibatis学习总结

    ibatis学习总结 ibatis数据库配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCT ...

  9. ibatis 学习笔记 3 - pfpfpfpfpf的专栏 - 博客频道 - CSDN.NET

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

随机推荐

  1. 嵌入式开发板iTOP4412学习开发板

    网站:http://www.topeetboard.com 淘宝:https://item.taobao.com/item.htm?_u=okcahs0f42a&id=38712193806 ...

  2. [转载]ExtJs4 笔记(3) Ext.Ajax 对ajax的支持

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)     本篇主要介绍一下ExtJs常用的几个对JS语法的扩展支持,包括Ajax封装,函数事 ...

  3. Daikon Forge GUI 制作图集和字体集

    Daikon Forge GUI 制作UI面板 在上次的学习中制作了一个简单的面板,下面来学习制作图集以及字体. 1.DF-GUI 图集(Atlas)制作 操作步骤 选中UI Root根节点,在Sce ...

  4. Java虚拟机工作原理详解 (一)

    一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 javac YourClassNam ...

  5. ES6严格模式use strict下的保留字

    implements interface let package private protected public static yield

  6. 06Spring_使用注解配置bean对象

    Spring注解开发需要jar包 和 xml开发 一样的 ! 第一步: 新建项目, 导入jar包(就是前一篇文章里面的那几个核心jar包) 第二步: 在需要spring创建对象类上面 添加@Compo ...

  7. shell小结

    一 判断 -d 测试是否为目录.-f 判断是否为文件. -s 判断文件是否为空 如果不为空 则返回0,否则返回1 -e 测试文件或目录是否存在. -r 测试当前用户是否有权限读取. -w 测试当前用户 ...

  8. C语言 位运算

    1G=1024M; 1M=102KB; 1KB=1024B(字节); 1B=8bits(位); #include<stdio.h> #include<stdlib.h> //C ...

  9. fenghuangscannerV3 EXE版本

    作者wils0n未给出EXE版本,鼓捣了下: 1.安装pyinstaller 2.fenghuangscanner目录防止pyinstaller下 3. pyinstaller.py --consol ...

  10. 浅谈VC++中预编译的头文件放那里的问题分析

    用C++写程序,肯定要用预编译头文件,就是那个stdafx.h.不过我一直以为只要在.cpp文件中包含stdafx.h 就使用了预编译头文件,其实不对.在VC++中,预编译头文件是指放到stdafx. ...