接着上一篇Nhibernate分页测试,最近一直在接触Nhibernate,接触的越多、了解越深,越是感觉他的强大,很多功能都封装的很好,对数据操作是那么的简单。接下来介绍的是MVC+Nhibernate分页的应用:

1.配置

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  
<session-factory>
    
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    
<property name="connection.connection_string">
      Data Source
=.;Initial Catalog=NhibernateDemoDB;Persist Security Info=True;Integrated Security=SSPI;
    
</property>
    
<property name="adonet.batch_size">10</property>
    
<property name="show_sql">true</property>
    
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
    
<property name="use_outer_join">true</property>
    
<property name="command_timeout">10</property>
    
<property name="query.substitutions">true 1false 0, yes 'Y', no 'N'</property>
    
<property name="proxyfactory.factory_class">
      NHibernate.ByteCode.Castle.ProxyFactoryFactory,
      NHibernate.ByteCode.Castle
    
</property>
    
<mapping assembly="NhibernateDemo.Data"/>
  
</session-factory>
</hibernate-configuration>

 配置想必接触过Nhibernate的人或多或少都有所了解,在这就不多加说明了。

2.映射

传统对象和关系数据库之间的映射是用一个XML文档(XML document)来定义的,这个映射文档被设计为易读的,并且可以手工修改。而我更喜欢的是用Fluent Nhibernate一个开源的框架,有了它就可以脱离传统的Nhibernate配置文件配置映射文件的方式,而采用强类型方式映射。如下:

    public class CustomerMap:ClassMap<Customer>
    {
        
public CustomerMap()
        {
            Id(m 
=> m.Id);

            Map(m 
=> m.Name);

            Map(m 
=> m.Tel);

            Map(m 
=> m.Address);

            Map(m 
=> m.CreateDate);

            Map(m 
=> m.Sex);
        }
    }

3.创建ISession

Nhibernate操作数据库要通过ISession(NHibernate的工作单元),框架Fluent Nhibernate下创建ISession可看Fluent NHibernate的初识。如下

    public class NHibernateHelper
    {
        
private static Configuration configuration = null;
        
private static ISessionFactory sessionFactory = null;

        
public static void CreateConfiguration()
        {
            configuration 
= new Configuration().Configure();
        }

        
public static Configuration Configuration
        {
            
get
            {
                
if (configuration == null)
                {
                    CreateConfiguration();
                }
                
return configuration;
            }
            
set { configuration = value; }
        }

        
public static ISessionFactory SessionFactory
        {
            
get
            {
                
if (sessionFactory == null)
                {
                    
if (Configuration == null)
                    {
                        CreateConfiguration();
                    }
                    FluentConfiguration fluentConfiguration 
= Fluently.Configure(Configuration);
                    
string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                    
string assemblyFile = Path.Combine(path, "bin/NhibernateDemo.Data.dll");
                    fluentConfiguration.Mappings(
delegate(MappingConfiguration m)
                    {
                        Assembly assembly 
= Assembly.LoadFrom(assemblyFile);
                        m.HbmMappings.AddFromAssembly(assembly);
                        m.FluentMappings.AddFromAssembly(assembly).Conventions.AddAssembly(assembly);
                    });
                    
return fluentConfiguration.BuildSessionFactory();
                }
                
else
                {
                    
return sessionFactory;
                }
            }
        }

        
public static ISession CreateSession()
        {
            
return SessionFactory.OpenSession();
        }
        
    }

CreateSession方法创建了一个ISession。

4.分页方法

        /// <summary>
        
/// 获取分页
         
/// </summary>
        
/// <param name="pageStart"></param>
        
/// <param name="pageLimit"></param>
        
/// <returns></returns>
        public IList<Customer> GetCustomerPageModel(int pageStart, int pageLimit)
        {
            
//HQL查询
            IList<Customer> customerList = Session.CreateQuery("from Customer")
                .SetFirstResult(pageStart 
* pageLimit)
                .SetMaxResults(pageLimit)
                .List
<Customer>();
            
return customerList;

            
//条件查询
            
//return Session.CreateCriteria(typeof(Customer))
            
//    .SetProjection(Projections.ProjectionList()
            
//    .Add(Projections.Property("Id"), "Id")
            
//    .Add(Projections.Property("Name"), "Name")
            
//    .Add(Projections.Property("Tel"), "Tel")
            
//    .Add(Projections.Property("Address"), "Address")
            
//    .Add(Projections.Property("Sex"), "Sex")
            
//    .Add(Projections.Property("CreateDate"), "CreateDate"))
            
//    .AddOrder(Order.Asc("Id"))
            
//    .SetFirstResult(pageStart * pageLimit)
            
//    .SetMaxResults(pageLimit)
            
//    .SetResultTransformer(Transformers.AliasToBean(typeof(Customer)))
            
//    .List<Customer>();

            
//SQL查询
            
//IList<Customer> customerList = Session.CreateSQLQuery("SELECT * FROM Customer")
            
//    .SetFirstResult(pageStart*pageLimit)
            
//    .SetMaxResults(pageLimit)
            
//    .SetResultTransformer(Transformers.AliasToBean<Customer>()).List<Customer>(); 
            
//return customerList;
        }

在Nhibernate里实现分页用 SetFirstResult 和SetMaxResults实现,SetFirstResult 简单的理解就是从第几条记录开始,SetMaxResults是取几条记录。如上代码,列出了Nhibernate三种查询分页的方式,使用哪种方式就看个人爱好了。

以下是运行后的截图:

客户端采用JQuery.

项目中碰到了用jQuery从后台获取的json格式的日期的字符串,需要将此字符串转换成JavaScript的日期对象,以下是网上找的解决方法:

//转换json格式的日期(如:{ServerDatetime:"\/Date(1278930470649)\/"})转换为Javascript的日期对象
function ConvertJSONDateToJSDateObject(JSONDateString) {
     var date 
= new Date(parseInt(JSONDateString.replace("/Date(""").replace(")/"""), 10));
     
return date;           
}

源码:NhibernateDemo.rar

 posted on 2011-01-03 02:48  john chen  阅读(2652)  评论(0编辑  收藏  举报