IbatisNet內容的學習

前段時間,在一個業務組件中使用了IbatisNet(Ibatis for net),作爲一個輕量級的ORM框架,感覺還不錯,在代碼上只需要指定一下id,然後在xml中定義就好了,雖然還是寫SQL,但是覺得結構好了不少。
  ibatisnet包括幾個dll:
  log4net.dll
  IBatisNet.DataMapper.dll
  IBatisNet.DataAccess.dll
  IBatisNet.Common.dll
  Castle.DynamicProxy.dll
  其實我們用到的是IBatisNet.DataMapper.dll和IBatisNet.DataAccess.dll而已,其他的可以參見ibatis的文檔,並無大用。
  另外,ibatis包括一些配置文件,開始使用的時候,可能是版本上有點混亂,一些配置文件總是有問題,經過整理後,所需的配置文件如下:
  providers.config
  sqlmap.config
  SqlMapConfig.xsd
  其中在providers中定義了一堆的數據庫驅動,以供使用,該文件隨着ibatis的包帶有,不再贅述;而sqlmap.config則是最重要的一個配置文件,其示例代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<sqlMapConfig
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="SqlMapConfig.xsd">
 <providers resource="providers.config"/>

 <database>
  <provider name="sqlServer1.1"></provider>
  <dataSource name="brac"
connectionString="server=localhost;database=RBAC;user id=sa;password=sa;connection lifetime=5; min pool size=1; max pool size=50"/>
 </database>
 <sqlMaps>
  <sqlMap resource="Data.xml" />
 </sqlMaps>
</sqlMapConfig>
  由代碼可以看出,這裏主要定義了使用哪個數據庫驅動,數據庫連接信息,以及SQL影射文件
<provider name="sqlServer1.1"></provider>
  這一句說明使用了在providers.config定義的sqlServer1.1驅動,注意在providers.config中的該驅動定義中enabled必須爲true,否則無法使用。
<dataSource name="brac"
connectionString="server=localhost;database=RBAC;user id=sa;password=sa;connection lifetime=5; min pool size=1; max pool size=50"/>
 </database>
  這句無疑就是你需要使用的數據庫連接了,看起來似乎是支持連接池。
 <sqlMaps>
  <sqlMap resource="Data.xml" />
 </sqlMaps>
  這就是說你的SQL影射操作是寫在另外一個文件Data.xml中的了,如果有多個那麼可以添加多個如下:
 <sqlMaps>
  <sqlMap resource="User.xml" />
  <sqlMap resource="Group.xml" />
 </sqlMaps>
  但是注意,在幾個定義的xml中,不要出現一樣的id或者其他唯一性標識。
  下面是定義SQL影射的配置文件代碼示例:
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="User" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="SqlMap.xsd">
 <alias>
  <typeAlias alias="User.User" assembly="rbac.dll" type="rbac.User" />
  <typeAlias alias="User.Role" assembly="rbac.dll" type="rbac.Role" />
  <typeAlias alias="User.Group" assembly="rbac.dll" type="rbac.Group" />
 </alias>
 
 <resultMaps>
  <resultMap id="SelectAllUserResult" class="User.User">
   <result property="id" column="UserId" />
   <result property="name" column="UserName" />
  </resultMap>
 
  <resultMap id="ByUserIdResult" class="User.User">
   <result property="id" column="UserId" />
   <result property="name" column="UserName" />
   <result property="pwd" column="Pwd" />
  </resultMap>
  
  <resultMap id="ByUserNameResult" class="User.User">
   <result property="id" column="UserId" />
   <result property="name" column="UserName" />
   <result property="pwd" column="Pwd" />
  </resultMap>
 
  <resultMap id="UsersRolesResult" class="User.Role">
   <result property="id" column="RoleId" />
   <result property="name" column="RoleName" />
   <result property="description" column="Description" />
  </resultMap>
   
 <resultMap id="UsersGroupsResult" class="User.Group">
   <result property="id" column="GroupId" />
   <result property="name" column="GroupName" />
   <result property="description" column="Description" />
  </resultMap>
 
 </resultMaps>
 
 <statements>
 <select id="SelectAllUser" resultMap="SelectAllUserResult">
        select UserId,UserName from T_User
 </select>
 
 <select id="queryUserById" parameterClass="int" resultMap="ByUserIdResult">
  select UserId,UserName,Pwd from T_User where UserId=#value#
 </select>
 
 <select id="queryUserByName" parameterClass="string" resultMap="ByUserNameResult">
  select UserId,UserName,Pwd from T_User where UserName=#value#
 </select>

  <select id="queryUsersRoles" parameterClass="string" resultMap="UsersRolesResult">
  select T_Role.RoleId,T_Role.RoleName,T_Role.Description from T_Role,R_User_Role where T_Role.RoleId=R_User_Role.RoleId and R_User_Role.UserId=#value#
 </select>
 
  <select id="queryUsersGroups" parameterClass="string" resultMap="UsersGroupsResult">
  select T_Group.GroupId,T_Group.GroupName,T_Group.Description from T_Group,R_User_Group where T_Group.GroupId=R_User_Group.GroupId and R_User_Group.UserId=#value# 
 </select>
 
 
 <insert id="addUser" parameterClass="User.User">
  insert into T_User(UserId,UserName,Pwd)values(#id#,#name#,#pwd#)
 </insert>
 
 <delete id="removeUser" resultClass="int">
  delete from T_User where UserId=#value#
 </delete>
 
 <delete id="removeUserGroup" resultClass="int">
  delete from R_User_Group where UserId=#value#
 </delete>
 
 
  <delete id="removeUserRole" resultClass="int">
  delete from R_User_Role where UserId=#value#
 </delete>

 
 <update id="modifyUser" parameterClass="User.User">
  update T_User set
  UserName=#name#,
  Pwd=#pwd#
  where UserId=#id#
 </update>
 </statements>
 
</sqlMap>
  這個xml文件主要包括幾部分:
  alias
  resultMaps
  statements
  alias主要是對你在DotNet中定義的類作一個唯一的別名,注意如果多個xml文件一起使用,那麼多個文件之間不要使用同一個alias,也就是說你在user.xml中使用了user這個別名,那麼你在group.xml裏面就不要使用這個別名,如果這兩個xml是在一起使用的話。
  resultMaps的話,就是定義返回結果,在statements中定義的SQL語句如果有返回值的話(特別是selecdt),那麼就要在這裏定義,在statements中引用;
 statements,就是SQL語句,大概包括,select,update,delete,insert這幾個,可以在其中定義resultMap,對應resultMaps中的定義,以返回結果;也可以定義parameterClass,類型包括一些保留類型,如string,int等,也可以是你在alias中定義的類,但是parameterClass似乎只可以定義一個,也就是說,如果你要傳入多個參數,那麼請用類封裝起來,並將這些參數作爲類的屬性,然後再將這個類的數據作爲參數傳入。
 說完配置,那麼怎麼使用呢?其實方法很多,我只說其中一種,其他的可以參考文檔。
 首先,當然是要加載這個sqlmap.config了:
  using IBatisNet.DataMapper;
  using IBatisNet.DataMapper.Configuration;
  DomSqlMapBuilder builder=new DomSqlMapBuilder();
  SqlMapper mMapper=builder.Configure("sqlmap.config" )
  然後就很簡單了,使用這個mMapper就可以了:
 mMapper.Delete();//刪除
  mMapper.Update();//修改
  mMapper.Insert();//增加
  mMapper.QueryForObject();//查詢一個對象
  mMapper.QueryForList();//查詢多個對象,返回列表
 如何使用這些函數,舉些例子:
  /// <summary>
  /// 新增用戶
  /// </summary>
  /// <param name="_User">用戶對象</param>
  public void addUser(TUser _User){
   try{
    mMapper.Insert("addUser",_User);
   }catch(Exception e){
    throw new Exception("添加一個用戶時出現系統框架錯誤:"+this.GetType()+":"+e.Message);
   }
  }

  /// <summary>
  /// 刪除用戶
  /// </summary>
  /// <param name="_UserId">用戶ID</param>
  public void delUser(String _UserId){
   try{
    mMapper.BeginTransaction();
    //刪除用戶定義表
    mMapper.Delete("delUser",_UserId);
    //刪除關聯表
    mMapper.Delete("user.delRUserRole",_UserId);
    mMapper.CommitTransaction();
   }catch(Exception e){
    mMapper.RollBackTransaction();
    throw new Exception("刪除一個用戶時出現系統框架錯誤:"+this.GetType()+":"+e.Message);
   }
  }

  /// <summary>
  /// 修改用戶
  /// </summary>
  /// <param name="_User">用戶對象</param>
  public void modifyUser(TUser _User){
   try{
    mMapper.Update("modifyUser",_User);
   }catch(Exception e){
    throw new Exception("修改一個用戶時出現系統框架錯誤:"+this.GetType()+":"+e.Message);
   }
  }

  /// <summary>
  /// 通過用戶ID獲取一個用戶對象
  /// </summary>
  /// <param name="_UserId">用戶ID</param>
  /// <returns>用戶對象</returns>
  public TUser queryUserById(String _UserId){
   try{
    TUser user=(TUser)mMapper.QueryForObject("queryUserById",_UserId);
    return user;
   }catch(Exception e){
    throw new Exception("獲取一個用戶對象時出現系統框架錯誤:"+this.GetType()+":"+e.Message);
   }
  }
  /// <summary>
  /// 獲取所有的用戶
  /// </summary>
  /// <returns>所有的用戶對象的集合</returns>
  public TArrayList queryAllUsers(){
   try{
    TArrayList users=new TArrayList();
    mMapper.QueryForList("queryAllUsers",null,users);
    return users;
   }catch(Exception e){
    throw new Exception("獲取所有用戶對象時出現系統框架錯誤:"+this.GetType()+":"+e.Message);
   }
  }
 基本上,ibatisnet/ibatis上手非常的快,我在之前沒有任何接觸的情況下,不到一個下午就基本弄懂了,這一點對於我們來說非常重要,學習成本低,
  但是不足的地方也不少,我知道的如下:
 1。傳入多個參數必須封裝成類,因爲它不接受多個參數,這是面向對象的弊端,一切都是對象,當然如果你一定要傳入多個參數,並且不使用類封裝也是可以的,要使用paramMap(好像是這個名字,不太記得),在文檔中有說明,但是不推薦使用,有性能問題;
 2。ibatisnet的文檔不多,比較多的是ibatis(for java)的,所以我參考的都是ibatis的文檔,好在這兩者之間的差異不算很大,開源來說,還是java的天下啊;
 3。官方版本比較混亂,開始的時候,這些配置文件老是出錯,我不得不看着xsd來改它的一些xml配置和config(也是xml),直到沒有錯誤位置,感謝xmlspy這個不錯的軟件。
  4 。不能(或者說我沒有找到)直接傳入SQL語句作爲參數執行。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/johnny_loo/archive/2006/06/27/839919.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章