本文提供完整的实例代码下载
一、前言      
IBATIS3已经到了BETA9版本,相信离正式发布已经不远了。相对于以前的IBATIS版本,IBATIS3确实出现了相当多的新特性。【http://ibatis.apache.org/java.cgi】上提供了最新测试版的下载。粗粗的阅读了GUIDE文档后,决定针对其中的2项新特性体验一番。S2DAO和对象联合映射,这两项新特性将会带给我们更新更快捷的架构体验。S2DAO和传统的ORM映射的区别在于不再使用XML定义进行对象的映射,对象的联合映射将会为开发者节约大量的时间,把简单的重复的机械式劳动交给IBATIS自身。

二、环境介绍
       1)开发工具:Eclipse 3.4.1
       2JDK环境:JDK1.6
       3) 数据库:MS SQLSERVER 2005
       4) JDBC
sqljdbc.jar
       5) IBATIS版本:ibatis-3-core-3.0.0.227.jar
       Eclipse中建立了下图(图1)所示的测试工程:

图1
三、测试工程介绍
       在此工程中建立一个名为【IBATIS3TESTDB】的数据库,并建立以下2个表:

CREATE TABLE STUDENT
(
SNO varchar(10)  NOT NULL,
NAME varchar(50)  NOT NULL, 
BIRTHDAY varchar(8)  NULL, 
SEX nchar(1)  NULL, 
TEL nchar(10)  NULL,
ADDRESS varchar(50)  NULL, 
UPDATEMAN varchar(50)  NULL, 
UPDATETIME datetime NULL, 
CONSTRAINT STUDENT_pk PRIMARY KEY CLUSTERED (SNO)
)
 
CREATE TABLE SCORE
(
SNO varchar(10)  NOT NULL,
       SUBJECT varchar(50) NULL,
       SCORE INT NULL
)

BEAN对象的代码上,被分为四层,这样分是很有道理的,看上去类对象增加了许多,在实际业务开发中应对后期维护或者业务需求变动的时候,就会体验到这样划分的优势。
BEAN对象的分层上建议遵循以下的规则,本文的sample中即采用以下的规则:
2
BEAN对象明确划分成单表和业务组合相对开发和维护有莫大的好处,相信许多的项目都采用了这样的划分模式。在本文中这样划分的目的,更多的是为了针对关系型数据库使用类OODB的概念。OODB的提出很早以前就有,现在更多的使用在了嵌入式应用中,OODB的应用相对于持久层框架更加简单,现在主流的嵌入DB基本都宣称为OODB,如DB4OH2等,本人对DB4O更加青睐,DB4O同时支持javadotnet平台。言归正传,关系型数据库采用IBATIS3实现OODB的开发模式,似乎非常的可行。我们可以看一下IBATIS3中附带的annotations package。本文的实例中采用了该特性,如以下代码
package romancist.ibatis3.sample;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import romancist.ibatis3.sample.data.StudentData;
import romancist.ibatis3.sample.data.StudentKey;
public interface StudentDao {
    @Insert("insert into STUDENT(SNO,NAME,BIRTHDAY,SEX,TEL,ADDRESS,UPDATEMAN,UPDATETIME)VALUES(#{sno},#{name},#{birthday,jdbcType=VARCHAR},#{sex,jdbcType=VARCHAR},#{tel,jdbcType=VARCHAR},#{address,jdbcType=VARCHAR},#{updateman,jdbcType=VARCHAR},#{updatetime})")
    public int insertStudent(StudentData entity);
    @Select("select SNO,NAME,BIRTHDAY,SEX,TEL,ADDRESS,UPDATEMAN,UPDATETIME from STUDENT where SNO = #{VALUE}")
    public StudentData getStudent(String sno);
    @Update("update STUDENT SET NAME = #{name} where sno = #{sno}")
    public int updateStudent(StudentData entity);
    @Delete("delete from STUDENT where SNO = #{sno}")
    public int Student(StudentKey key);
    @Update("CREATE TABLE STUDENT ( SNO varchar(10)  NOT NULL,  NAME varchar(50)  NOT NULL,  BIRTHDAY varchar(8)  NULL,  SEX nchar(1)  NULL,  TEL nchar(10)  NULL,  ADDRESS varchar(50)  NULL,  UPDATEMAN varchar(50)  NULL,  UPDATETIME datetime NULL,  CONSTRAINT STUDENT_pk PRIMARY KEY CLUSTERED (SNO)) ")
    void createTable();
    @Update("drop table STUDENT")
    void dropTable();
}

是不是会有所感触,有兴趣的话再去看看DB4O中的应用,你会发现有很多的共同之处。正是基于该特性和对象联合映射的特性,才使得我对利用IBATIS3针对关系型数据库构建OODB应用产生兴趣。联合映射特性需要做的仅仅是在MAPPER中定义一些简单的映射。即可实现如下图所示的数据结构


先看看MAPPER部分的定义
<resultMap id="studentScoreResult" type="romancist.ibatis3.sample.data.StudentScoreBizData">
       <id property="sno" column="sno" />
       <result property="name" column="name" />
       <collection property="scoreDatas" ofType="romancist.ibatis3.sample.data.ScoreData">
           <result property="subject" column="subject" />
           <result property="score" column="score" />
       </collection>
    </resultMap>
<select id="selectScoreDatas" resultMap="studentScoreResult" >
 select STUDENT.SNO,
       STUDENT.NAME,
       SCORE.SUBJECT,
       SCORE.SCORE
 FROM STUDENT
 inner join SCORE ON(STUDENT.SNO=SCORE.SNO)
</select>

如果执行上述SQL,我们从数据库中检索到的结果如下:



DTO映射需要的数据结构可以参考一下的输出:

相对于以前的IBATIS的ORM映射确实有了很大的提高。

目前为止我对IBATIS3的联想还是很丰富的,由于接触时间仅1天,更多的功能还有待探索,相信不久之后我会来一篇完整的利用IBATIS3实现关系型数据库OODB应用的案例。
关于详细代码可以从附件中下载。