文档章节

IBatis.net ORM初体验

Yamazaki
 Yamazaki
发布于 2014/04/20 21:45
字数 1412
阅读 75
收藏 1

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配置

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

1

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

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

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


<?xml version="1.0" encoding="utf-8" ?>

<settings>

    <add key="userid" value="sa" />

    <add key="password" value="123456" />

    <add key="database" value="MyTest" />

    <add key="datasource" value="(local)" />

    <add key="selectKey" value="select @@IDENTITY as value" />

    <add key="directory" value="Maps" />

    <add key="useStatementNamespaces" value="false" />

</settings>




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

1

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 ,新建一个数据表

1

 

在Vs2010下新建项目IBatisDemo

项目结构如下

1

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 节点:

1

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

1

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);

      }



运行效果:

1

 

写起来比较简单,配置起来还是很麻烦的.也许是第一次接触吧。比较简单,就不提供源码咯.

后续再带来更深入的用法..




本文转载自:http://www.cnblogs.com/xiaopohou/archive/2012/03/03/2378088.html

Yamazaki
粉丝 62
博文 677
码字总数 38622
作品 0
普陀
高级程序员
私信 提问
个人对于架构设计的理解

处在待业状态最适合做的事情就是对以前的工作和学习做一个总结。 读过一些开源的架构,比如PetShop的架构,Nhibernate的架构,ibatis.net的架构。 自己写过的架构,从最早的简单三层,到面向服...

zting科技
2017/01/12
0
0
IBatis.net使用说明

IBatis.net是移植于java版本,所以在.net平台上的操作和java平台上的操作基本没有什么太大的差别。严格来说,ibatis.net并不算的上是一种orm,因为它的sql语句均写到了配置文件中,没有自己专...

JungleKing
2016/11/23
27
0
iBATIS更名为MyBatis 并迁移到Google Code

iBATIS更名为MyBatis 并迁移到Google Code,iBatis是著名的ORM开发框架,分为 Java 和 .NET 版本,有着众多的追随者。此次项目迁移后,新的网站还不完善,缺乏文档。由于目前只是改了名字,因...

zhuzhangsuo
2010/05/22
11.3K
9
Castle使用初探

Castle的解释 Castle 英文意思为城堡 常见框架 Castle和Spring.Net是.net开源框架中最热也是最优秀的两个IOC框架,NHibernate实现ORM,Castle也是使用Nhiberante来做的ORM 常见的组合 Spring...

邓小峰
2009/03/26
4.6K
0
轻量级 PHP 开发框架 - ThinkPHP

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来...

流年
2008/09/14
133.1K
37

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部