三、框架搭建之DAO(核心)

本节内容介绍Nhibernate所封装的数据库访问层。不过我加入了泛型进行封装。大概思路:首先,我们有一个接口层,还有一个对应的实现层;在接口层中我们先定义一个父接口,父接口中定义每一个接口都可能会用到的方法,然后其他接口继承此父接口即可。如果子接口需要使用特殊的方法,可以单独定义在子接口中;在接口实现层中也是类似的,定义一个父类,里面写好实现了接口层父接口的方法,其他实现层同样继承父接口和实现层父类,接口层中定义的特殊方法也在对应的实现类中进行实现。这样做可以有效的把相似的重复代码(重复的增删改查)尽可能的减少,并且这样设计比较灵活,重复的写一次就行了,特殊的单独写,维护起来也比较方便。这样描述可能不是很明白,下面详细介绍实现步骤。

一、数据库访问接口层IDAO

1. 在解决方案上右键新建一个类库,命名为IDAO,用来存放Nhibernae数据库访问接口层代码,并添加引用上一节所讲的实体层Model;

2. 在类库中添加一个父接口,命名为IDAO,并定义常用的方法,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IDAO
{
    public interface IDAO<T>
    {
        /// <summary>
        /// 添加实体
        /// </summary>
        /// <param name="entity"></param>
        int Add(T entity);

        /// <summary>
        /// 修改实体
        /// </summary>
        /// <param name="entity"></param>
        void Update(T entity);

        /// <summary>
        /// 保存或修改实体
        /// </summary>
        /// <param name="customer"></param>
        void SaveOrUpdate(IList<T> list);

        /// <summary>
        /// 删除实体
        /// </summary>
        /// <param name="entity"></param>
        void Delete(T entity);

        /// <summary>
        /// 按条件删除
        /// </summary>
        /// <param name="sqlWhere">删除条件</param>
        void Delete(string sqlWhere);

        /// <summary>
        /// 根据ID得到实体
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        T Get(int id);

        /// <summary>
        /// 根据ID得到实体
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
       T Load(int id);

        /// <summary>
        /// 得到所有实体
        /// </summary>
        /// <returns></returns>
       IList<T> LoadAll();

       /// <summary>
       /// 按条件排序得到前N条记录
       /// </summary>
       /// <param name="top">获取条数</param>
       /// <param name="field">排序字段</param>
       /// <param order="field">排序方式,升序asc,降序desc</param>
       /// <returns></returns>
       IList<T> QueryTop(int top, string field, string order);

        /// <summary>
        /// 根据条件得到实体
        /// </summary>
        /// <param name="sqlWhere">查询条件</param>
        /// <returns></returns>
        IList<T> Where(string sqlWhere);

        /// <summary>
        /// 得到统计数量
        /// </summary>
        /// <param name="strWhere">查询条件</param>
        /// <returns></returns>
        int GetRecordCount(string strWhere);

        /// <summary>
        /// 分页获取数据列表
        /// </summary>
        /// <param name="PageSize">每页获取数据条数</param>
        /// <param name="PageIndex">当前页是第几页</param>
        /// <param name="strWhere">查询条件</param>
        /// <returns></returns>
        IList<T> GetPageList(int PageSize, int PageIndex, string strWhere);

        /// <summary>
        /// 根据数据字典父编码和编码获取名称
        /// </summary>
        /// <param name="parentNumber">父编码</param>
        /// <param name="number">编码</param>
        /// <returns></returns>
        string GetName(string parentNumber, string number);

        /// <summary>
        /// 获取该父编码下最大编码
        /// </summary>
        /// <param name="parentNumber">父编码</param>
        /// <returns></returns>
        int GetMaxNumber(string parentNumber);
    }
}

3.定义好了父接口,下面定义实现接口,还是以IT_Role为例,代码如下:

using System;
using Model;

namespace IDAO
{
    public interface IT_RoleDAO : IDAO<T_Role>
    {
    }
}

这样,IT_Role就拥有了IDAO定义了的方法,如果IT_Role有特殊方法,直接添加在IT_Role里面即可,以IT_AreaDAO为例,代码如下:

using System;
using Model;

namespace IDAO
{
    public interface IT_AreaDAO : IDAO<T_Area>
    {
        /// <summary>
        /// 获取
        /// </summary>
        /// <param name="parentNumber"></param>
        /// <returns></returns>
        int GenerateAreaNumber(string parentNumber);
    }
}

最后,我们看一下IDAO层的文件目录:

二、NHibernate数据库访问实现层NHibernateDAO(核心)

1. 在解决方案上右键新建一个类库,命名为NHibernateDAO,用来存放Nhibernae数据库访问实现层代码,并添加引用上一节所讲的实体层Model和接口层IDAO;

2. 右键点击引用,选择“管理NuGet程序包”,选择“联机”,搜索“Spring.NET”,在搜索结果中选择“Spring.Net NHibernate 4 support”安装。该安装包括了一个NHibernate,但是还不够,同样的方法搜索NHibernate,并安装,添加Nhibernate就不上图了,添加Spring.NET的界面图如下:

3.添加数据库访问层父类NHibernateDAO,NHibernateDAO类中的SessionFactory属性的GetCurrentSession方法可以实例化ISession,实例化ISession后的对象可以调用NHibernate下的数据库操作方法,具体他们之间怎么实例化,先上代码,后面再来解释。

NHibernateDAO代码如下,继承INHibernateSessionFactory和实现IDAO父接口:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Model;
using IDAO;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.Linq;
using Spring.Data.NHibernate.Support;
using NHibernate.Cfg;
using System.Text;

namespace NHibernateDAO
{
    [Spring.Stereotype.Repository]
    public class NHibernateDAO<T> : IDAO<T>
    {
        public ISessionFactory SessionFactory { get; set; }
        /// <summary>
        /// 获取Session
        /// </summary>
        public ISession Session
        {
            get
            {
                return SessionFactory.GetCurrentSession();
            }
        }

        /// <summary>
        /// 当前实体对应的表名
        /// </summary>
        public string TableName
        {
            get { return typeof(T).ToString().Substring(typeof(T).ToString().LastIndexOf('.') + 1); }
        }
        /// <summary>
        /// 添加实体
        /// </summary>
        /// <param name="entity"></param>
        public int Add(T entity)
        {
                using (ITransaction transaction = Session.BeginTransaction())
                {
                    try
                    {
                        int id = (int)Session.Save(entity);
                        Session.Flush();
                        transaction.Commit();
                        return id;
                    }
                    catch (HibernateException)
                    {
                        transaction.Rollback();
                        throw;
                    }
            }
        }

        /// <summary>
        /// 修改实体
        /// </summary>
        /// <param name="entity"></param>
        public void Update(T entity)
        {
                using (ITransaction transaction = Session.BeginTransaction())
                {
                    try
                    {
                        Session.Update(entity);
                        Session.Flush();
                        transaction.Commit();
                    }
                    catch (HibernateException)
                    {
                        transaction.Rollback();
                        throw;
                    }
            }
        }
        /// <summary>
        /// 保存或修改实体
        /// </summary>
        /// <param name="customer"></param>
        public void SaveOrUpdate(IList<T> list)
        {
                using (ITransaction transaction = Session.BeginTransaction())
                {
                    try
                    {
                        foreach (var entity in list)
                        {
                            Session.SaveOrUpdate(entity);
                        }
                        Session.Flush();
                        transaction.Commit();
                    }
                    catch (HibernateException)
                    {
                        transaction.Rollback();
                        throw;
                    }
            }
        }

        /// <summary>
        /// 删除实体
        /// </summary>
        /// <param name="entity"></param>
        public void Delete(T entity)
        {
                using (ITransaction transaction = Session.BeginTransaction())
                {
                    try
                    {
                        Session.Delete(entity);
                        Session.Flush();
                        transaction.Commit();
                    }
                    catch (HibernateException)
                    {
                        transaction.Rollback();
                        throw;
                    }
                }
        }

        /// <summary>
        /// 按条件删除
        /// </summary>
        /// <param name="sqlWhere">删除条件</param>
        public void Delete(string sqlWhere)
        {
                using (ITransaction transaction = Session.BeginTransaction())
                {
                    try
                    {
                        Session.Delete(string.Format("from {0} Where {1}", TableName, sqlWhere));
                        Session.Flush();
                        transaction.Commit();
                    }
                    catch (HibernateException)
                    {
                        transaction.Rollback();
                        throw;
                    }
            }
        }

        /// <summary>
        /// 根据ID得到实体
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public T Get(int id)
        {
            return Session.Get<T>(id);
        }
        /// <summary>
        /// 根据ID得到实体
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public T Load(int id)
        {
            return Session.Load<T>(id);
        }
        /// <summary>
        /// 得到所有实体
        /// </summary>
        /// <returns></returns>
        public IList<T> LoadAll()
        {
            return Session.Query<T>().ToList();
        }

        /// <summary>
        /// 按条件排序得到前N条记录
        /// </summary>
        /// <param name="top">获取条数</param>
        /// <param name="field">排序字段</param>
        /// <param order="field">排序方式,升序asc,降序desc</param>
        /// <returns></returns>
        public IList<T> QueryTop(int top, string field, string order)
        {
            if (order == "asc")
            {
                return Session.CreateCriteria(typeof(T)).SetMaxResults(top).AddOrder(Order.Asc(field)).List<T>();
            }
            else
            {
                return Session.CreateCriteria(typeof(T)).SetMaxResults(top).AddOrder(Order.Desc(field)).List<T>();
            }
        }

        /// <summary>
        /// 根据条件得到实体
        /// </summary>
        /// <param name="sqlWhere">查询条件</param>
        /// <returns></returns>
        public IList<T> Where(string sqlWhere)
        {
            StringBuilder strSql = new StringBuilder(string.Format("from {0} c", TableName));
            if (!string.IsNullOrEmpty(sqlWhere))
            {
                strSql.Append(string.Format(" where {0}", sqlWhere));
            }
            return Session.CreateQuery(strSql.ToString()).List<T>();
        }

        /// <summary>
        /// 得到统计数量
        /// </summary>
        /// <param name="strWhere">查询条件</param>
        /// <returns></returns>
        public int GetRecordCount(string sqlWhere)
        {
            StringBuilder strSql = new StringBuilder(string.Format("select count(1) from {0} c", TableName));
            if (!string.IsNullOrEmpty(sqlWhere))
            {
                strSql.Append(string.Format(" where {0}", sqlWhere));
            }
            return (int)Session.CreateSQLQuery(strSql.ToString()).UniqueResult();
        }

        /// <summary>
        /// 分页获取数据列表
        /// </summary>
        /// <param name="PageSize">每页获取数据条数</param>
        /// <param name="PageIndex">当前页是第几页</param>
        /// <param name="strWhere">查询条件</param>
        /// <returns></returns>
        public IList<T> GetPageList(int PageSize, int PageIndex, string sqlWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append(string.Format("select top {0} * from {1} where ID not in(select top  ", PageSize,
                TableName));
            strSql.Append(PageSize * (PageIndex - 1));
            strSql.Append(string.Format(" ID from {0}", TableName));
            if (!string.IsNullOrEmpty(sqlWhere))
            {
                strSql.Append(string.Format(" where {0} ) and {0}", sqlWhere));
            }
            else
            {
                strSql.Append(")");
            }
            return Session.CreateSQLQuery(strSql.ToString()).AddEntity(typeof(T)).List<T>();
        }

        /// <summary>
        /// 根据数据字典父编码和编码获取名称
        /// </summary>
        /// <param name="parentNumber">父编码</param>
        /// <param name="number">编码</param>
        /// <returns></returns>
        public string GetName(string parentNumber, string number)
        {
            string[] num = number.Split(',');
            List<string> list = new List<string>();
            list.AddRange(num);
            IQueryable<string> name = from q in Session.Query<T_Dictionary>()
                                      where q.ParentNumber == parentNumber && list.Contains(q.Number)   orderby q.Number
                                      select q.Name;
            string nameStr = "";
            foreach (string n in name)
            {
                nameStr += n + ",";
            }
            return nameStr.Contains(",") ? nameStr.Substring(0, nameStr.Length - 1) : nameStr;
        }

        /// <summary>
        /// 获取该父编码下最大编码
        /// </summary>
        /// <param name="parentNumber">父编码</param>
        /// <returns></returns>
        public int GetMaxNumber(string parentNumber)
        {
            string strSql =
                string.Format(
                    "select case when MAX(cast(substring(Number,len(Number)-3,4) as int)) is null then 0 else MAX(cast(substring(Number,len(Number)-3,4) as int)) end  from {0} where ParentNumber='{1}'",
                    TableName, parentNumber);
            return ++Session.CreateQuery(strSql).List<int>()[0];
        }

    }
}

4. 添加一个数据库访问层实现类,以T_RoleDAO为例:

using System;
using System.Collections;
using IDAO;
using Model;

namespace NHibernateDAO
{
    public class T_RoleDAO : NHibernateDAO<T_Role>, IT_RoleDAO
    {

    }
}

同样滴,继承NHibernateDAO并实现IT_RoleDAO接口,他便拥有了他们定义好的方法。如果有特殊方法代码如下:

using System;
using System.Collections;
using Model;
using IDAO;
using System.Text;
using System.Collections.Generic;

using NHibernate;

namespace NHibernateDAO
{
    public class T_AreaDAO : NHibernateDAO<T_Area>,IT_AreaDAO
    {
        public int GenerateAreaNumber(string parentNumber)
        {
            string sqlStr = string.Format(@"select case when MAX(cast(Number as int)) is null  then 0
		                    else MAX(cast(Number as int)) end
                            from {0}
                            where ParentNumber={1}", TableName, parentNumber);
            return ++Session.CreateQuery(sqlStr).List<int>()[0];
        }
    }
}

5. 下面,就来解释一下他们都是怎么实例化的。这里就用到Spring.NET依赖注入的方式实现,先看配置文件。在NHibernateDAO类库下添加文件夹Config,用来存放配置文件,然后添加一个命名为objects.xml的xml。这里必须定义每一个数据库访问层对象,不能说他们都继承NHibernateDAO,只定义NHibernateDAO,这样的话会报错,因为后面BLL层要调用DAO层,他们之间是一一对应的,这里先简单提一下,后面讲到就明白了。代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">

  <!--T_AreaDAO,管理T_Area的对象-->
  <object id="T_AreaDAO" type="NHibernateDAO.T_AreaDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_AssessmentCoefficientDAO,管理T_AssessmentCoefficient的对象-->
  <object id="T_AssessmentCoefficientDAO" type="NHibernateDAO.T_AssessmentCoefficientDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_AuthorityDAO,管理T_Authority的对象-->
  <object id="T_AuthorityDAO" type="NHibernateDAO.T_AuthorityDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_ClientDAO,管理T_Client的对象-->
  <object id="T_ClientDAO" type="NHibernateDAO.T_ClientDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_DictionaryDAO,管理T_Dictionary的对象-->
  <object id="T_DictionaryDAO" type="NHibernateDAO.T_DictionaryDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_DrugDAO,管理T_Drug的对象-->
  <object id="T_DrugDAO" type="NHibernateDAO.T_DrugDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_InvoicingCollectDetailDAO,管理T_InvoicingCollectDetail的对象-->
  <object id="T_InvoicingCollectDetailDAO" type="NHibernateDAO.T_InvoicingCollectDetailDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_InvoicingDetailDAO,管理T_InvoicingDetail的对象-->
  <object id="T_InvoicingDetailDAO" type="NHibernateDAO.T_InvoicingDetailDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_LogDAO,管理T_Log的对象-->
  <object id="T_LogDAO" type="NHibernateDAO.T_LogDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_MenuDAO,管理T_Menu的对象-->
  <object id="T_MenuDAO" type="NHibernateDAO.T_MenuDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_OpHistoryDAO,管理T_OpHistory的对象-->
  <object id="T_OpHistoryDAO" type="NHibernateDAO.T_OpHistoryDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_RoleDAO,管理T_Role的对象-->
  <object id="T_RoleDAO" type="NHibernateDAO.T_RoleDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_UserDAO,管理T_User的对象-->
  <object id="T_UserDAO" type="NHibernateDAO.T_UserDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--V_InvoicingCollectDetailDAO,管理V_InvoicingCollectDetail的对象-->
  <object id="V_InvoicingCollectDetailDAO" type="NHibernateDAO.V_InvoicingCollectDetailDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--V_InvoicingDetailDAO,管理V_InvoicingDetail的对象-->
  <object id="V_InvoicingDetailDAO" type="NHibernateDAO.V_InvoicingDetailDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--V_TrackDAO,管理V_Track的对象-->
  <object id="V_TrackDAO" type="NHibernateDAO.V_TrackDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--V_CoverageRateDAO,管理V_CoverageRate的对象-->
  <object id="V_CoverageRateDAO" type="NHibernateDAO.V_CoverageRateDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--V_AssessDAO,管理V_Assess的对象-->
  <object id="V_AssessDAO" type="NHibernateDAO.V_AssessDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

  <!--T_BuyDetailDAO,管理T_BuyDetail的对象-->
  <object id="T_BuyDetailDAO" type="NHibernateDAO.T_BuyDetailDAO,NHibernateDAO">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

</objects>

格式如上述代码,先定义一个objects根节点,然后再objects中定义每一个数据库访层,type指定“命名空间.类名,命名空间”,property指定属性,name必须与NHibernateDAO中的SessionFactory相同,由于每一个数据库访问层都继承了NHibernateDAO,所有他们就拥有了NHibernateDAO的属性SessionFactory,ref指定SessionFactory实例化的对象,NHibernateSessionFactory是NHibernate框架封装的数据库访问类。所以,我们看到我们没有在代码中实实例化SessionFactory,只是定义了一个属性,而是通过Spring.NET的配置文件来把SessionFactory实例化的,这就是所谓的依赖注入,也交控制反转。

6. 细心的撸友可以发现了,数据库操作的类和方法我们定义好了,但是数据访问的连接字符串还没有,下面就来配置数据库访问文件。同样在NHibernateDAO的Config中添加DataAccess.xml,代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
         xmlns:db="http://www.springframework.net/database"
         xmlns:tx="http://www.springframework.net/tx"
         >
  <!--描述-->
  <description>
    数据访问的配置信息
    包括:DbProvider
    NHibernate
  </description>

  <!-- 通过主应用程序的上下文配置文件引用 -->
  <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
    <property name="ConfigSections" value="spring/databaseSettings"/>
  </object>

  <!-- 数据库的配置 -->
  <db:provider id="DbProvider"
                   provider="SqlServer-2.0"
                   connectionString="Data Source=${db.server};Database=${db.database};User ID=${db.userid} ;PassWord=${db.password}"
               />

  <!-- NHibernate 配置 -->

  <!-- 可以通过 name 为其指定别名 name="SessionFactory" -->
  <object id="NHibernateSessionFactory"
          type="Spring.Data.NHibernate.LocalSessionFactoryObject,Spring.Data.NHibernate4"
          >

    <!-- 关于数据库连接的配置,直接使用 DbProvider 中的设置,这样,不需要为 Hibernate 再提供连接串和驱动 -->
    <property name="DbProvider" ref="DbProvider"/>

    <!-- 包含有映射文件的程序集,需要分析的hbm程序集名称 -->
    <property name="MappingAssemblies">
      <list>
        <value>Model</value>
      </list>
    </property>

    <!-- 其他的参数 -->
    <property name="HibernateProperties">
      <dictionary>
        <!-- 方言 -->
        <entry key="dialect" value="NHibernate.Dialect.MsSql2008Dialect"/>
        <entry key="use_proxy_validator" value="false" />
        <entry key="show_sql" value="true"/>

      </dictionary>
    </property>

    <!-- 必须增加此项说明,与 Spring 的声明式事务集成 -->
    <property name="ExposeTransactionAwareSessionFactory" value="true" />

  </object>

</objects>

其中connectionString="Data Source=${db.server};Database=${db.database};User ID=${db.userid} ;PassWord=${db.password}中,我并没有明确指定他们访问地址、数据库等。这是一种类似定义一个变量的方式指定他们的访问地址、数据库等信息的,具体变量的值是什么,会在后面web层的config配置文件中定义,按这个格式写就行,先不用纠结。这样也方便维护。

最后,还是看一下NHibernateDAO层的目录结构:



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 18:15:56

三、框架搭建之DAO(核心)的相关文章

struts2框架搭建

struts2 框架搭建 1 拷贝核心的jar 包 2 编写struts2 的配置文件 <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&

(三) Angular2项目框架搭建心得

前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2.*版本的面目全非,不过宽容点来看这个强大的框架,升级到ng2肯定是一件好事情,虽然截至目前ng2还存在或多或少需要完善的地方,但是ng2做到了留下并强化ng1好的部分,移除或改善其不好的部分,并且基于许多较新Web技术来开发,不去看从ng1迁移到ng2的门槛和工作量的话,ng2的编程体验是很酷炫的. 目前n

微信公众平台开发教程(三) 基础框架搭建

微信公众平台开发教程(三) 基础框架搭建 上一章,我们已经初步讲解了微信公众账号开发的基本原理,今天我们来探索设计实现. 首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此.具体见下图. 主要功能介绍如下: 1)请求接口层.处理HTTP请求,及响应 2)分发层.由接口层传入请求,然后具体分析请求类型,分发至不同的处理器 3)业务逻辑层.这里是我们的具体业务逻辑了,根据请求,实现具体的业务逻辑. 4)数据层.我们在实现某个应用时可能需要访问数据,可以是数据库或者是文件.如果是简单应

webapi框架搭建-安全机制(三)-基于角色的权限控制

webapi框架搭建系列博客 上一篇已经完成了"身份验证",如果只是想简单的实现基于角色的权限管理,我们基本上不用写代码,微软已经提供了authorize特性,直接用就行. Authorize特性的使用方法 配置Authorize 比较简单,直接上代码 using System.Collections.Generic; using System.Net.Http; using System.Security.Claims; using System.Web.Http; using we

SSM框架搭建之数据库连接池(三)

SSM框架搭建之数据库连接池(三) Spring提供了两个这样的数据源(都位于org.springframework.jdbc.datasource程序包里):DriverManagerDataSource:这个类实现了javax.sql.DataSource接口,但它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接.因此,这个数据源类比较适合在单元测试 或简单的独立应用中使用,因为它不需要额外的依赖类. SingleConnectionD

ssh框架搭建Struts2.06+spring2.5+hibernate3.2整合实例代码教程步骤

原创整理不易,转载请注明出处:ssh框架搭建Struts2.06+spring2.5+hibernate3.2整合实例代码教程步骤 代码下载地址:http://www.zuidaima.com/share/1760074977233920.htm 最近闲来无事可做,于是开始学习struts2.Struts2和struts1.webwork2有什么区别我也不说了,网上有很多这方面的资料.以前在项目中从未使用过struts,一直使用spring+hibernate,现在既然学习了Struts,也不能

spring MVC3原理教程及其框架搭建实例

原文:spring MVC3原理教程及其框架搭建实例 http://www.zuidaima.com/share/1816340522191872.htm 一.前言: 大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了.Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀. 官方的下载网址是:http://www.springsource.org/download   (本文使用是的

struts2+hibernate+spring注解版框架搭建以及简单测试(方便脑补)

为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->Maven Project--->Next(之后界面如下所示:) --->Next(点击next之后出现如下界面:选择最后一个 maven-archetype-webapp,然后点击next) --->Next(点击next之后出现如下界面,然后选择好组织号,工程号,版本号即可),最后点击Fi

SSM框架搭建教程(从零开始,图文结合)

1.准备 IntelliJ IDEA Tomcat JDK Maven mysql spring.springmvc.mybatis 了解 现在假设如上条件你都具备,那么通过我这篇博客 你一定可以整合出 SSM 框架,完成如下效果 整个博客共分为三部分: 建立 基于 Maven 的 WEB 项目,启动 Tomcat ,项目启动 整合 Mybatis+Spring ,进行单元测试 可以完成从数据库查询出数据功能 整合 Mybaits+Spring+SpringMVC,输入Url 完成整个 MVC