ID #7986

IBatisNet.DataMapper 1.6.1.0应用之iBatis.Net简单三层De

笔者所在企业准备要用iBatis.Net来做数据访问,于是有了这篇随笔。

在示例中,为了方便起见,前台的数据绑定采用数据源。通过这篇随笔,可以让还未接触iBatis.Net又计划学习它的人有一个快速的了解和上手!

首先介绍Solution的架构,一共分四个项目:

Web :前台应用;  

BLL :业务处理层,如果嫌麻烦,可以再进一步抽象出来,然后将代码放置Web层的aspx.cs里面;

Model :这个就不多说了,地球人都知道(数据实体类)

SqlMaps:资源类,把配置文件和sql mapper文件全部打包起来。

二个文件夹:

Include :iBatis.Net架构的dll文件

Log :放置log文件的文件夹,在web.config里配置:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="../Log/log.txt"/>

在这里,主要介绍的就是SqlMaps项目.

SqlMaps项目文件介绍:

sqlmap.config:iBatis.Net架构最最重要的配置文件,里面主要有properties,Provider,Database,sqlMaps配置,这个不用多介绍,一看便知。另外,这篇随笔帮助大家入门,如果想要详细理解每个参数的意义,建议去看iBatis.Net的帮助手册。

database.config :顾名思义,数据库连接的配置文件,这个文件是准们为sqlmap.config里的properties准备的,你可以改成其他的名称也可以,甚至可以不要。见sqlmap.config里的配置:

<properties embedded="database.config,Service.SqlMaps"/>

providers.config:iBastis.Net自带的,不需要修改。

MapSqlClientPerson.xml:这个就是传说中的sql Mapper文件,其位置配置在sqlmap.config里:

<sqlMaps>
        <!-- user via embedded-->
        <sqlMap embedded="Map.SqlClient.Person.xml,Service.SqlMaps"/>
</sqlMaps>

它支持:

存儲過程

Inline SQL

動態SQL

ORM

5.CodeMyBatis.cs:专门用来初始化IBatisNet.DataMapper.ISqlMapper的处理类(因为它跟配置有关,所以也打包起来)。在这里,加入了支持输出DataTable和DataSet。另外,当输出为DataTable或者DataSet时,Person.xml里的resultMaps就不起作用,所以sql语句就要这么配置:

<select id="SelectAllPerson2" resultMap="SelectAllResult">
   select
   PER_ID AS Id,
   PER_FIRST_NAME AS FirstName,
   PER_LAST_NAME AS LastName,
   PER_BIRTH_DATE AS BirthDate,
   PER_WEIGHT_KG AS WeightInKilograms,
   PER_HEIGHT_M AS HeightInMeters
   from PERSON
   <dynamic prepend="WHERE">
     <isParameterPresent>
       PER_FIRST_NAME LIKE #FirstName#+'%'
     </isParameterPresent>
   </dynamic>
</select>

建议实体类的属性和数据库表栏位保持一致,这样大家都省心!

6.Script :示例中用到的表和数据的sql语句。

二,BLL的结构:

1. IBll.cs:方便调用ISqlMapper,把它作成一个基类,当然大家可以据此继续抽象扩展。

代码如下:

using System.IO;
using System.Reflection;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Configuration;
using Service.SqlMaps;

namespace Service.BLL
{

    public class IBll
    {
        protected static ISqlMapper SqlMap = MyBatis.SqlMap;
    }
}

2. PersonService.cs:示例的业务类,这里没什么业务,主要就是封装一下对iBatis.Net的操作。部分代码如下:

public class PersonService : IBll
    {

        public PersonService()
        {
        }

        public IList<Person> GetAllPerson()
        {
            return SqlMap.QueryForList<Person>("SelectAllPerson", null);
        }

        public DataTable GetAllPerson2()
        {
            int recCount = 0;
            DataTable dt = MyBatis.QueryForDataTable("SelectAllPerson2", new Person { FirstName = "kilo" },10,1,out recCount);
           return dt;
        }

        public DataTable GetAllPerson3()
        {
            return MyBatis.QueryForDataTable("SelectAllPerson2", new Person { FirstName = "kilo" });
        }
}

三.应用场景(摘抄自俺的同事Ryan):

1.在一些特定的环境下,一站式的解决方案未必有效

系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开。

开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现。(银行大多有这样的限制)

系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。

2.iBATIS之于小型、简单系统:非常适用

iBATIS自己就很小并且简单

iBATIS不会对现存应用的设计或者数据库结构强加任何影响

iBATIS非常适合于有成长趋势的系统

3.iBATIS之于大型、企业级系统:为之而设计

iBATIS的某些特性使得它能够高效地处理大型数据集

iBATIS允许你用多种方式建立从对象到数据库的映射关系

MySpace已应用

4.使用于任何类型的关系数据库:

应用数据库

企业数据库

私有数据库

遗留数据库

简单性

性能

明确分工

可移植性:Java、.Net或者其他

开源

5.何时不该使用iBATIS

当你能永远拥有完全控制权

当你的应用需要完全动态的SQL

当你并没有使用关系数据库时

当iBATIS不起作用时

PS1:这个Demo最原始的代码是从csdn上下载的,还扣了俺5分(很心痛),原来是1.3.0版,笔者把它升级,并对架构进行调整,代码也进行了精简.再次感谢一下原作者!

PS2:本来自己前阵子做的架构也是类似iBatis.Net的风格,并且在数据输出这块增加了很多种方式。不过这个架构都是自己在家里完成的。所以不拿来应用到公司的项目上,只应用于自己或朋友的接的项目上!

运行环境:Vs2008 + [SqlServer2k | SqlServer2005]

本文配套源码


2011-07-02 09:57
阅读:
I'm VC , Just U know Y
本站部分文章来源于互联网,版权归原作者所有。

延伸阅读:

WPF Bug清单之(13)——应该出现却没有出现的L

WG7310(WLAN+Bluetooth+FM)芯片在.Net MF中的应用

.NET应用访问数据库之数据库的开销问题

VML一游戏类应用,赛车轨迹

为托管应用程序添加DPI Aware支持