前段時間,在一個業務組件中使用了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