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语句作为参数执行。