• .net企业级架构实战之4——Spring.net下的nHibernate数据访问模板


      在spring.net中集成nHibernate可以获得许多值得称道的特性。比如:基于元标记(meta Attributes)的事务支持、对物理数据库的抽象、对数据层进行切面式拦截。

      好处是不少,但首先要学会配置。为了这个集成的环境,建立一个配置文件 applicationContext.xml :

    Code

      OK,这里有几处需要说明:
       一、woodigg.DAO.SQLProvider 是一个数据结构类,用以描述物理数据库的相关信息,诸如连接串、元数据信息等。这里其实就用到了连接串,在配置中植入位置、帐号信息等就能连接到数据源。这个SQLProvider类结构如下:

    Code

     二、在SessionFactory配置中,指明需要环境映射的程序集名称,通俗说法是:哪些层会在集成环境中,被直接引用?这里以示例项目来说是:woodigg.DAO和woodigg.Model,分别为实体(上一节中生成的一堆.cs实体)层,和数据映射文件(被嵌入在项目中的hbm.xml文件)所在的数据访问层。
    三、HibernateProperties节中,可以指定调试时是否显示生成的sql语句。同时,能配置缓存事宜:此处用到的是NHibernate.Caches.SysCache。
    四、配置HibernateTemplate。nHibernate的模板,既nHibernate项目已经为开发者写好了一套通用的方法,能便捷的操作数据库,此处将SessionFactory植入引用即能让它工作起来。(并不是所有的复杂SQL,它都能做到,不能完成的功能,我们得自己写,这个马上会交待)。
    五、DaoTemplate,就是我自己写的一个基于以上配置的复杂模板,能完成诸如Distinct,top,调用分页存储过程等一干复杂SQL功能,抛出来做点贡献吧:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Reflection;

    using NHibernate;
    using NHibernate.Cfg;
    using NHibernate.Engine;
    using NHibernate.Criterion;
    using Spring.Dao;
    using Spring.Data.NHibernate.Support;
    using woodigg.model;
    using log4net;

    namespace woodigg.DAO
    {
        
    ParamInfo结构

        
    /// <summary>
        
    /// 继续自HibernateDaoSupport抽象类
        
    /// HibernateDaoSupport基类拥有HibernateTemplate
        
    /// </summary>

        public class DaoTemplate : HibernateDaoSupport
        
    {
            
    private string _message;
            
    public string Message
            
    {
                
    get return _message; }
                
    set { _message = value; }
            }


            
    /// <summary>
            
    /// 泛型读取
            
    /// </summary>
            
    /// <param name="obj"></param>
            
    /// <param name="id"></param>

            T LoadFromId(object id)

            
    /// <summary>
            
    /// 泛型存储
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="obj"></param>

            bool Save(T obj)

            
    /// <summary>
            
    /// 泛型更新
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="obj"></param>

            bool Update(T obj)

            
    /// <summary>
            
    /// 泛型删除
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="obj"></param>

            bool Delete(T obj)

            
    /// <summary>
            
    /// 条件删除
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="where"></param>

            bool Delete(string where)

            
    /// <summary>
            
    /// 泛型搜索
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="where"></param>

            IList Search(string where)

            
    /// <summary>
            
    /// 泛型搜索 - DISTINCT
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="field">列名,用","分开,不带别名</param>
            
    /// <param name="where"></param>
            
    /// <param name="alias">别名</param>

            IList SearchDistinct(string where,string field,string alias)

            
    /// <summary>
            
    /// 基于表达式的排序查询
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="where"></param>
            
    /// <param name="propertyName"></param>
            
    /// <param name="ascending"></param>

            IList SearchWithOrder(string where, string propertyName, bool ascending)

            
    /// <summary>
            
    /// 执行存储过程(返回bool)
            
    /// </summary>
            
    /// <param name="spName">名称</param>
            
    /// <param name="paramInfos">参数表</param>

            bool ExecuteStoredProc2(string spName, IList paramInfos)

            
    /// <summary>
            
    /// 执行存储过程(返回ILIST)
            
    /// </summary>
            
    /// <param name="spName">名称</param>
            
    /// <param name="paramInfos">参数表</param>

            IList ExecuteStoredProc(string spName, IList paramInfos)

            
    /// <summary>
            
    /// 获取记录数
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <returns></returns>

            int GetRecordCount(string where)

            
    /// <summary>
            
    /// 获取记录数
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <returns></returns>

            int GetRecordCount(string where,string cols)

            
    /// <summary>
            
    /// 求某一字段最大值
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="where"></param>
            
    /// <param name="col"></param>
            
    /// <returns></returns>

            int GetMaxNum(string where, string col)

            
    /// <summary>
            
    /// 求某一字段和
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="where"></param>
            
    /// <param name="col"></param>
            
    /// <returns></returns>

            int GetSumNum(string where, string col)

            
    /// <summary>
            
    /// 求某一字段平均值
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="where"></param>
            
    /// <param name="col"></param>
            
    /// <returns></returns>

            int GetAvgNum(string where, string col)

            
    /// <summary>
            
    /// 获取记录数(全文检索)
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <returns></returns>

            int GetRecordCount4Fulltext(string where,string tbName)

            
    /// <summary>
            
    ///  通过where条件查询获取分页数据
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="where"></param>
            
    /// <param name="varQuerysort">排序</param>
            
    /// <param name="Start"></param>
            
    /// <param name="Max"></param>
            
    /// <returns></returns>

            IList GetPageEntites(string where,string varQuerysort, int Start, int Max)

            
    /// <summary>
            
    /// 通过存储过程查询分页信息
            
    /// </summary>
            
    /// <param name="tableName">表名</param>
            
    /// <param name="Primarykeyname"></param>
            
    /// <param name="colName">列名集合</param>
            
    /// <param name="orderCol">排序列名</param>
            
    /// <param name="pageSize">页尺寸</param>
            
    /// <param name="pageIdx">当前页</param>
            
    /// <param name="orderType">升降序,true-0为升序,false-非0为降序</param>
            
    /// <param name="condition">条件</param>
            
    /// <returns></returns>

            public DataTable GetPageEntitesByStoredProc(string tableName, string Primarykeyname, string colName, string orderCol,int pageSize, int pageIdx, bool orderType, string condition)

            
    /// <summary>
            
    /// 将字符里的列表分解出来
            
    /// </summary>
            
    /// <returns></returns>

            internal static string[] SplitsColumnNames(string columns, char separator)


            
    // -------- SELECT TOP 方法s --------- //
            /// <summary>
            
    /// 获取一个基于分页程序的泛型列表
            
    /// 集合中仅仅只有Id字段被赋值,它用于缓存
            
    /// </summary>
            
    /// <typeparam name="T">类型</typeparam>
            
    /// <param name="tableName">表名</param>
            
    /// <param name="where">条件</param>
            
    /// <param name="topN">头多少条</param>
            
    /// <param name="orderCol">排序字段</param>
            
    /// <param name="ascending">顺序</param>    
            
    /// <returns>Id列表</returns>

            IList GetToplistOnlyhasId(string tableName,string where, int topN,string orderCol,bool ascending)      
        }

    }


    这是内个配合使用的sql server分页存储过程,原来从网上摘的,动手改过两次以适配distinct取数据:

    Code

      最后,要让这个环境在程序中生效,得在web.config中加载它:

    Code

      先写到这里吧,博客园的编辑器对机器配置要求不低,粘贴几段代码,界面几乎不能动弹,做罢了。下一回,将介绍怎么应用这个集成的环境。


      这里放出一个项目的mini demo:精简版spring.net集成Demo,点击下载

  • 相关阅读:
    Hadoop-MyEclipse安装配置
    grid搜索最优参数
    python数据集处理
    集合框架
    Java泛型集合
    python机器学习工具包
    IO流
    Eclipse导入Hadoop源码项目及编写Hadoop程序
    Hadoop日志以及日志的格式和命名组成
    VIM键盘映射 (Map)
  • 原文地址:https://www.cnblogs.com/moye/p/1330193.html
Copyright © 2020-2023  润新知