`
pengjianbo1
  • 浏览: 232589 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

iBATIS SQL Maps

阅读更多

12.5. iBATIS SQL Maps

Spring通过 org.springframework.orm.ibatis 包来支持iBATIS SQL Maps 1.x和2.x (http://www.ibatis.com)。 与JDBC/Hibernate支持非常类似,Spring对于iBATIS的支持也采用了Template的风格,同样遵循Spring的异常体系,这些会让你喜欢上Spring的所有IoC特性。

事务管理可以由Spring标准机制进行处理。对于iBATIS来说没有特别的事务策略,除了JDBC Connection 以外,也没有特别的事务资源。 因此,Spring标准的JDBC DataSourceTransactionManager 或者 JtaTransactionManager 已经能够完全足够了。

12.5.1. iBATIS 1.x和2.x的概览与区别

Spring同时支持iBATIS SQL Maps 1.x和2.x。首先让我们先来看一下两者的区别。

两者XML配置文件有一点区别,节点和属性名有了些改动。你所要继承的Spring类和方法名也有一些区别。

Table 12.1. iBATIS SQL Maps 1.x和2.x的支持类

特性 1.x 2.x
SqlMap(Client)的创建 SqlMapFactoryBean SqlMapClientFactoryBean
Template风格的帮助类 SqlMapTemplate SqlMapClientTemplate
使用MappedStatement的回调 SqlMapCallback SqlMapClientCallback
DAO基类 SqlMapDaoSupport SqlMapClientDaoSupport

 

12.5.2. iBATIS SQL Maps 1.x

12.5.2.1. 创建SqlMap

使用iBATIS SQL Maps包括创建一个SqlMap配置文件来定义sql语句和结果映射。Spring会通过 SqlMapFactoryBean 来加载并处理这些配置。

public class Account {

    private String name;
    private String email;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return this.email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

假设我们要映射这个类,我们需要创建如下的 SqlMap。通过使用查询,稍后我们可以用email地址来查找对应的用户。Account.xml 如下:

<sql-map name="Account">

  <result-map name="result" class="examples.Account">
    <property name="name" column="NAME" columnIndex="1"/>
    <property name="email" column="EMAIL" columnIndex="2"/>
  </result-map>

  <mapped-statement name="getAccountByEmail" result-map="result">
    select ACCOUNT.NAME, ACCOUNT.EMAIL
    from ACCOUNT
    where ACCOUNT.EMAIL = #value#
  </mapped-statement>

  <mapped-statement name="insertAccount">
    insert into ACCOUNT (NAME, EMAIL) values (#name#, #email#)
  </mapped-statement>

</sql-map>

定义完Sql Map之后,我们需要创建一个iBATIS的配置文件(sqlmap-config.xml):

<sql-map-config>

  <sql-map resource="example/Account.xml"/>

</sql-map-config>

iBATIS会从CLASSPATH加载资源,所以要确保 Account.xml 在CLASSPATH下。

通过Spring,我们可以非常容易的使用 SqlMapFactoryBean 来创建SqlMap:

<beans>

  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
  </bean>

  <bean id="sqlMap" class="org.springframework.orm.ibatis.SqlMapFactoryBean">
    <property name="configLocation" value="WEB-INF/sqlmap-config.xml"/>
  </bean>

  ...
</beans>

12.5.2.2. 使用 SqlMapTemplateSqlMapDaoSupport

SqlMapDaoSupport 类是一个类似于 HibernateDaoSupportJdoDaoSupport 的支持类。我们来实现一个DAO:

public class SqlMapAccountDao extends SqlMapDaoSupport implements AccountDao {

    public Account getAccount(String email) throws DataAccessException {
        return (Account) getSqlMapTemplate().executeQueryForObject("getAccountByEmail", email);
    }

    public void insertAccount(Account account) throws DataAccessException {
        getSqlMapTemplate().executeUpdate("insertAccount", account);
    }
}

正如你所看到的,我们使用预先配置好的 SqlMapTemplate 来执行查询。 Spring在创建 SqlMapAccountDao 的时候已经使用 SqlMapFactoryBean 为我们初始化了 SqlMap,如下所示一切都准备就绪了。 注意在iBATIS SQL Maps 1.x里面,JDBC DataSource 通常都是DAO中指定的。

<beans>
  ...

  <bean id="accountDao" class="example.SqlMapAccountDao">
    <property name="dataSource" ref="dataSource"/>
    <property name="sqlMap" ref="sqlMap"/>
  </bean>

</beans>

注意 SqlMapTemplate 实例是可以手工创建的,通过传入 DataSource,并把 SqlMap 作为构造函数参数进行创建。 SqlMapDaoSupport 的基类已经预先替我们初始化了一个 SqlMapTemplate 实例了。

12.5.3. iBATIS SQL Maps 2.x

12.5.3.1. 创建SqlMapClient

如果我们希望使用iBATIS 2.x来映射刚才的那个Account类,则需要创建这样一个SQL map Account.xml

<sqlMap namespace="Account">

  <resultMap id="result" class="examples.Account">
    <result property="name" column="NAME" columnIndex="1"/>
    <result property="email" column="EMAIL" columnIndex="2"/>
  </resultMap>

  <select id="getAccountByEmail" resultMap="result">
    select ACCOUNT.NAME, ACCOUNT.EMAIL
    from ACCOUNT
    where ACCOUNT.EMAIL = #value#
  </select>

  <insert id="insertAccount">
    insert into ACCOUNT (NAME, EMAIL) values (#name#, #email#)
  </insert>

</sqlMap>

iBATIS 2的配置文件有了一些改变(sqlmap-config.xml):

<sqlMapConfig>

  <sqlMap resource="example/Account.xml"/>

</sqlMapConfig>

记住iBATIS从CLASSPATH下加载资源,所以必须确保 Account.xml 在CLASSPATH下。

我们可以使用Spring application context中的 SqlMapClientFactoryBean。 注意iBATIS SQL Map 2.x中,JDBC DataSource 通常由 SqlMapClientFactoryBean 指定,并开启了延迟加载。

<beans>

  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
  </bean>

  <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation" value="WEB-INF/sqlmap-config.xml"/>
    <property name="dataSource" ref="dataSource"/>
  </bean>

  ...
</beans>

12.5.3.2. 使用 SqlMapClientTemplateSqlMapClientDaoSupport

SqlMapClientDaoSupport 提供了类似 SqlMapDaoSupport 的功能。我们可以继承它来实现我们自己的DAO:

public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {

    public Account getAccount(String email) throws DataAccessException {
        return (Account) getSqlMapClientTemplate().queryForObject("getAccountByEmail", email);
    }

    public void insertAccount(Account account) throws DataAccessException {
        getSqlMapClientTemplate().update("insertAccount", account);
    }
}

我们可以在application context中创建了 SqlMapAccountDao 并且注入 SqlMapClient 实例,这样我们就可以在DAO中使用预先配置的 SqlMapClientTemplate 来执行查询了:

<beans>
  ...

  <bean id="accountDao" class="example.SqlMapAccountDao">
    <property name="sqlMapClient" ref="sqlMapClient"/>
  </bean>

</beans>

注意 SqlMapTemplate 实例也可以手工创建,使用 SqlMapClient 作为构造函数参数。 SqlMapClientDaoSupport 基类为我们预先初始化了一个 SqlMapClientTemplate 实例。

SqlMapClientTemplate 还提供了一个通用的 execute 方法,将用户自定义的 SqlMapClientCallback 的实现作为参数。举例来说,这可以实现批量操作:

public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {
    ...

    public void insertAccount(Account account) throws DataAccessException {
        getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
            public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
                executor.startBatch();
                executor.update("insertAccount", account);
                executor.update("insertAddress", account.getAddress());
                executor.executeBatch();
            }
        });
    }
}

一般来说,任何由 SqlMapExecutor API提供的操作组合都以这样的回调形式被使用。 而在这个过程中产生的任何 SQLException 都将被自动地转化为Spring的通用的 DataAccessException 异常体系。

12.5.3.3. 基于原生的iBATIS API的DAO实现

你也可以基于原生的iBATIS API来编程,而无需对Spring产生任何依赖。直接使用注入的 SqlMapClient。 一个相应的DAO实现类看上去就像下面这样:

public class SqlMapAccountDao implements AccountDao {

    private SqlMapClient sqlMapClient;

    public void setSqlMapClient(SqlMapClient sqlMapClient) {
        this.sqlMapClient = sqlMapClient;
    }

    public Account getAccount(String email) {
        try {
            return (Account) this.sqlMapClient.queryForObject("getAccountByEmail", email);
        }
        catch (SQLException ex) {
            throw new MyDaoException(ex);
        }
    }

    public void insertAccount(Account account) throws DataAccessException {
        try {
            this.sqlMapClient.update("insertAccount", account);
        }
        catch (SQLException ex) {
            throw new MyDaoException(ex);
        }
    }
}

在这种情况下,由iBATIS API抛出的 SQLException 异常需要以用户自定义的方式进行处理:通常封装成为你的应用程序自身的DAO异常。 在application context中进行的整合看上去依然像以前一样,这是由于基于原生的iBATIS的DAO依然遵循IoC的模式:

<beans>
  ...

  <bean id="accountDao" class="example.SqlMapAccountDao">
    <property name="sqlMapClient" ref="sqlMapClient"/>
  </bean>

</beans>
分享到:
评论

相关推荐

    iBATIS SQL Maps指导

    《iBATIS SQL Maps指导》是一份详细的文献,旨在引导读者了解如何使用iBATIS SQL Maps这一Java持久层框架。iBATIS是一个轻量级的数据访问框架,它允许开发者将SQL语句直接写在XML配置文件中,从而实现对象与数据库的...

    iBATIS SQL Maps开发指南

    ### iBATIS SQL Maps开发指南知识点详述 #### 一、引言 iBATIS SQL Maps 是一个开源项目,提供了一种简化的方式用于处理 Java 应用程序与关系型数据库之间的交互。它通过使用简单的 XML 配置文件来定义 SQL 映射...

    iBATIS SQL Maps官方中文教程.rar

    iBATIS SQL Maps官方中文教程是一份非常宝贵的资源,它为初学者和进阶开发者提供了深入理解iBATIS SQL Maps的途径。iBATIS是一个Java框架,它将应用程序的业务逻辑与数据库操作分离,简化了数据访问层的开发。SQL ...

    iBATIS SQL Maps 入门教程.rar

    iBATIS SQL Maps 是一款优秀的数据持久层框架,它为Java开发者提供了强大的SQL映射功能,使得数据库操作变得更加简单和灵活。本入门教程将引导您逐步掌握iBATIS的核心概念和使用方法,让数据库交互不再成为开发过程...

    iBATIS SQL Maps官方中文教程(PDF)

    iBATIS SQL Maps官方中文教程是一份详细的指南,旨在帮助开发者深入理解和熟练使用iBATIS框架中的SQL Maps API。这份教程涵盖了iBATIS的核心概念、功能以及如何在实际项目中应用这些技术。以下是对这份教程内容的...

    IBATIS SQL Maps开发指北

    **IBATIS SQL Maps开发指北** IBATIS(Integrated Business Applications With IT)是一个轻量级的Java数据访问框架,它允许开发者将SQL语句直接嵌入到Java代码中,从而实现了数据库操作与业务逻辑的分离。SQL Maps...

    iBatis SQL Maps开发指南.pdf

    ### iBatis SQL Maps开发指南知识点总结 #### 1. SQL Maps 概念与工作原理 - **概念**:iBatis SQL Maps 是一个开源框架,用于简化Java应用程序中的数据库操作。它通过XML配置文件来定义数据库操作逻辑,从而减少了...

    iBATIS SQL Maps入门教程.rar

    iBATIS SQL Maps入门教程是针对数据库操作的一个经典学习资源,尤其适合初学者。iBATIS是一个开源的Java框架,它允许程序员将SQL语句直接嵌入到Java代码中,以此来简化数据库访问层的开发。这个教程可能包含了以下几...

    iBATIS SQL Maps開發指南(中文)

    此外,iBATIS-SqlMaps-2_cn.pdf这份文档可能涵盖了iBATIS的安装、配置、最佳实践以及常见问题的解决方案等内容。学习这份指南,开发者能够更好地理解和运用iBATIS,提升数据库操作的效率和代码的可读性,从而优化...

    iBATIS SQL Maps官方中文教程

    iBATIS SQL Maps官方中文教程是一份非常宝贵的资源,尤其对于初学者而言,它提供了深入理解iBATIS框架的详细指南。iBATIS是Java世界里一个流行的数据访问框架,它将SQL语句与Java代码分离,使得应用程序的数据库层更...

    iBATIS SQL Maps示例代码

    在"iBATIS SQL Maps示例代码"中,我们可以深入理解以下几个关键知识点: 1. **SQL映射文件**:iBATIS的核心是SQL映射文件,它定义了如何将Java方法与SQL语句关联起来。在XML配置文件中,你可以看到`&lt;sqlmap&gt;`元素,...

    IBATIS SQL Maps 入门教程.pdf

    **IBatis SQL Maps 入门教程** 在Java Web开发领域,数据访问层的实现往往是一个重要的环节。Ibatis,作为一个轻量级的持久层框架,为开发者提供了灵活的SQL映射机制,使得数据库操作变得更加简单。这篇入门教程将...

    iBATIS-SqlMaps-2_cn.pdf

    《iBATIS-SqlMaps-2_cn.pdf》是关于iBATIS SQL Maps的中文版文档,它详尽地阐述了如何使用SQL Maps来构建数据库驱动的Java应用。iBATIS是一个开源的Java库,它的核心功能是简化Java应用程序与数据库之间的交互,尤其...

    ibatis 开发指南 和 iBATIS-SqlMaps两本图书

    《iBATIS 开发指南》和《iBATIS-SqlMaps》是两本关于Java开发领域中的重要框架——iBATIS的权威指南。这两本书详细介绍了如何使用iBATIS进行数据库交互,帮助开发者深入理解并熟练掌握这一持久层框架。 iBATIS,...

Global site tag (gtag.js) - Google Analytics