zoukankan      html  css  js  c++  java
  • IBatisNet 快速开发使用 之二

    续 IBatisNet开发使用小结 之一

    四.   IBatisNet组件使用

    1. 1.  DomSqlMapBuilder

    DomSqlMapBuilder,其作用是根据配置文件创建SqlMap实例。可以通过这个组件从Stream, Uri, FileInfo, or XmlDocument instance 来读取sqlMap.config文件。 

    1. 2.  SqlMap

    SqlMapper是IBatisnet的核心组件,提供数据库操作的基础平台。所有的操作均通过SqlMapper实例完成。SqlMapper可通过DomSqlMapBuilder创建。

    这个例子中我们可以将所有的配置文件按照嵌入资源文件方式存放,从程序集去加载sqlmap.config文件。也可以直接以文件方式加载sqlmap.config。 

    /// <summary>
    
    /// IsqlMapper实例
    
    /// </summary>
    
    /// <returns></returns>
    
    public static ISqlMapper sqlMap ;
    
    private string fileName = "sqlMap.Config";
    
    public BaseSqlMapDao()
    
    {
    
        //从程序集资源中加载
    
        //Assembly assembly = Assembly.Load("IBatisNetDemo");
    
        //Stream stream = assembly.GetManifestResourceStream("IBatisNetDemo.sqlmap.config");           
    
        //DomSqlMapBuilder builder = new DomSqlMapBuilder();
    
        //sqlMap = builder.Configure(stream);
    
     
    
        //从文件加载创建实例           
    
        DomSqlMapBuilder builder = new DomSqlMapBuilder();
    
        sqlMap = builder.Configure(fileName);
    
    }

    SqlMap是线程安全的,也就是说,在一个应用中,可以共享一个SqlMap实例。

    SqlMap提供了众多数据操作方法,下面是一些常用方法的示例,具体说明文档参见 ibatis net doc,或者ibatisnet的官方开发手册。 

    1. 3.  SqlMap基本操作示例 

    例1:数据写入操作(insert、update、delete)

     SqlMap.BeginTransaction();
     Person person = new Person();
     Person.FirstName = “li”;
     Person.LastName = “tianping”;
    int Id = (int) SqlMap.Insert("InsertPerson", person);
     SqlMap.CommitTransaction();

     例2:数据查询:

    Int Id = 1;
    Person person = SqlMap.QueryForObject<Person>("", Id);
    return person;

     例3:执行批量查询(Select)

    IList<Person> list = null;
    list = SqlMap.QueryForList<Person>("SelectAllPerson", null);
    return list;

     例4:查询指定范围内的数据(Select)

    IList<Person> list = null;
    list = SqlMap.QueryForList<Person>("SelectAllPerson", null, 0, 40);
    return list;

     例5:结合RowDelegate进行查询:

    public void RowHandler(object obj, IList list)
    {
    
      Product product = (Product) object;
    
      product.Quantity = 10000;
    
    }
    
    SqlMapper.RowDelegate handler = new SqlMapper.RowDelegate(this.RowHandler);
    IList list = sqlMap.QueryWithRowDelegate("getProductList", null, handler);

     4.  存储过程操作

    下面特别说明一下ibatisnet对Stored Procedures的处理,iBatis数据映射把存储过程当成另外一种声明元素。示例演示了一个基于存储过程的简单数据映射。 

    <!-- Microsot SQL Server -->
    <procedure id="SwapEmailAddresses" parameterMap="swap-params">
      ps_swap_email_address
    </procedure>
    ...
    
    <parameterMap id="swap-params">
      <parameter property="email1" column="First_Email" />
      <parameter property="email2" column="Second_Email" />
    </parameterMap>
    
    
    <!-- Oracle with MS OracleClient provider -->
    <procedure id="InsertCategory" parameterMap="insert-params">
     prc_InsertCategory
    </procedure>
    
    ...
    
    <parameterMap id="insert-params">
     <parameter property="Name"       column="p_Category_Name"/>
     <parameter property="GuidString" column="p_Category_Guid" dbType="VarChar"/>
     <parameter property="Id"         column="p_Category_Id"   dbType="Int32"   type="Int"/>
    </parameterMap>
    
    
    <!-- Oracle with ODP.NET 10g provider -->
    <statement id="InsertAccount" parameterMap="insert-params">
     prc_InsertAccount
    </statement>
    
    ...
    
    <parameterMap id="insert-params">
     <parameter property="Id"           dbType="Int32"/>
     <parameter property="FirstName"    dbType="VarChar2" size="32"/>
     <parameter property="LastName"     dbType="VarChar2" size="32"/>
     <parameter property="EmailAddress" dbType="VarChar2" size="128"/>
    </parameterMap>

     

    示例是调用存储过程swapEmailAddress的时候将会在数据库表的列和两个email地址之间交换数据,参数对象亦同。参数对象仅在属性被设置成INOUT或者OUT的时候才会被修改。否则,他们将不会被修改。当然,不可变得参数对象是不会被修改的,比如string.

     .Net中,parameterMap属性是必须的。DBType,参数方向,大小由框架自动发现的。(使用CommandBuilder实现的)。

    五.   IBatisNet封装类:BaseSqlMapDao

    为了日后的重复使用和代码简洁,我们可以像DbHelperSQL一样,对SqlMap的各种操作进行封装。

    using System;
    
    using System.Collections;
    
    using System.Collections.Generic;
    
    using System.Text;
    
    using System.IO;
    
    using System.Web;
    
    using System.Reflection;
    
    using IBatisNet.Common;
    
    using IBatisNet.Common.Pagination;
    
    using IBatisNet.DataMapper;
    
    using IBatisNet.DataMapper.Exceptions;
    
    using IBatisNet.DataMapper.Configuration;
    
    namespace IBatisNetLib
    
    {
    
        /// <summary>
    
        /// 基于IBatisNet的数据访问基类
    
        /// </summary>
    
        public class BaseSqlMapDao
    
        {
    
            /// <summary>
    
            /// IsqlMapper实例
    
            /// </summary>
    
            /// <returns></returns>
    
            public static ISqlMapper sqlMap;
    
            #region 构造ISqlMapper
    
            private string fileName = "sqlMap.Config";
    
            public BaseSqlMapDao()
    
            {
    
                //从程序集中加载
    
                //Assembly assembly = Assembly.Load("IBatisNetDemo");
    
                //Stream stream = assembly.GetManifestResourceStream("IBatisNetDemo.sqlmap.config");           
    
                //DomSqlMapBuilder builder = new DomSqlMapBuilder();
    
                //sqlMap = builder.Configure(stream);
    
     
    
                //从文件加载创建实例           
    
                DomSqlMapBuilder builder = new DomSqlMapBuilder();
    
                sqlMap = builder.Configure(fileName);
    
            }               
    
            #endregion
    
         
    
            /// <summary>
    
            /// 是否存在
    
            /// </summary>
    
            /// <param name="tableName">表名</param>
    
            /// <returns></returns>
    
            protected bool ExecuteExists(string statementName, object parameterObject)
    
            {
    
                try
    
                {
    
                    object obj = sqlMap.QueryForObject(statementName, parameterObject);
    
                    int cmdresult;
    
                    if ((Object.Equals(obj, null)) || (obj == null))
    
                    {
    
                        cmdresult = 0;
    
                    }
    
                    else
    
                    {
    
                        cmdresult = int.Parse(obj.ToString());
    
                    }
    
                    if (cmdresult == 0)
    
                    {
    
                        return false;
    
                    }
    
                    else
    
                    {
    
                        return true;
    
                    }
    
                }
    
                catch (Exception e)
    
                {
    
                    throw (e);
    
                }
    
            }
    
           
    
            /// <summary>
    
            /// 执行添加
    
            /// </summary>
    
            /// <param name="statementName">操作名</param>
    
            /// <param name="parameterObject">参数</param>
    
            protected object ExecuteInsert(string statementName, object parameterObject)
    
            {
    
                try
    
                {
    
                    return sqlMap.Insert(statementName, parameterObject);
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for insert.  Cause: " + e.Message, e);
    
                }
    
            }
    
            /// <summary>
    
            /// 执行添加,返回自动增长列
    
            /// </summary>
    
            /// <param name="statementName">操作名</param>
    
            /// <param name="parameterObject">参数</param>
    
            /// <returns>返回自动增长列</returns>
    
            protected int ExecuteInsertForInt(string statementName, object parameterObject)
    
            {
    
                try
    
                {
    
                    object obj=sqlMap.Insert(statementName, parameterObject);
    
                    if (obj != null)
    
                    {
    
                        return Convert.ToInt32(obj);
    
                    }
    
                    else
    
                    {
    
                        return 0;
    
                    }
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for insert.  Cause: " + e.Message, e);
    
                }
    
            }
    
     
    
            /// <summary>
    
            /// 执行修改
    
            /// </summary>
    
            /// <param name="statementName">操作名</param>
    
            /// <param name="parameterObject">参数</param>
    
            /// <returns>返回影响行数</returns>
    
            protected int ExecuteUpdate(string statementName, object parameterObject)
    
            {
    
                try
    
                {
    
                    return sqlMap.Update(statementName, parameterObject);
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for update.  Cause: " + e.Message, e);
    
                }
    
            }
    
     
    
            /// <summary>
    
            /// 执行删除
    
            /// </summary>
    
            /// <param name="statementName">操作名</param>
    
            /// <param name="parameterObject">参数</param>
    
            /// <returns>返回影响行数</returns>
    
            protected int ExecuteDelete(string statementName, object parameterObject)
    
            {
    
                try
    
                {
    
                    return sqlMap.Delete(statementName, parameterObject);
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for delete.  Cause: " + e.Message, e);
    
                }
    
            }
    
     
    
            /// <summary>
    
            /// 得到列表
    
            /// </summary>
    
            /// <typeparam name="T">实体类型</typeparam>
    
            /// <param name="statementName">操作名称,对应xml中的Statement的id</param>
    
            /// <param name="parameterObject">参数</param>
    
            /// <returns></returns>
    
            protected IList<T> ExecuteQueryForList<T>(string statementName, object parameterObject)
    
            {
    
                try
    
                {
    
                    return sqlMap.QueryForList<T>(statementName, parameterObject);
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for list.  Cause: " + e.Message, e);
    
                }
    
            }
    
     
    
            /// <summary>
    
            /// 得到指定数量的记录数
    
            /// </summary>
    
            /// <typeparam name="T"></typeparam>
    
            /// <param name="statementName"></param>
    
            /// <param name="parameterObject">参数</param>
    
            /// <param name="skipResults">跳过的记录数</param>
    
            /// <param name="maxResults">最大返回的记录数</param>
    
            /// <returns></returns>
    
            protected IList<T> ExecuteQueryForList<T>(string statementName, object parameterObject, int skipResults, int maxResults)
    
            {
    
                try
    
                {
    
                    return sqlMap.QueryForList<T>(statementName, parameterObject, skipResults, maxResults);
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for list.  Cause: " + e.Message, e);
    
                }
    
            }
    
     
    
            /// <summary>
    
            /// 得到分页的列表
    
            /// </summary>
    
            /// <param name="statementName">操作名称</param>
    
            /// <param name="parameterObject">参数</param>
    
            /// <param name="pageSize">每页记录数</param>
    
            /// <returns></returns>
    
            protected IPaginatedList ExecuteQueryForPaginatedList(string statementName, object parameterObject, int pageSize)
    
            {
    
                try
    
                {
    
                    return sqlMap.QueryForPaginatedList(statementName, parameterObject, pageSize);
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for paginated list.  Cause: " + e.Message, e);
    
                }
    
            }
    
     
    
            /// <summary>
    
            /// 查询得到对象的一个实例
    
            /// </summary>
    
            /// <typeparam name="T">对象type</typeparam>
    
            /// <param name="statementName">操作名</param>
    
            /// <param name="parameterObject">参数</param>
    
            /// <returns></returns>
    
            protected T ExecuteQueryForObject<T>(string statementName, object parameterObject)
    
            {
    
                try
    
                {
    
                    return sqlMap.QueryForObject<T>(statementName, parameterObject);
    
                }
    
                catch (Exception e)
    
                {
    
                    throw new DataMapperException("Error executing query '" + statementName + "' for object.  Cause: " + e.Message, e);
    
                }
    
            }       
    
        }
    
    }

     

        调用该基类实现映射文件的数据访问代码:

    using System;
    
    using System.Collections.Generic;
    
    using System.Text;
    
    namespace IBatisNetLib
    
    {
    
        public class PersonService : BaseSqlMapDao
    
        {
    
            public PersonService()
    
            {
    
            }
    
            /// <summary>
    
            /// 是否存在该记录
    
            /// </summary>
    
            public bool Exists(object Id)
    
            {
    
                return ExecuteExists("Exists", Id);
    
            }
    
            public void Insert(Person person)
    
            {
    
                ExecuteInsert("InsertPerson", person);
    
            }
    
            public void Update(Person person)
    
            {
    
                ExecuteUpdate("UpdatePerson", person);
    
            }
    
            public void Delete(Person person)
    
            {
    
                ExecuteDelete("DeletePerson", person);
    
            }
    
            public IList<Person> GetAllPerson()
    
            {
    
                IList<Person> list = null;
    
                list = ExecuteQueryForList<Person>("SelectAllPerson", null);
    
                return list;
    
            }
    
            public Person GetPerson(object Id)
    
            {
    
                Person person = ExecuteQueryForObject<Person>("SelectByPersonId", Id);
    
                return person;
    
            }
    
        }
    
    }

     

     IBatisNet开发使用小结 之一
     本文示例项目源码下载
     动软代码生成器新增对IBatisNet的代码生成插件

  • 相关阅读:
    JS数组去重
    正则表达式验证邮箱手机号等
    js中的事件委托
    c++刷题(6/100)最长上升子序列
    c++刷题(3/100)数独,栈和队列
    在express中HMR(合并express和webpack-dev-server)
    面试整理(3)js事件委托
    面试整理(2)跨域:jsonp与CORS
    面试整理(1):原生ajax
    styled-components真的好吗?
  • 原文地址:https://www.cnblogs.com/liyuxin/p/2565982.html
Copyright © 2011-2022 走看看