IBatis.net介绍

IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版本是1.6.2.

官方网站:http://www.mybatis.org/

.net项目下载地址:http://code.google.com/p/mybatisnet/

DataMapper:通过配置映射关系的xml业务对象与SQL语句和存储过程进行映射.

DataAcces:简单的说就是IBatis的数据访问层.

IBatis.net配置

主要要用到的几个配置文件:

providers.config 这个直接拷贝到根目录,该文件定义各种数据库的驱动,包括SqlServer, Oracle, MySQL, PostgreSQL, DB2 and OLEDB, ODBC 等。

sqlmap.config 就是非常核心的一个配置文件,主要配置了数据库访问字符串,settings设置,以及配置实体类和数据库表相关xml。

还有一个database.config 文件,它是配置一些在sqlmap中用到得参数.

然后需要引入两个DLL文件.

sqlmap.config文件代码:

<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 
  <!--<providers resource="database.config" />-->
  <settings>
    <setting useStatementNamespaces="true"/>
    <setting cacheModelsEnabled="true"/>
  </settings>
 
  <providers resource="providers.config" />
  <database>
    <!-- Optional ( default ) -->
    <provider name="sqlServer2.0"/>
    <dataSource name="iBatisNet" connectionString="Server=.; User ID=sa;Password=sa;Database=TestDB;Persist Security Info=True"/>
    </database>
  <sqlMaps>
    <sqlMap resource="Maps/Account.xml"/>
  </sqlMaps>
</sqlMapConfig>

useStatementNamespaces:是否启用命名空间

cacheModelsEnabled:是否缓存数据

<providers resource="providers.config" /> 引入数据库驱动文件

sqlMaps 节点就是配置一些sql语句以及实体映射的xml文件.

IBatis.net实战

现在让我们来做一个Demo

我用的是Sqlserver2005 ,新建一个数据表

在Vs2010下新建项目IBatisDemo

项目结构如下

IBatisDemo.Dao 提供一个统一的Mapper访问接口,

IBatisDemo.Model 数据实体

IBatisDemo.Service 数据操作

因为是做Demo没有对整体架构做过多的细节设置.

首先配置网站根目录下的Maps/Account.xml如下:

<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Account" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <alias>
    <!-- alias:取别名
                    assembly:表示类所在的文件
                    type:表示该类的完整的名称
      -->
    <typeAlias alias="Account" assembly="IBatisDemo.Model.dll" type="IBatisDemo.Model.Accounts" />
  </alias>
 
  <resultMaps>
    <resultMap id="Account-result"  class="Account">
      <result property="Id"    column="id"/>
      <result property="Item"    column="Item"/>
      <result property="Year"    column="Year"/>
      <result property="Month"    column="Month"/>
      <result property="Day"    column="Day"/>
      <result property="CreateOn"    column="CreateOn"/>
      <result property="Level"    column="Level"/>
    </resultMap>
  </resultMaps>
 
  <statements>
    <select id="sql_selectByid" resultMap="Account-result">
      select * from Accounts
      <dynamic prepend="where">
        <isParameterPresent property="id" prepend="">
          [id] = #id#
        </isParameterPresent>
      </dynamic>
    </select>
 
    <select id="sql_selectAll" resultMap="Account-result">
      select * from Accounts
    </select>
 
    <insert id="sql_InsertOne" parameterClass="Account">
      insert into Accounts (Item,Money,Year,Month,Day,CreateOn,Level)
      values
      (#Item#,
      #Money#,
      #Year#,
      #Month#,
      #Day#,
      #CreateOn#,
      #Level#
      )
      <selectKey  type="post" resultClass="int" property="Id">
        SELECT CAST(@@IDENTITY as int) as Id
      </selectKey>
    </insert>
  </statements>
</sqlMap>

说明:

statements 节点:

在这些容器标签中有一些常用的属性如下所示

resultMap和resultclass对比:

1、resultMap属于直接映射,可以把结果集中的数据库字段与实体类中的属性一一对应,这样通过select语句得到的结果就会准确的对上号

2、resultclass属于隐身映射,虽然你指定resultclass=“”,具体某一个类,但是select语句得到的结果是一条实力记录,但如果数据库字段与类的属性名字不一致,这个时候就会出现映射错误,有一种方式可以解决就是在写select语句时,给每个字段用as运算符取名字与属性一样:例如:select realname as name...其中realname是字段列名,name是属性字段名

3、resultmap比resultclass性能要高。尽量使用resultmap

insert标签下的selectKey  是表示返回刚插入数据的主键id,具体说明如下

<!-- 为了使insert操作能够返回插入记录的id,必须为insert写一个selectKey –>
<!-- 下面是sqlserver写法-->
    <selectKey  type="post" resultClass="int" property="Id">
      SELECT CAST(@@IDENTITY as int) as Id
    </selectKey>
<!-- 
    下面是针对Oracle的写法,Oracle没有autoincrement,而是用触发器实现的
    CURRVAL是在触发器中定义的
-->
<!--<insert id="insertRemark" parameterClass="RemarkInfo">
    insert into SGS_REMARK(REMARK) values(#remark#)
    <selectKey resultClass="int" keyProperty="id" > 
     SELECT S_SGS_REMARK.CURRVAL AS ID FROM DUAL 
    </selectKey> 
</insert>
-->
<!-- 下面是针对MySQL的写法 -->
<!-- 
    <selectKey resultClass="int" keyProperty="id" > 
    SELECT @@IDENTITY AS id 
    </selectKey> -->
 

Account.xml配置完成 .建实体类:

using System;
using System.Collections.Generic;
 
using System.Text;
 
namespace IBatisDemo.Model
{
    public class Accounts
    {
        public int Id { get; set; }
 
        public string Item { get; set; }
 
        public float Money { get; set; }
 
        public int Month { get; set; }
 
        public int Year { get; set; }
 
        public int Day { get; set; }
 
        public DateTime CreateOn { get; set; }
 
        public string Level { get; set; }
    }
}

Mapper.cs 获取Mapper的对象类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBatisNet.DataMapper;
using IBatisNet.Common.Utilities;
using IBatisNet.DataMapper.Configuration;
 
namespace IBatisDemo.Dao
{
    public class Mapper
    {
        private static volatile ISqlMapper _mapper = null;
 
        protected static void Configure(object obj)
        {
            _mapper = null;
        }
 
        protected static void InitMapper()
        {
            ConfigureHandler handler = new ConfigureHandler(Configure);
            DomSqlMapBuilder builder = new DomSqlMapBuilder();
            _mapper = builder.ConfigureAndWatch(handler);
        }
 
        public static ISqlMapper Instance()
        {
            if (_mapper == null)
            {
                lock (typeof(SqlMapper))
                {
                    if (_mapper == null) // double-check
                    {
                        InitMapper();
                    }
                }
            }
            return _mapper;
        }
 
        public static ISqlMapper Get()
        {
            return Instance();
        }
 
 
        /// <summary>
        /// RealMarket Mapper
        /// </summary>
        public static ISqlMapper GetMaper
        {
            get
            {
                if (_mapper == null)
                {
                    lock (typeof(ISqlMapper))
                    {
                        if (_mapper == null)
                        {
                            ConfigureHandler hander = new ConfigureHandler(Configure);
                            DomSqlMapBuilder builder = new DomSqlMapBuilder();
                            _mapper = builder.ConfigureAndWatch("sqlmap.config", hander);
                        }
                    }
                }
                return _mapper;
            }
        }
    }
}

然后再Service里面建立AccountService.cs 数据访问

using System;
using System.Collections.Generic;
 
using System.Text;
using System.Reflection;
using System.IO;
using IBatisDemo.Model;
using System.Data.SqlClient;
using IBatisDemo.Dao;
 
namespace IBatisDemo.Service
{
    public class AccountService
    {
        public int TestInsertOne(Accounts account)
        { 
            Object obj =Mapper.GetMaper.Insert("Account.sql_InsertOne", account);
            return (int)obj;
        }
 
        public Accounts GetAccount(int id)
        {
            return (Accounts)Mapper.GetMaper.QueryForObject("Account.sql_selectByid", id);
        }
 
        public IList<Accounts> GetAccountList() 
        {
            return Mapper.GetMaper.QueryForList<Accounts>("Account.sql_selectAll", null);
        }
    }
}

这里要注意命名空间.

在Default.aspx页面上调用Service

protected void Button1_Click(object sender, EventArgs e)
      {
          Accounts account = new Accounts();
          account.Id =-1;
          account.CreateOn = DateTime.Now;
          account.Day = 12;
          account.Item = "小刚1";
          account.Level = "无";
          account.Money = 56;
          account.Month = 6;
          account.Year = 2011;
 
          AccountService service = new AccountService();
          service.TestInsertOne(account);
      }
 
      protected void Button3_Click(object sender, EventArgs e)
      {
          AccountService service = new AccountService();
          IList<Accounts> accounts = service.GetAccountList();
 
          this.GridView1.DataSource = accounts;
          this.GridView1.DataBind();
      }
 
      protected void Button2_Click(object sender, EventArgs e)
      {
          AccountService service = new AccountService();
          Accounts account = service.GetAccount(2);
      }

运行效果:

IBatis.net介绍的更多相关文章

  1. iBatis简单介绍

    1.       Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...

  2. iBatis 简单介绍及基础入门

    iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2002年发起的开放源代码项目.于2010年6月16号被谷歌托管,改名为MyBatis.是一个基 ...

  3. ibatis实战之基础环境搭建

    关于ibatis的介绍.优缺点,以及ibatis和hibernate的比较再此不在赘述,可参阅其他资料. 一.准备工作 1.下载ibatis软件包http://download.csdn.net/de ...

  4. ibatis 入门

     iBatis 简单介绍: iBatis 是apache 的一个开源项目.一个O/R Mapping 解决方式,iBatis 最大的特点就是小巧.上手非常快.假设不须要太多复杂的功能.iBatis ...

  5. Ibatis的简单介绍

    定义: 相对Hibernate和Apache OJB 等“一站式”ORM解决方案而言,ibatis 是一种“半自动化”的ORM实现.以前ORM的框架(hibernate,ojb)的局限: 1. 系统的 ...

  6. 【ibatis】IBatis介绍

    Ⅰ .什么是Ibatis? ① iBATIS的是一个持久层框架,它能够自动在 Java, .NET, 和Ruby on Rails中与SQL数据库和对象之间的映射.映射是从应用程序逻辑封装在XML配置 ...

  7. [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)

    [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date  周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...

  8. IBatis.Net项目数据库SqlServer迁移至Oracle经验

    最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~ IBatis.Net是一个ORM框架,具体介绍可以问度娘.我之前没用ORM框架使用经验,所以这一路我不是走 ...

  9. iBatis框架基本使用

    iBatis框架是Java持久层开发框架,说白了就是前人写了一部分代码(针对数据库操作),我们要做的就是再次开发,拿来框架直接使用. 我们自己开发时,dao层的sql语句都是写死在程序中的,如果查询条 ...

随机推荐

  1. iOS 学习 - 7.限制 TextField 输入字符长度

    #pragma mark -- TextField代理 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: ...

  2. 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(四)Alert View视图 学习笔记

    当我们的应用电量不足的时候,就需要警告提示,那么我们可以用Alert View视图 实现:    

  3. java集合 之 Collection和Iterator接口

    Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合.Collection接口里定义了如下操作元素的方法. bo ...

  4. 使用OLE DB读写Excel

    说明: 使用这种技术的好处是无需引用对象,坏处是无法处理类似合并单元格这样的复杂情况 一些更新: 为了使用Office 2010,需要安装Microsoft Access 2010 数据库引擎可再发行 ...

  5. 使用MongoDB C#官方驱动操作MongoDB

    想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...

  6. MyCat 学习笔记 第十二篇.数据分片 之 分片事务处理

    1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  330 ...

  7. openstack-networking-neutron(四)--iptables

    Filter表:过滤数据包,默认表. (1)INPUT   链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤) (2)OUTPUT 链:过滤所有本机产生的数据包(对源地址得数据包的过滤) ( ...

  8. hibernate多对多映射关系实现

    Course.hbm.xml: <?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        &q ...

  9. Python Backup Files

    近来书写 Python 脚本进行替换以前的 shell 脚本,发现 Python 优于 shell 的最直观的一点Python 结构明了,可读性高(本人认为)在此做一些记录 本次记录利用 Python ...

  10. Windows Live Writer离线编写博客

    WLW最新版本为2012,官网下载 Windows Live Writer配置步骤 使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 L ...