文档章节

项目中 IBatis.net 的使用一

victorruan
 victorruan
发布于 2014/07/16 09:52
字数 894
阅读 24
收藏 0

IBatis.net作用是把数据库查询与对象的属性间建立映射关系。但它并不是一个实体关系映射工具,仅用于帮助程序人员建立实体和SQL语句或者存储过程间的映射。因此只能叫半自动OR/M工具。我们的开票系统也用到了这个工具。

IBatis.net的配置:

一、引用几个DLL,注意在数据层引用即可。

单独使用映射的情况下,只需要引用IBatisNet.DataMapper.dll就可以了

其中IBatisNet.Common.dll是必须的,Entities是项目自己的,不用管它

二、完成对组件的添加后,还需要添加三个XML文档

1 providers.config ----DataMapper根据这个确定是什么类型数据库(放在数据层)

2 SqlMap.xml ----数据映射文档,里面包含了SQL语句(放在数据层)

3 SqlMap.config ----DataMapper的配置文档,它详细描述了工程中SqlMap.XML和providers.config文档的位置,以及其他配置项(必须放在Web跟目录下)。

先看SqlMap.config(这个文件的作用主要是指定db连接串,告诉系统providers.config在哪? 以及db与entity的映射文件在哪?):

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

<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <settings>
    <setting useStatementNamespaces="true"/> //如果是true,那么写数据查询时,查询语句的名称前要添加它的完整命名空间
    <setting cacheModelsEnabled="true"/> //全局化配置DataMapper客户能否启用cache,默认是true
    <setting validateSqlMap="false"/>
  </settings>

  <providers embedded="ICSON.InvoicePrinter.SqlProviderImpl.Config.providers.config,ICSON.InvoicePrinter.SqlProviderImpl"/>
          //指定providers.config的位置
<database> <provider name="sqlServer2.0" /> //如果使用默认的数据提供者,这句可以不要,如果系统中使用多个数据库,需要配置provider的内容 <dataSource name="SqlServer" connectionString="${ConnectionString}" /> //数据库链接字符串,我们的项目在IninMapper时,会给这个变量赋值 </database> <sqlMaps> //程序的数据映射文件的位置,如果有多个XML,就写多行,如果比较多,也可以当一个单独的XML中去写,比如<sqlMap resource=”Maps/All.XML”/>,然后在ALL.xml再添加数据映射文件,这样就 实现了加载一组数据映射文件
<sqlMap resource="Maps/KeyValueEntity.xml"/> <sqlMap resource="Maps/InvoiceCompany.xml"/> <sqlMap resource="Maps/InvoiceTemplate.xml"/> <sqlMap resource="Maps/InvoiceDistribute.xml"/> <sqlMap resource="Maps/BlankInvoiceInventory.xml"/> <sqlMap resource="Maps/InvoiceMachine.xml" /> <sqlMap resource="Maps/Order.xml"/> <sqlMap resource="Maps/SoPrint.xml"/> <sqlMap resource="Maps/SoPrintItem.xml"/> <sqlMap resource="Maps/Invoice.xml"/> <sqlMap resource="Maps/Log.xml"/> <sqlMap resource="Maps/InvoiceUser.xml"/> <sqlMap resource="Maps/OrderOutStockMaster.xml"/> <sqlMap resource="Maps/Batch.xml"/> <sqlMap resource="Maps/OrderBatch.xml"/> </sqlMaps> </sqlMapConfig>

三、创建SqlMapper实例,这个是单例模式,文件名ProviderBase.cs,放在数据层中。

using System;
using IBatisNet.Common.Utilities;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Configuration;
using ICSON.Utility;
using System.Configuration;
using System.Collections.Specialized;

namespace ICSON.InvoicePrinter.SqlProviderImpl
{
    /// <summary>
    /// 数据访问配置类。
    /// </summary>
    public class ProviderBase
    {
        private static volatile ISqlMapper _mapper;

        private ProviderBase() { }
  
        public static ISqlMapper Instance()
        {
            if (_mapper == null)
            {
                lock (typeof(SqlMapper))
                {
                    if (_mapper == null) // double-check    
                    {
                        InitMapper();
                    }
                }
            }
            return _mapper;
        }    

        /// <summary>    
        /// Init the 'default' SqlMapper defined by the SqlMap.Config file.    
        /// </summary>    
        public static void InitMapper()
        {
            try
            {
                var handler = new ConfigureHandler(Configure);
                var builder = new DomSqlMapBuilder();
                var connection = ConfigurationManager.ConnectionStrings[Config.DefaultConnectionName];

                if (connection == null)
                    throw new ConfigurationErrorsException("缺少数据库连接配置(" + Config.DefaultConnectionName + "");

                var properties = new NameValueCollection
                                     {
                                         {"ConnectionString",connection.ConnectionString}
                                     };

                builder.Properties = properties;
                _mapper = builder.ConfigureAndWatch(Config.BasePath + "sqlmap.config", handler);

            }
            catch (Exception e)
            {
                Log.Error("sqlmap.config配置错误:"+e.ToString());
                throw;
            }
        }


        public static void Configure(object obj)
        {
            _mapper = null;
        }
 
        public static ISqlMapper Get()
        {
            return Instance();
        }   

    }
}

外界调用方法:

IList list = SqlMapper.Instance().QueryForObject<list>("UserInfo.GetCount", param);

因为是单例的,第一次调用时,DomSqlMapBuilder对象会通过查询SqlMap.config来创建一个sqlMapper实例,以后调用就直接从缓存读取了。

DomSqlMapBuilder.ConfigureAndWatch()方法负责监视配置文件的更新情况,如果配置或者映射文件有更新,SqlMapper对象会重新载入并不重启系统。

 

我们的项目建立了一个SqlMap访问层基类,文件名是 BaseSqlMapDao.cs

那么这个基类完成什么工作呢,见下一篇博客吧。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文转载自:http://www.cnblogs.com/victorruan/p/3580470.html

victorruan
粉丝 0
博文 13
码字总数 0
作品 0
徐汇
私信 提问
IBatis.net ORM初体验

IBatis.net介绍 IBatis.net 是2001年发起的开源项目,它是一个轻量级的ORM框架,现在IBatisNET已经是属于Apache下的一个子项目了,最新版本是1.6.2. 官方网站:http://www.mybatis.org/ .net项目...

Yamazaki
2014/04/20
75
0
iBATIS In Action:序言和目录

序言 在我的软件开发生涯中,我曾工作于多种不同的环境中。在同一家公司中,人们往往会以不同的方式进行开发。考虑到各种各样的挑战——人、工具,它们就是开发人员所处的世界——我们会很快...

长征3号
2017/12/12
0
0
net开源项目

1 以色列 特思开源软件 http://cn.tersus.com/#Id=3924 2 开源社区 http://www.ctochina.net/ .NET开源项目链接 http://www.cnblogs.com/dustinyang/articles/361479.html...

冰点沐雪
2012/07/22
0
0
IBatis.net使用说明

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

JungleKing
2016/11/23
30
0
ibatis.net查询float类型返回实体类或者ResultMap时无效的问题

ibatis.net下出现的问题 数据库里有一个float类型的Amount字段,实体类中Amount的对应类型为Decimal,一直不能正确返回带有value的实体类。排除发现是该Amount字段导致(去掉Amount字段查询则...

刘昌鑫
2016/12/07
36
0

没有更多内容

加载失败,请刷新页面

加载更多

川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
23分钟前
10
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
52分钟前
5
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
52分钟前
7
0
Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
57分钟前
19
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部