本文提供完整的实例代码下载
图1
先看看MAPPER部分的定义
如果执行上述SQL,我们从数据库中检索到的结果如下:
DTO映射需要的数据结构可以参考一下的输出:
相对于以前的IBATIS的ORM映射确实有了很大的提高。
目前为止我对IBATIS3的联想还是很丰富的,由于接触时间仅1天,更多的功能还有待探索,相信不久之后我会来一篇完整的利用IBATIS3实现关系型数据库OODB应用的案例。
关于详细代码可以从附件中下载。
一、前言
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
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映射需要的数据结构可以参考一下的输出:
目前为止我对IBATIS3的联想还是很丰富的,由于接触时间仅1天,更多的功能还有待探索,相信不久之后我会来一篇完整的利用IBATIS3实现关系型数据库OODB应用的案例。
关于详细代码可以从附件中下载。