IbatisNet使用印象

转载 2007年09月19日 09:30:00
前段时间,在一个业务组件中使用了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语句作为参数执行。

 

使用印象笔记感悟

今天翻看以往收藏的超链接,顺带使用RSS管理器整理一下,看到一篇文章 为什么写技术博客对新人如此重要? 突然想到自己的博客已经许久没有更新过了,上来补补--使用印象笔记的心得。 印象笔记想必大家都知道...
  • ycuzrz112280
  • ycuzrz112280
  • 2016年01月18日 11:16
  • 885

使用Linux版印象笔记nixnote2

Edit 使用Linux版印象笔记nixnote2 厌倦了windows10,最近一直使用ubuntu系统,其他都还好,就是我使用的笔记软件印象笔记只有网页版使用不方便。看到有非官...
  • u013401853
  • u013401853
  • 2017年03月26日 00:26
  • 3381

印象笔记支持MarkDown语法

前言我使用印象笔记来记录自己学习过程中的知识,但是印象笔记有一个大缺点就是不支持MarkDown语法,这是比较坑爹的。虽然有马克飞象可以用来在印象笔记中支持MarkDown,但是毕竟不是免费的东西,而...
  • ProgramChangesWorld
  • ProgramChangesWorld
  • 2016年07月16日 14:29
  • 6518

跟初学者学习IbatisNet第一篇

写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正……………………     第一篇就简单介绍一下什么是IbatisNet,然后写一个简单的De...
  • dyllove98
  • dyllove98
  • 2013年07月27日 20:41
  • 2998

Evernoote 印象笔记中代码语法高亮

印象笔记官方貌似还不支持像博客中的代码语法高亮功能。不过通过剪藏网页可以保留网页中的各种格式。        下面介绍一种不通过剪藏网页就实现编辑代码的方法。         工具:    ...
  • dazuo_01
  • dazuo_01
  • 2014年08月26日 00:04
  • 4837

用马克飞象+ 印象笔记 快速方便写技术博客方法

快速方便写技术博客方法 我个人原来经常写博客 ,如 http://bluedrum.cublog.cn ,坚持写了好几百篇与嵌入式软件相关的,后来还是放弃的。 主要原因,现有写博客的方式,...
  • work4blue
  • work4blue
  • 2014年06月01日 01:42
  • 7134

马克飞象与印象笔记的双剑合璧

马克飞象与印象笔记的双剑合璧一直以来我都想写一篇关于我现在使用的文字编辑工具和同步工具的文章,因为我一直坚信一条古人留下的格言,工欲善其事必先利其器。好的工具一定是会让你的工作事半功倍,最好的工具就是...
  • yedapeng2011
  • yedapeng2011
  • 2017年08月01日 00:26
  • 353

Android仿印象笔记的自定义菜单控件

点击印象笔记添加笔记菜单按钮,便会弹出一系列的按钮用于添加不同的笔记。于是自己试着仿照印象笔记的菜单按钮,写出一个自定义的菜单控件。...
  • ddxxll2008
  • ddxxll2008
  • 2015年11月24日 10:20
  • 1210

复制高亮代码到印象笔记

印象笔记中自带的代码块不好看,通过下面的步骤可以将代码格式粘贴道印象笔记。 工具印象笔记,sublime印象笔记中自带的插入代码块,插入的代码是真的不好看。 像这样,不方便阅读。...
  • FengNext
  • FengNext
  • 2017年04月17日 15:19
  • 1665

IbatisNet的介绍和使用

IBATISNet是一个使得SQL 语句或者 stored procedures与实体对象容易映射起来、简洁完整的框架,iBATIS framework将是你用更少的代码获得更多的数据库访问功能。 ...
  • john320
  • john320
  • 2014年11月24日 11:16
  • 298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IbatisNet使用印象
举报原因:
原因补充:

(最多只允许输入30个字)