服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 专题栏目 > IBATIS专题 > 查看文档

ibatis学习心得

         由于项目需要,也是为了摆脱jdbc原始样式的开发模式,决定采用持久层框架,使我们的程序更加OO化(除了DB),目前流行的持久层框架很多,hibernate,ibatis,EJB,JDO,等,关于几种框架之间的异同,大家可以参考一下其他相关的评论,大概意思是前面两者是轻量级的JDBC封装,浅耦合,后面两者是重量级别的,深耦合的。

关于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>

扫描关注微信公众号