Apache Ibatis 是一个你半自动的ORM产品,对于需要自己调用自定义sql或者需要手动优化sql的开发者是不错的选择. 现在 ibatis已经迁至google code下发展 ,更名为Mybatis .

SpringFramework集成了ibatis,开发者使用SqlMapClientDaoSupport即可.

要使用sprin集成的ibatis需要做以下两点:

1 、SqlMapClientFactoryBean的装配

 注:SqlMapClientFactoryBean是SqlMapClientTemplate使用的基础,SpringFramework应用中没有装配SqlMapClientFactoryBean,那么SqlMapClientTemplate将不可用,报空指针错误。

装配:

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

注意上面的configLocation的值是路径形式:/WEB-INF/sqlmap-config.xml,还可以是的形式(classpath:SqlMapConfig.xml):

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation">
      <value>classpath:SqlMapConfig.xml</value>
    </property>
    <property name="dataSource">
          <ref bean="dataSource-sale"/>
    </property>
</bean>

2、继承SqlMapClientDaoSupport(一般是service层)

......    
    import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;    
    ......    
    public class ReportDAOImpl extends SqlMapClientDaoSupport {    
        ......    
    }    
                                                                         
SpringFramework配置文件中装配Java类:    
    "reportDao" class="com.test.dao.ReportDAOImpl">    
        "sqlMapClient" ref="sqlMapClient"/>

3、使用SqlMapClientTemplate操作数据库

 1)没有参数的查询

List result = getSqlMapClientTemplate().queryForList("TestSpace.qryTest");

"TestSpace"为iBatis SqlMap文件的命名空间;"qryTest"为iBatis SqlMap的查询方法id。

2)当按照主键获取某条记录信息时:

   Long id = new Long("2");     Object resultObj = getSqlMapClientTemplate().queryForObject("TestSpace.getTest", id); 3)按某些条件查询
ObjectA objA = new ObjectA();    
    objA.setParam1("test1");    
    objA.setParam2("test2");    
    ......    
    List result = getSqlMapClientTemplate().queryForList("TestSpace.qryTestByParam", objA);

4)分页查询(4~40条数据)

List result = getSqlMapClientTemplate().queryForList("TestSpace.qryTestByParam", objA, 4, 40);

也可以返回Map:   

Map result = getSqlMapClientTemplate().queryForMap("TestSpace.qryTestByParam", objA, "MapKey");  

5)其他方法

  更新:getSqlMapClientTemplate().update("TestSpace.updateTest", objA); 

注意:

更新前20条记录:

getSqlMapClientTemplate().update("TestSpace.updateTest", objA, 20);

  插入:getSqlMapClientTemplate().insert("TestSpace.insertTest", objA);

删除:

  1. Long id = new Long("2");     

    getSqlMapClientTemplate().delete("TestSpace.deleteTest", id);  

    +++++++++=====+++++++++++++++++

下面给一个工具类的代码:

import java.util.List;
import org.jw.cn.base.dao.IReader;
import org.jw.cn.base.dto.Dto;
import org.jw.cn.base.dto.impl.BaseDto;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
                                 
public class IReaderImpl extends SqlMapClientDaoSupport
  implements IReader
{
  public Object queryForObject(String statementName, Object parameterObject)
  {
    return super.getSqlMapClientTemplate().queryForObject(statementName, parameterObject);
  }
                                 
  public Object queryForObject(String statementName)
  {
    return super.getSqlMapClientTemplate().queryForObject(statementName, new BaseDto());
  }
                                 
  public List<Object> queryForList(String statementName, Object parameterObject)
  {
    return super.getSqlMapClientTemplate().queryForList(statementName, parameterObject);
  }
                                 
  public List<Object> queryForPage(String statementName, Dto qDto)
  {
    return super.getSqlMapClientTemplate().queryForList(statementName, qDto, qDto.getAsInteger("start").intValue(),
      qDto.getAsInteger("end").intValue());
  }
                                 
  public List<Object> queryForList(String statementName)
  {
    return super.getSqlMapClientTemplate().queryForList(statementName, new BaseDto());
  }
}

DWR应用时可以用接口,以避免进行繁琐的方法暴露配置:

接口

package org.jw.cn.base.service;
                     
import org.jw.cn.base.dto.Dto;
                     
public abstract interface BaseService
{
  public abstract Dto jsCall(Dto paramDto);
}

实现类

package org.jw.cn.base.service.impl;
             
import org.apache.log4j.Logger;
import org.jw.cn.base.dao.IBaseDao;
import org.jw.cn.base.dao.IReader;
import org.jw.cn.base.log.BaseLogger;
import org.jw.cn.base.service.BaseService;
             
public abstract class BaseServiceImpl
  implements BaseService
{
  protected IBaseDao baseDao;
  protected IReader baseReader;
  protected Logger log = BaseLogger.getLogger("APP-LOG");
             
  public IBaseDao getBaseDao()
  {
    return this.baseDao;
  }
             
  public void setBaseDao(IBaseDao baseDao)
  {
    this.baseDao = baseDao;
  }
             
  public IReader getBaseReader()
  {
    return this.baseReader;
  }
             
  public void setBaseReader(IReader baseReader)
  {
    this.baseReader = baseReader;
  }
}

dwr.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
    "http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
    <init>
                         
        <creator id="BssCreator" class="org.directwebremoting.create.NewCreator"/></init>
    <allow>
        <create creator="BssCreator" javascript="JSBaseCall" scope="application">
            <param name="class" value="org.jw.cn.base.jscall.BaseJSCallImpl"/>
        </create>  
        <convert converter="bean" match="org.hd.demo.bo.*"/>
    </allow>
</dwr>