An Introduce to NHibernate
           PART 1




           LOGO
            J九日
内容


SQL Helper vs. NHibernate
Object-Relational Mapping
   关系模型
   为什么使用 ORM?
Hibernate 含义
NHibernate Mapping
核心类型
Exercise: ExBlogger
SQL Helper vs. NHibernate

Working with SQL Helper

                           上层应用/Business Logic
          太暧昧
                                    创建数据对象


                           编写SQL


                  设计数据模型

                                 以数据表为核心
       设计数据表                     模型仅为装载数据
                                 底层可能包含业务逻辑
                                 底层与上层关系紧密
    前期的设计很
                                 受PetShop4的影响
    可能面目全非
                                     “Data-Driven
                                          Design”
SQL Helper vs. NHibernate

Working with NHibernate

                                     各种应用程序

    解决O-R不对                            设计应用
    称,转移主                              服务契约
    要关注点!
                          设计业务                   Cache
                          领域对象
                                                 Search
                 设计资源
                  库契约
                                                 NoSQL
                             以业务对象为核心
  NHibernate 资
                             资源库不关心业务逻辑
    源库实现
                             应用层不关心契约实现
                             促进面向契约编程
   设计数据表
                          Domain-Driven Design
Object-Relational Mapping

Relational Model


      Relation




                   Relation




      Relation
Object-Relational Mapping

Relational Model Concepts




  关系数据库(Relational Database)是建立在关系模型上的数据库;
  一个数据表“就是”一个关系(Relation);
  表(关系)之间通过“键”连接;
Object-Relational Mapping

Why ORM ?




                             Productivity
             Modeling
                                 and
             mismatch
                            maintainability

                          ORM


                              Database
            Performance
                            independency
Hibernate

Hibernate: 休眠、冬眠




 活动的熊              Hibernate   冬眠的熊
Hibernate

Hibernate: a Java ORM Framework



        对象                 Hibernate   关系

活动的熊                       Hibernate   冬眠的熊

    关注点
NHibernate Mapping




           Mapping




嵌入的资源
Core NHibernate Types


Configuration          Build (Once)


           Open Session


ISession         ISession
                                        …
 Create
                                        …


IQuery     ISQLQuery        ICriteria   IQueryOver   IQueryable

  HQL           SQL                Dynamically         LINQ
Core NHibernate Types

NHibernate.Cfg.Configuration
// 配置 Configuration 对象
Configuration Configure()
Configuration Configure(string fileName)
Configuration Configure(Assembly assembly, string resourceName)
Configuration Configure(XmlReader textReader)
// 构建 ISessionFactory 的实例
ISessionFactory BuildSessionFactory()




 配
 置
 文
 件
Core NHibernate Types

NHibernate.ISessionFactory

//Create   a database connection and open a <c>ISession</c> on it
ISession   OpenSession()
ISession   OpenSession(IDbConnection conn)
ISession   OpenSession(IInterceptor sessionLocalInterceptor)

NHibernate.ISession
object Save(object obj)
void Delete(object obj)
void Update(object obj)
ICriteria CreateCriteria<T>()
IQueryOver<T,T> QueryOver<T>()
IQuery CreateQuery(string queryString)
ISQLQuery CreateSQLQuery(string queryString)
IQueryable<T> Query<T>(this ISession session)
Core NHibernate Types

ISession查询示例:查询所有用户
Criteria Query
Session.CreateCriteria<User>().List<User>();
Strong-typed Criteria Query
Session.QueryOver<User>().List<User>();
NHibernate Linq Query
Session.Query<User>().ToList<User>();
Query with Hibernate Query Language
Session.CreateQuery("from User").List<User>();
Native SQL Query
Session.CreateSQLQuery("select * from Users")
       .SetResultTransformer(Transformers.AliasToBean<User>())
       .List<User>();
Exercise:ExBlogger

目标:多用户博客程序

访客可以注册成用户
用户可以创建自己的博客
用户可以在自己的博客里写帖子
用户可以评论帖子
使用NHibernate框架持久化对象
Exercise:ExBlogger



  访客
                     博客
       注册
               创建


       博客用户          写    帖子

              发表



                    评论
Exercise:ExBlogger



      Visitor
                                     Blog
          Register
                          Create


                User               Create   Post

                       Create

Ubiquitous Language
领域通用语言
                                Comment
Exercise:ExBlogger




应用服务契约的制定与测试(略)
已确定对象的创建工厂
已确定对象的职责
下一步:制定/实现资源库契约(Repository Contracts/Interfaces)
Exercise:ExBlogger

IRepository<T>
int Save(T entity);
void Update(T entity);
T Get(int id);                 通用持久化方法
IList<T> GetAll();
void Delete(int id);


IUsersRepository:IRepository<User>

IBlogsRepository:IRepository<Blog>
                                           自定义持久化方法
IPostsRepository:IRepository<Post>

ICommentsRepository:IRepository<Comment>
Exercise:ExBlogger

创建并存储用户
var user =
BlogRegistrar.GetInstance().CreateUser(“Mike", "pwd");
var id = _usersRepository.Save(user);




获取所有用户
var users = _usersRepository.GetAll();
Exercise:ExBlogger

创建并存储博客
var blog = user.CreateBlog("foo", "bar");
_blogsRepository.Save(blog);

创建并存储帖子
var post = user.CreatePost("Hello World", "This my first post!")
               .On(blog);
_postsRepository.Save(post);
Exercise:ExBlogger

创建并存储评论
 var comment = user.CreateComment("沙发").On(post);
_commentsRepository.Save(comment);




获取评论列表:组装自定义的DTO
Thanks !
示例代码SVN地址:
http://ex-blogger.googlecode.com/svn/trunk/

推荐资料:

李永京博客
http://www.cnblogs.com/lyj/

领域驱动设计精简版
http://www.infoq.com/cn/minibooks/domain-driven-design-quickly

An introduce to n hibernate (part 1) pub