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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值