zoukankan      html  css  js  c++  java
  • NHibernate系列文章三:简单的增删改查询

    摘要

    上一篇文章只完成了简单的NHibernate安装、配置和连接数据库。这篇文章介绍怎样实现最简单的数据库读写操作。

    1. 重构ISessionFactory生成过程

    将生成ISessionFactory的代码从main函数中移除,变成使用属性控制。

     1         private static ISessionFactory _sessionFactory;
     2 
     3         public static ISessionFactory SessionFactory
     4         {
     5             get
     6             {
     7                 if (_sessionFactory == null)
     8                 {
     9                     var cfg = new Configuration();
    10 
    11                     cfg.DataBaseIntegration(x =>
    12                     {
    13                         x.ConnectionString = "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
    14                         x.Driver<SqlClientDriver>();
    15                         x.Dialect<MsSql2008Dialect>();
    16                     });
    17                     cfg.AddAssembly(Assembly.GetExecutingAssembly());
    18                     _sessionFactory = cfg.BuildSessionFactory();
    19                 }
    20                 return _sessionFactory;
    21             }
    22         }  

    SessionFactory的创建很占用系统资源,一般在整个应用程序中只创建一次。因此,这里通过判断if (_sessionFactory == null)实现一个最简单的单例模式。

    2. GetAll和GetById函数代码

     1         private static IList<Customer> GetAll()
     2         {
     3             using (var session = SessionFactory.OpenSession())
     4             {
     5                 IList<Customer> list = session.CreateCriteria<Customer>().List<Customer>();
     6                 return list;
     7             }
     8         }
     9 
    10         private static Customer GetById(int id)
    11         {
    12             using (var session = SessionFactory.OpenSession())
    13             {
    14                 Customer customer = session.Get<Customer>(id);
    15                 return customer;
    16             }
    17         }

    使用using子句,在using代码块完成后,将自动调用ISession的Dispose方法关闭Session

    3. 增删改函数代码

     1         private static int Insert(Customer customer)
     2         {
     3             using (var session = SessionFactory.OpenSession())
     4             {
     5                 var identifier = session.Save(customer);
     6                 session.Flush();
     7                 return Convert.ToInt32(identifier);
     8             }
     9         }
    10 
    11         private static void Update(Customer customer)
    12         {
    13             using (var session = SessionFactory.OpenSession())
    14             {
    15                 session.SaveOrUpdate(customer);
    16                 session.Flush();
    17             }
    18         }
    19 
    20         private static void Delete(int id)
    21         {
    22             using (var session = SessionFactory.OpenSession())
    23             {
    24                 var customer = session.Load<Customer>(id);
    25                 session.Delete(customer);
    26                 session.Flush();
    27             }
    28         }
    • session.Save: 插入新记录,返回新纪录主键值
    • session.SaveOrUpdate: 如果被调用的Customer对象在数据库里不存在(新记录),则插入新记录,否则修改该记录
    • session.Delete: 传入Customer对象进行删除
    • 增删改操作完成之后需要调用session.Flush()方法,将对象持久化写入数据库。如果不调用此方法,方法结束后修改记录不能写入到数据库

    4. 添加方法CreateCustomer

     1         private static Customer CreateCustomer()
     2         {
     3             var customer = new Customer
     4             {
     5                 FirstName = "Daniel",
     6                 LastName = "Tang",
     7                 Points = 100,
     8                 HasGoldStatus = true,
     9                 MemberSince = new DateTime(2012, 1, 1),
    10                 CreditRating = CustomerCreditRating.Good,
    11                 AverageRating = 42.42424242,
    12                 Street = "123 Somewhere Avenue",
    13                 City = "Nowhere",
    14                 Province = "Alberta",
    15                 Country = "Canada"
    16             };
    17             
    18             return customer;
    19         }

    5. 修改main函数

     1         static void Main(string[] args)
     2         {
     3             Customer newCustomer = CreateCustomer();
     4             int customerId = Insert(newCustomer);
     5             Console.WriteLine("new customer id: {0}", customerId);
     6 
     7             IList<Customer> list = GetAll();
     8             Console.WriteLine("customer list count: {0}", list.Count);
     9             foreach(var item in list)
    10             {
    11                 Console.WriteLine("{0} {1}", item.FirstName, item.LastName);
    12             }
    13 
    14             var customer = GetById(customerId);
    15             Console.WriteLine("GetById: {0} {1}", customer.FirstName, customer.LastName);
    16 
    17             customer.LastName = "Chen";
    18             Update(customer);
    19             var updatedCustomer = GetById(customerId);
    20             Console.WriteLine("updated: {0} {1}", updatedCustomer.FirstName, updatedCustomer.LastName);
    21 
    22             Delete(customerId);
    23             var existedCustomer = GetById(customerId);
    24             Console.WriteLine("after deleted: existing: {0}", existedCustomer != null);
    25 
    26             Console.ReadLine();
    27         }

    6. 完整的代码

      1 using NHibernate;
      2 using NHibernate.Cfg;
      3 using NHibernate.Dialect;
      4 using NHibernate.Driver;
      5 using System;
      6 using System.Collections.Generic;
      7 using System.Reflection;
      8 
      9 namespace NHibernateDemoApp
     10 {
     11     class Program
     12     {
     13         private static ISessionFactory _sessionFactory;
     14 
     15         public static ISessionFactory SessionFactory
     16         {
     17             get
     18             {
     19                 if (_sessionFactory == null)
     20                 {
     21                     var cfg = new Configuration();
     22 
     23                     cfg.DataBaseIntegration(x =>
     24                     {
     25                         x.ConnectionString = "Data Source=localhost;Initial Catalog=NHibernateDemoDB;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
     26                         x.Driver<SqlClientDriver>();
     27                         x.Dialect<MsSql2008Dialect>();
     28                     });
     29                     cfg.AddAssembly(Assembly.GetExecutingAssembly());
     30                     _sessionFactory = cfg.BuildSessionFactory();
     31                 }
     32                 return _sessionFactory;
     33             }
     34         }
     35 
     36         static void Main(string[] args)
     37         {
     38             Customer newCustomer = CreateCustomer();
     39             int customerId = Insert(newCustomer);
     40             Console.WriteLine("new customer id: {0}", customerId);
     41 
     42             IList<Customer> list = GetAll();
     43             Console.WriteLine("customer list count: {0}", list.Count);
     44             foreach(var item in list)
     45             {
     46                 Console.WriteLine("{0} {1}", item.FirstName, item.LastName);
     47             }
     48 
     49             var customer = GetById(customerId);
     50             Console.WriteLine("GetById: {0} {1}", customer.FirstName, customer.LastName);
     51 
     52             customer.LastName = "Chen";
     53             Update(customer);
     54             var updatedCustomer = GetById(customerId);
     55             Console.WriteLine("updated: {0} {1}", updatedCustomer.FirstName, updatedCustomer.LastName);
     56 
     57             Delete(customerId);
     58             var existedCustomer = GetById(customerId);
     59             Console.WriteLine("after deleted: existing: {0}", existedCustomer != null);
     60 
     61             Console.ReadLine();
     62         }
     63 
     64         private static Customer CreateCustomer()
     65         {
     66             var customer = new Customer
     67             {
     68                 FirstName = "Daniel",
     69                 LastName = "Tang",
     70                 Points = 100,
     71                 HasGoldStatus = true,
     72                 MemberSince = new DateTime(2012, 1, 1),
     73                 CreditRating = CustomerCreditRating.Good,
     74                 AverageRating = 42.42424242,
     75                 Street = "123 Somewhere Avenue",
     76                 City = "Nowhere",
     77                 Province = "Alberta",
     78                 Country = "Canada"
     79             };
     80             
     81             return customer;
     82         }
     83 
     84         private static IList<Customer> GetAll()
     85         {
     86             using (var session = SessionFactory.OpenSession())
     87             {
     88                 IList<Customer> list = session.CreateCriteria<Customer>().List<Customer>();
     89                 return list;
     90             }
     91         }
     92 
     93         private static Customer GetById(int id)
     94         {
     95             using (var session = SessionFactory.OpenSession())
     96             {
     97                 Customer customer = session.Get<Customer>(id);
     98                 return customer;
     99             }
    100         }
    101 
    102         private static int Insert(Customer customer)
    103         {
    104             using (var session = SessionFactory.OpenSession())
    105             {
    106                 var identifier = session.Save(customer);
    107                 session.Flush();
    108                 return Convert.ToInt32(identifier);
    109             }
    110         }
    111 
    112         private static void Update(Customer customer)
    113         {
    114             using (var session = SessionFactory.OpenSession())
    115             {
    116                 session.SaveOrUpdate(customer);
    117                 session.Flush();
    118             }
    119         }
    120 
    121         private static void Delete(int id)
    122         {
    123             using (var session = SessionFactory.OpenSession())
    124             {
    125                 var customer = session.Load<Customer>(id);
    126                 session.Delete(customer);
    127                 session.Flush();
    128             }
    129         }
    130     }
    131 }

    7. 执行结果

  • 相关阅读:
    HDU 5409 CRB and Graph (边双连通+DFS)
    HDU 3749 Financial Crisis (点双连通+并查集)
    POJ 1523 SPF (无向图割点)
    HDU 3639 Hawk-and-Chicken (强连通缩点+DFS)
    UVA11324 The Largest Clique (强连通缩点+DP最长路)
    HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)
    ZOJ 3795 Grouping (强连通缩点+DP最长路)
    POJ 2455 Secret Milking Machine 【二分】+【最大流】
    POJ 2112 Optimal Milking (二分+最短路+最大流)
    POJ 1094 Sorting It All Out 【拓扑排序】
  • 原文地址:https://www.cnblogs.com/uncle_danny/p/5634408.html
Copyright © 2011-2022 走看看