• IBatisNet使用教程


       1、是数据持久层,对应.NET方向的有Ibatis.NET,只要用来处理数据库表结构和程序实体之间映射,ado.net是用来处理和数据库直接通信的,取出数据(object,int,string,dataset,datatable等常规类型),通常程序中如果用到MOEDL实体,都需要手动写代码去做类型转换(把datatable的字段赋值到model对应字段),用了数据持久层(直接和数据库打交道并保持同步的一个应用层次),这一部就可以省略了,Ibatis.NET可以直接把数据库表字段映射为实体模型,操作简便了。

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

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

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

      5、 平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题。所以很多人会使用一些ORM框架来增强项目的可维护性、可扩展性。IBatis.Net就是一个比较易用的ORM框架,使用起来较为方便、灵活。IBatis.Net是从Ibatis的Java版本移植过来的.NET版本。iBATIS作为一种独特的Data Mapper,使用SQL映射的方式将对象持久化至关系型数据库。简单的理解就是它将我们在数据访问层实现的C#逻辑代码,变为通过关系数据库与对象的映射,将SQL逻辑放到外部的XML配置文件中,以方便以后的维护。

      这个框架有两个主要的组成部分,一个是SQL Maps,另一个是Data Access Objects。Sql Maps是这个框架的核心部分,通过使用Sql Maps你可以显著的节约数据库操作的代码量。SQL Maps使用一个简单的XML文件来实现从实体到SQL statements的映射。使用DAO,封装了对数据的访问,你可以动态配置你的应用程序来访问不同的实体存储机制。隐藏持久性层实现的细节,Data Access Objects允许你通过一个简单接口的来操作数据。

         

    IBatisNet 逻辑结构
     

    1、新建项目

    2、在项目中添加dll文件
         IBatisNet.Common.dll
       IBatisNet.DataMapper.dll
       IBatisNet.DataAccess.dll
    3、在项目中添加配置文件 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">
      
      <!-- 常量属性,resource 通过单独文件properties.config加载--> 
      <!--<properties resource="properties.config"/>--> <!--这个东西是变量用的,这里以最简单的实现说明,因此注释-->
       <!-- 常量属性,embedded 通过程序集资源中 加载
        <properties embedded="database.config, IBatisNetDemo"/>-->
     
      <settings>
        <setting useStatementNamespaces="true"/>   <!--是否启用命名空间-->
      </settings>
      
      <providers resource="providers.config"/>   <!--引入数据库驱动文件-->
      
        <!-- Database connection information -->
      <!--数据库连接字符串-->
        <!--<database>
            --><!--<provider name="sqlServer2.0"/>
            <dataSource name="IBatisNet" connectionString="Data Source=DESKTOP-1ORC3PV;Initial Catalog=test;Integrated Security=True"/>--><!--
        <provider name="oracleClient1.0"/>
          <dataSource name="IBatisNet" connectionString="Data Source=LHORCL;Persist Security Info=True;User ID=linsiontest;Password=123456;Unicode=True" providerName="System.Data.OracleClient"/>   
      </database>-->
      <database>
        <provider name="OracleClient2.0"/>
        <dataSource name="orcl" connectionString="Data Source=HDORCL;Persist Security Info=True;User ID=oa;Password=oa;Unicode=True"/>
      </database>
     
        <sqlMaps>  <!--节点就是配置一些sql语句以及实体映射的xml文件-->
    <sqlMap resource="DataMap/SQLMap/ParameterClass.xml" /> <!--ParameterClass.xml--> <sqlMap resource="Maps/Account.xml" /> <!--这个是指定映射文件的位置--> </sqlMaps> </sqlMapConfig>
    节点说明
    ① properties 节点
    可以根据需要配置一些常量属性。如果这些属性有很多的话可以单独写一个文件里面,再通过resource(或url, embedded分别是引用url和编译在程序中的资源文件)属性引用进来。

    参数

    描述

    resource

    指定the properties文件从application的根目录进行加载

    resource="properties.config"

    url

    指定the properties文件从文件的绝对路径进行加载

    url="c:WebMyAppResourcesproperties.config"

    或者

    url="file://c:WebMyAppResourcesproperties.config"

    embedded

    指定文件可以作为程序集的资源文件进行加载'

    embedded=" database.config, IBatisNetDemo”

    ②setting节点

    参数

    描述

    cacheModelsEnabled

    是否启用sqlMap上的缓存机制

    Example: cacheModelsEnabled=”true”

    Default: true (enabled)

    useStatementNamespaces

    是否使用Satement命名空间,这里的命名空间指的是映射文件中sqlMap节点的namespace属性

    Example: useStatementNamespaces=”false”

    Default: false (disabled)

    validateSqlMap

    是配置要不要启示SqlMapConfig.xsd schema验证映射文件.

    Example: validateSqlMap=”false”

    Default: false (disabled)

    ③provider节点
    配置数据驱动提供类配置文件的路径和文件名,通过resource(或url, embedded分别是引用url和编译在程序中的资源文件)属性引用进来,参数的含义同properties。
    ADO.NET是通过数据访问提供程序(Provider)访问数据库。IBatisNet使用的是插件式结构来使用这些数据库提供程序,每一个Provider对应于providers.config文件中定义的一个provider项。 通过设置这个文件中的几个参数来决定使用哪个数据库提供程序。
    提供程序要求安装相关类库,每一个provider 元素都有"enabled" 属性来控制是否启用个providers. 一个provider 可以通过 “default“属性标识为默认的提供程序。
    ④database节点
    数据库的信息,包括使用哪些数据库驱动和数据连接字符串的配置。    
    ⑤typeHandler节点
    定义数据库类型到dotnet数据类型的处理,不同的数据库都有一些特殊的数据库字段类型需要特殊处理,就可以通过这个功能实现。比如说Blob字段在不同的数据库中处理不一样。大家可以去看看Ibatisnet源代码就清楚这个功能的实现原理,对于我们的设计会有很大的启发
    ⑥salMaps
    sqlMap节点指定了映射文件的位置,配置中可以出现多个sqlMap节点,以指定项目内所包含的所有映射文件。 
    4、创建实体类
    定义实体类,该对象类将与数据库进行映射。   
    5、添加映射文件
    相对于Nhibernate等ORM实现来说,IBatisnet的映射配置更为直接,下面是配置文件内容:
    <?xml version="1.0" encoding="utf-8" ?>
    <sqlMap namespace="User" xmlns="http://ibatis.apache.org/mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
    
      <resultMaps>
        <resultMap id="UserResult" class="User">
          <result property="UserId" column="UserId" />
          <result property="UserName" column="UserName" />
          <result property="UserAge" column="UserAge" />
          <result property="UserSex" column="UserSex" />
        </resultMap>
      </resultMaps>
    
      <!--statement配置-->
      <statements>
        <select id="Exists" resultClass="int" parameterclass="User">
          select count(1) from tbuser
          where UserId = #UserId#
        </select>
        <select id="SelectAllUser" resultMap="UserResult" parameterclass="User">
          select * from tbuser where 1 = 1 
        </select>
      </statements>
    </sqlMap>
    

      模块配置:在ParameterClass.xml中配置

    <?xml version="1.0" encoding="utf-8" ?>
    <sqlMap namespace="ParameterClass" xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
    
      <alias>
        <typeAlias alias="User" type="IBatisNetTest.Models.User" />
      </alias>
    
    </sqlMap>

     6、S_IBatisBase 类

    using System;
    using System.Collections.Generic;
    
    using System.IO;
    using System.Reflection;
    using IBatisNet.DataMapper;
    using IBatisNet.DataMapper.Configuration;
    using IBatisNet.DataMapper.SessionStore;
    using IBatisNet.DataMapper.MappedStatements;
    using IBatisNet.DataMapper.Scope;
    
    namespace SystemFramework
    {
        public class S_IBatisBase
        {
            private static readonly IDictionary<string, ISqlMapper> dictMappers = null;
    
            private static volatile ISqlMapper mapper = null;
    
            public static ISqlMapper SqlMap
            {
                //get { return GetMapper("IBatisNetTest.Config.SqlMap.config", "IBatisNetTest"); } //程序集中加载
                get { return GetMapper("DataMap/Config/SqlMap.config", ""); }
            }
    
            private static readonly object syncObj = new object();
    
            /// <summary>
            /// 单例模式
            /// </summary>
            static S_IBatisBase()
            {
                dictMappers = new Dictionary<string, ISqlMapper>();
            }
    
            /// <summary>
            /// 实例化Oracle SqlMap对象
            /// </summary>
            /// <param name="mapperName"></param>
            /// <param name="assemblyName"></param>
            /// <returns></returns>
            public static ISqlMapper GetMapper(string mapperName, string assemblyName)
            {
                if (string.IsNullOrEmpty(mapperName))
                {
                    throw new Exception("MapperName为空!");
                }
    
                if (dictMappers.ContainsKey(mapperName))
                {
                    mapper = dictMappers[mapperName];
                }
                else
                {
                    if (mapper == null)
                    {
                        lock (syncObj)
                        {
                            if (mapper == null)
                            {
                                if (string.IsNullOrEmpty(assemblyName))
                                {
                                    #region 从本地配置文件中生成SqlMapper
                                    mapper = new DomSqlMapBuilder().Configure(mapperName);
                                    mapper.SessionStore = new HybridWebThreadSessionStore(mapper.Id);
                                    dictMappers.Add(mapperName, mapper);
                                    #endregion
                                }
                                else
                                {
                                    #region 从资源中生成SqlMapper
                                    Assembly assembly = Assembly.Load(assemblyName);
                                    Stream stream = assembly.GetManifestResourceStream(mapperName);
                                    DomSqlMapBuilder builder = new DomSqlMapBuilder();
                                    mapper = builder.Configure(stream);
                                    dictMappers.Add(mapperName, mapper);
                                    #endregion
                                }
                            }
                        }
                    }
                }
                return mapper;
            }
    
            /// <summary>
            /// 获取运行时SQL
            /// </summary>
            /// <param name="sqlMapper"></param>
            /// <param name="statementName"></param>
            /// <param name="paramObject"></param>
            /// <returns></returns>
            public static string GetRuntimeSql(ISqlMapper sqlMapper, string statementName, object paramObject)
            {
                string result = string.Empty;
                try
                {
                    IMappedStatement statement = sqlMapper.GetMappedStatement(statementName);
                    if (!sqlMapper.IsSessionStarted)
                    {
                        sqlMapper.OpenConnection();
                    }
                    RequestScope scope = statement.Statement.Sql.GetRequestScope(statement, paramObject, sqlMapper.LocalSession);
                    result = scope.PreparedStatement.PreparedSql;
                }
                catch (Exception ex)
                {
                    result = "获取SQL语句出现异常:" + ex.Message;
                }
                return result;
            }
        }
    }
    

      简单调用

            public ActionResult test()
            {
                User user = new User();
                user.UserId = 1;
                //string sql = S_IBatisBase.GetRuntimeSql(S_IBatisBase.SqlMap, "Exists", user);
                object objRtn = S_IBatisBase.SqlMap.QueryForObject("Exists", user);
                int i = Convert.ToInt32(objRtn);
    
                //string sql = S_IBatisBase.GetRuntimeSql(S_IBatisBase.SqlMap, "SelectAllUser", "");
                IList<User> user1 = S_IBatisBase.SqlMap.QueryForList<User>("SelectAllUser", "");
                return Json(user1);
            }
    

      

  • 相关阅读:
    可视化XHTML编辑器
    诺基亚E63内存清理法
    C语言第0次作业
    C语言博客作业03函数
    C博客作业01分支、顺序结构
    C语言博客作业02循环结构
    心情随笔
    沉没成本
    检索了MEG 和EEG,以及棘波的论文
    解决投稿问题
  • 原文地址:https://www.cnblogs.com/linhuide/p/5835857.html
Copyright © 2020-2023  润新知