IBatis 和 spring

Spring IBatis 提供了完善的内建支持。使用 Spring 提供的 IBatis 辅助类,可以大大简化原有的 IBatis 访问代码。这些辅助类位于 org.springframework.orm.ibatis 包下,目前 Spring 可同时支持 IBatis1.3.x 2.0 此外,针对 IBatis Spring 也提供了和 JdbcTemplate 一致的异常处理方式

10.3.1         标准 JavaBean 实体和映射

Spring 宠物店非常典型的展现了 Spring IBatis 的整合,下文将围绕宠物店展开介绍。

首先来看宠物店中的一个领域对象(它是一个标准的 JavaBean )和它的映射文件,如代码 10.13~10.14 所示。

代码 10.13  Product.java

 

public class Product implements Serializable {

  private String productId;

  private String categoryId;

  private String name;

  private String description;

  省略 getter/setter...

}

 

代码 10.14  Product.xml

 

<sqlMap namespace="Product">

  ...

  <resultMap id="result"

 class="org.springframework.samples.jpetstore.domain.Product">

    <result property="productId" column="productid" columnIndex="1"/>

    ...

  </resultMap>

  <select id="getProduct" resultMap="result">

    select productid, name, descn, category from product where productid = #value#

  </select>

  <select id="getProductListByCategory" resultMap="result">

    select productid, name, descn, category from product where category = #value#

  </select>

    ...

</sqlMap>

 

10.3.2   衔接 IBatis 配置和 DAO 实现

接着给出 IBatis 的基本配置文件,如代码 10.15 所示。

代码 10.15  sql-map-config.xml

 

<sqlMapConfig>

  ...

  <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Product.xml "/>

  ...

</sqlMapConfig>

在宠物店中,该文件仅包含了所有领域对象的映射文件,而挪走了关于 IBatis 的事务和数据源配置(即 IBatis 配置文件中的 transactionManager 元素和它的子元素 dataSource )。

注意: 在稍后将要给出的 Spring 配置文件中接手了这些配置,这是一个整合点。

在宠物店中,持久和数据访问都是通过 DAO 来实现的。对于 Product ,存在一个与其对应的 SqlMapProductDao ,如代码 10.16 所示。

代码 10.16  SqlMapProductDao.java

package org.springframework.samples.jpetstore.dao.ibatis;

 

import java.util.ArrayList;

import java.util.List;

import java.util.StringTokenizer;

 

import org.springframework.dao.DataAccessException;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import org.springframework.samples.jpetstore.dao.ProductDao;

import org.springframework.samples.jpetstore.domain.Product;

 

public class SqlMapProductDao

  extends SqlMapClientDaoSupport

  implements ProductDao {

  public List getProductListByCategory(String categoryId)

    throws DataAccessException {

    return getSqlMapClientTemplate().queryForList ("getProductListByCategory",

 categoryId);

  }

  public Product getProduct(String productId)

    throws DataAccessException {

    return (Product) getSqlMapClientTemplate().queryForObject ("getProduct", productId);

  }

  ...

}

上述代码中出现了 Spring 提供的 IBatis DAO 支持类和获取 SqlMapClientTemplate 的父类模板方法,这和 JdbcDaoSupport JdbcTemplate 的使用具有一致的概念。并且,这些操作都统一的抛出 Spring 的通用数据访问异常 DataAccessException

注意: 在早期的 IBatis1.3.x 版本中 Dao 支持类和模板类分别被命名为 SqlMapDaoSupport SqlMapTemplate ,在使用时不要混淆。

10.3.3   关键整合点: Spring 配置文件

有了以上的 DAO 组件后,来看一下 Spring 的配置,这是一个关键的整合点,如代码 10.17 所示。

代码 10.17  dataAccessContext-local.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<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>

 

  <!-- Transaction manager for a single JDBC DataSource -->

  <bean id="transactionManager "

  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>

  </bean>

 

  <!-- Spring 提供的 iBatis SqlMap 配置 -->

  <bean id="sqlMapClient"

class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

    <property name="configLocation" value="WEB-INF/sql-map-config.xml"/>

    <property name="dataSource" ref="dataSource"/>

  </bean>

 

  <!-- DAO 定义 -->

  ...

  <bean id="productDao"

class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapProductDao">

    <property name="sqlMapClient " ref="sqlMapClient"/>

  </bean>

  ...

</beans>

可以发现, Spring 在上述文件中分别配置了数据源和事务管理的策略,其中挪去了原先在 IBatis 文件中的配置。

说明: 这样做的好处是可以通过 Spring IoC 容器统一的管理资源,在稍后还可以看到, Spring 提供的声明性事务管理就是借助于统一的数据源和事务管理配置。

SqlMapClientFactoryBean 又是一个工厂 bean ,它暴露了两个关键属性用于注射 IBatis 配置文件和相关的数据源。在工厂内部,通过读取 IBatis 配置文件, Spring 会创建出 IBatis 的核心组件 SqlMapClient ,并向相关的 DAO 进行注射。

SqlMapProductDao 继承了 SqlMapClientDaoSupport ,后者暴露出一个 sqlMapClient 属性,用于接受 Spring 的注射。 SqlMapClientDaoSupport 会对其中封装的 SqlMapClientTemplate 做相应的设置,所以 DAO 子类便可在取用 SqlMapClientTemplate 时正常地工作了。

10.3.4   添加声明式事务管理

以上的 IBatis DAO 可以很自方便地被注射到相应的业务对象,并参与到 Spring 提供的声明性事务中,配置如代码 10.18 所示。

代码 10.18   applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

  <!-- 通用属性文件定义 -->

  <bean id="propertyConfigurer"

  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

    <property name="locations">

      <list>

         ...

        <value>WEB-INF/jdbc.properties</value>

      </list>

    </property>

  </bean>

  <!-- 业务对象定义 -->

  ...

  <bean id="baseTransactionProxy"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

abstract="true">

    <property name="transactionManager" ref="transactionManager "/>

    <property name="transactionAttributes">

      <props>

        <prop key="insert*">PROPAGATION_REQUIRED</prop>

        <prop key="update*">PROPAGATION_REQUIRED</prop>

        <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

      </props>

    </property>

  </bean>

  <bean id="petStore" parent="baseTransactionProxy">

    <property name="target">

      <bean class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">

       ...

       <property name="productDao " ref="productDao"/>

        ...

      </bean>

  </bean>

</beans>

至此就基本完成了 Spring IoC IBatis 的整合了,当然也可以通过编程的方式来使用 Spring 所提供的模板和支持类。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值