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

二、环境介绍
       1 )开发工具: Eclipse 3.4.1
       2 JDK 环境: 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 ,如 DB4O H2 等,本人对 DB4O 更加青睐, DB4O 同时支持 java dotnet 平台。言归正传,关系型数据库采用 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应用的案例。
关于详细代码可以从附件中下载。