关于hibernate和ibatis的区别,记得ibatis的设计者说过:当你数据库设计的天衣无缝的时候请选择hibernate,否则建议采用ibatis,通俗点:一个是全自动的傻瓜相机,一个是手动功能丰富的单反相机。
读者可以在自己的项目中权衡,选择适合自己的持久层框架包来构建自己的“和谐程序”!
还有国内对hibernate框架讨论的比较多,而关于ibatis的比较少,自己在学习的时候大部分都是自己摸索出来,甚至是猜出来的,还有对夏昕先生的文档的补充(不能说成纠正)!希望我的这个文档能让大家在学习ibatis框架中提供资料上的支持,少走弯路才是我的初衷阿!
费话不多说,开始干活!
DB表说明:user表
create table SEW_USER(
USER_ID NUMBER(20) PRIMARY KEY not null,
USERNAME VARCHAR2(20),
PASSWORD VARCHAR2(20),
EMAIL VARCHAR2(40),
GROUP_ID NUMBER(20),##关联表:sew_group中的主健group_id
ROLE_ID NUMBER(20),##关联表:sew_role中的主健role_id
NATIONALITY VARCHAR2(30),
TEL VARCHAR2(30),
ADDRESS VARCHAR2(100),
LANGUAGE VARCHAR2(20),
ISEVECTION NUMBER(1),
REALNAME VARCHAR2(20))
sew_group表
create table SEW_GROUP(
GROUP_ID NUMBER(20) PRIMARY KEY not null,
GROUP_NAME VARCHAR2(64),
DESCRIPTION VARCHAR2(64),
USER_ID NUMBER(20))
sew_role表
create table SEW_ROLE(
ROLE_ID NUMBER(20) PRIMARY KEY not null,
ROLE_NAME VARCHAR2(20))
一张表的insert,update,delete,list等操作,网络上都有,而关联表的操作的介绍比较少。
对应表结构的需要持久化的对象
public class User implements Serializable {
private long user_id;
private String username;
private String password;
private String address;
private String nationality;
private long isEvectioner;
private String tel;
private String email;
private String language;
private String realname;
private Group group;
private Role role;
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public long getUser_id() {
return user_id;
}
public void setUser_id(long user_id) {
this.user_id = user_id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public long getIsEvectioner() {
return isEvectioner;
}
public void setIsEvectioner(long isEvectioner) {
this.isEvectioner = isEvectioner;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
组:
public class Group implements Serializable{
private long groupid;
private String groupname;
private List users;
public List getUsers() {
return users;
}
public void setUsers(List users) {
this.users = users;
}
public Group(){
}
public long getGroupid() {
return groupid;
}
public void setGroupid(long groupid) {
this.groupid = groupid;
}
public String getGroupname() {
return groupname;
}
public void setGroupname(String groupname) {
this.groupname = groupname;
}
角色:
public class Role implements Serializable{
private long role_id;
private String role_name;
private String role_express;
private List list;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public String getRole_express() {
return role_express;
}
public void setRole_express(String role_express) {
this.role_express = role_express;
}
public long getRole_id() {
return role_id;
}
public void setRole_id(long role_id) {
this.role_id = role_id;
}
public String getRole_name() {
return role_name;
}
public void setRole_name(String role_name) {
this.role_name = role_name;
}
}
持久化对象的映射文件:这里以User为例:
<sqlMap namespace="user"><--命名空间,好像2.0默认是开通的-->
<cacheModel type="LRU" id="oneDayCategory"><!--缓存配置,详细的资料请察看官方提供的用户手册,好像有中文版本的了 -->
<flushInterval hours="24" />
</cacheModel>
<typeAlias type="com.infodeliver.pigeon.bean.User" alias="userbean" /><!--定义本地变量,为了方便使用 -->
<typeAlias type="com.infodeliver.pigeon.util.Condition"
alias="condition" />
<typeAlias type="com.infodeliver.pigeon.bean.Role" alias="rolebean"/>
<resultMap id="get_group_result"
class="com.infodeliver.pigeon.bean.Group"><!-- 这就是不定义本地变量的结果-->
<result property="groupid" column="group_id" />
<result property="groupname" column="group_name" />
</resultMap>
<resultMap id="get_role_result"
class="rolebean">
<result property="role_id" column="role_id"/>
<result property="role_name" column="role_name"/>
</resultMap>
<resultMap id="get_user_result"
class="userbean">
<result property="user_id" column="user_id" />
<result property="username" column="username" />
<!--为user的group信息(属性groupid,groupname)配置 -->
<result property="group.groupid" column="group_id" />
<result property="group.groupname" column="group_name" />
<!-- 此role_id是role表里的role_id,而非user表中的role_id,根据role_id来获得Role对象-->
<!--为user的role信息(属性roleid,rolename)配置,这里同样是User中的子对象,采取的处理却是不同的,通过group来避免使用子查询带来的性能问题,大家可以看到
第一个配置的粒度比较细微,配置子对象的属性,而role只是到对象一级,group中没有使用select="XXX"这样的子查询,从而避免了因为数据量大而引起二次查询带来的性能问题,而采用了一个role作为一个反面教材,大家比较一下可以发现其中的不同!-->
<result property="role" column="role_id" select="get_role"/>
</resultMap>
<select id="get_role" parameterClass="int" resultMap="get_role_result"><!--这里的parameterClass="int"因为父查询传过来的role_id为int型的-->
select * from sew_role where role_id=#value#
</select>
<select id="get_user" parameterClass="userbean"
resultMap="get_user_result">
select * from sew_user u,sew_group g<!--因为这里的group没有子查询,所以要使用嵌套阿!-->
where u.group_id=g.group_id
and u.user_id=#user_id#
</select>
<select id="checkuser" parameterClass="userbean"
resultMap="get_user_result">
select * from sew_user u,sew_group g
where u.group_id=g.group_id
and u.username=#username#
and u.password=#password#
</select>
<select id="get_group" resultMap="get_group_result"
parameterClass="int">
select * from sew_group where group_id=#value#
</select>
<insert id="insertuser" parameterClass="userbean">
insert into sew_user
values(sew_user_id_seq.nextval,
#username#,#password#,#email#,#group.groupid#,#role.role_id#,#nationality#,
#tel#,#address#,#language#,#isEvectioner#,#realname#)
</insert>