NHibernate 01 初体验

第一步:创建控制台项目

第二步:添加所需程序集 NHibernate:搜索:NHibernate

第三步:设计数据库表:

 1 USE [Company]
 2 GO
 3 
 4 /****** Object:  Table [dbo].[EmployeeInfo]    Script Date: 12/30/2015 10:21:52 ******/
 5 SET ANSI_NULLS ON
 6 GO
 7 
 8 SET QUOTED_IDENTIFIER ON
 9 GO
10 
11 SET ANSI_PADDING ON
12 GO
13 
14 CREATE TABLE [dbo].[EmployeeInfo](
15     [Emp_No] [int] IDENTITY(1,1) NOT NULL,
16     [Emp_Name] [varchar](50) NOT NULL,
17     [Salary] [decimal](18, 0) NOT NULL,
18     [Dept_Name] [varchar](50) NOT NULL,
19     [Designation] [varchar](50) NOT NULL,
20  CONSTRAINT [PK_EmployeeInfo] PRIMARY KEY CLUSTERED 
21 (
22     [Emp_No] ASC
23 )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
24 ) ON [PRIMARY]
25 
26 GO
27 
28 SET ANSI_PADDING OFF
29 GO
sql

 

第四步:根椐数据库存实现实体类与映射类对应文件

实体类:EmployeeInfo.cs

using System;
using System.Text;
using System.Collections.Generic;
namespace NH01.Domain
{
    public class EmployeeInfo
    {     
        public virtual int EmpNo { get; set; }
        public virtual string EmpName { get; set; }
        public virtual decimal Salary { get; set; }
        public virtual string DeptName { get; set; }
        public virtual string Designation { get; set; }
    }
}

实体类:EmployeeInfo.cs对应映射文件:EmployeeInfo.hbm.xml(关键:属性:嵌入的资源必须设置为:嵌入的资源

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="NH01" namespace="NH01.Domain" xmlns="urn:nhibernate-mapping-2.2">
  <!--<hibernate-mapping assembly="{程序集名称}" namespace="{命名空间}" xmlns="urn:nhibernate-mapping-2.2">-->
  <class name="EmployeeInfo" table="EmployeeInfo" lazy="true" >
    <!--<class name="{类名}" table="{数据库表名}" lazy="{是否延迟加载true/false}" >--> 
    <id name="EmpNo" column="Emp_No">
      <!--<id name="{类属性名字}" column="{数据为表属性名}">-->
      <generator class="identity" />
      <!--<generator class="identity" />  identity:用于MySql数据库。特点:递增-->
    </id>
    <property name="EmpName">
      <column name="Emp_Name" sql-type="varchar" not-null="true" />
    </property>
    <!--<property name="{类属性名}">
      <column name="{数据为表属性名称}" sql-type="{类型:如:decimal、varchar...}" not-null="{是否可以为NULL:true/false}" />
    </property>-->
    <property name="Salary">
      <column name="Salary" sql-type="decimal" not-null="true" />
    </property>
    <property name="DeptName">
      <column name="Dept_Name" sql-type="varchar" not-null="true" />
    </property>
    <property name="Designation">
      <column name="Designation" sql-type="varchar" not-null="true" />
    </property>
  </class>
</hibernate-mapping>

第5步:添加数据库 NHibernate.Cfg.Configuration外部文件:hibernate.cfg.xml(目的主要是当使用:Configuration cfg = new Configuration().Configure(@"E:\NH2015\NH01\NH01\NHibernate\Configuration\hibernate.cfg.xml"); 获取连接数据库对应参数)

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">
      NHibernate.Connection.DriverConnectionProvider
    </property>
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    <property name="connection.driver_class">
      NHibernate.Driver.SqlClientDriver
    </property>
    <property name="connection.connection_string">server=127.0.0.1;database=Company;uid=sa;pwd=123;</property>
    <property name="show_sql">false</property>
  </session-factory>
</hibernate-configuration>



<!--下面对几个重要的key值说明一下:
hibernate.connection.provider
连接提供者,取值必须是实现了IConnectionProvider接口的类的全名,当前版本只能取值NHibernate.Connection.DriverConnectionProvider;
hibernate.connection.driver_class
数据驱动类,取值必须是实现了IDriver接口的类的全名,常用的选择有NHibernate.Driver.SqlClientDriver, NHibernate.Driver.OleDbDriver等;
hibernate.dialect
数据库方言,取值必须是继承之Dialect的类的全名,最常用的就是NHibernate.Dialect.MsSql2000Dialect/NHibernate.Dialect.MsSql2008Dialect了, 其它的没用过,不清楚能不能正常使用;
hibernate.connection.connection_string
连接字符串(如:server=127.0.0.1;database=Company;uid=sa;pwd=123;),取值与driver_class对应即可;
hibernate.show_sql
指明是否在log4net日志中显示sql语句,主要用于调试,取值为true或false;-->

第六步调用:

实现思想:操作数据由session对象进行操作,但session由SessionFactory创建

实现步骤:第一步:创建SessionFactory

第二步:SessionFactory创建session

第三步:由session操作对数据库存增加查改

创建SessionFactory二种方法

第一种 :读取外部文件配置法

01准备外部配置文件:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
 3   <session-factory>
 4     <property name="connection.provider">
 5       NHibernate.Connection.DriverConnectionProvider
 6     </property>
 7     <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
 8     <property name="connection.driver_class">
 9       NHibernate.Driver.SqlClientDriver
10     </property>
11     <property name="connection.connection_string">server=127.0.0.1;database=Company;uid=sa;pwd=123;</property>
12     <property name="show_sql">false</property>
13   </session-factory>
14 </hibernate-configuration>
15 
16 
17 
18 <!--下面对几个重要的key值说明一下:
19 hibernate.connection.provider
20 连接提供者,取值必须是实现了IConnectionProvider接口的类的全名,当前版本只能取值NHibernate.Connection.DriverConnectionProvider;
21 hibernate.connection.driver_class
22 数据驱动类,取值必须是实现了IDriver接口的类的全名,常用的选择有NHibernate.Driver.SqlClientDriver, NHibernate.Driver.OleDbDriver等;
23 hibernate.dialect
24 数据库方言,取值必须是继承之Dialect的类的全名,最常用的就是NHibernate.Dialect.MsSql2000Dialect/NHibernate.Dialect.MsSql2008Dialect了, 其它的没用过,不清楚能不能正常使用;
25 hibernate.connection.connection_string
26 连接字符串(如:server=127.0.0.1;database=Company;uid=sa;pwd=123;),取值与driver_class对应即可;
27 hibernate.show_sql
28 指明是否在log4net日志中显示sql语句,主要用于调试,取值为true或false;-->

02:创建SessionFactory

 /// <summary>
        /// 第-种 :通进读取外部文件创建工厂
        /// </summary>
        /// <returns></returns>

        static ISessionFactory CreateISessionFactory2()
        {
            Configuration cfg = new Configuration().Configure(@"E:\NH2015\NH01\NH01\NHibernate\Configuration\hibernate.cfg.xml"); //读取xml文件
            cfg.AddDirectory(new DirectoryInfo(@"E:\NH2015\NH01\NH01\Domain\Mapping"));   //读取实体类的映射文件
            ISessionFactory sessionFactory = cfg.BuildSessionFactory();   //创建工厂
            return sessionFactory; 
        }

第二种直接设置参数法

   /// <summary>
        /// 第二步种实现方式:通过直接设置参数创建工厂
        /// </summary>
        /// <returns></returns>
        static ISessionFactory CreateISessionFactory()
        {
            Configuration cfg = new Configuration();
            cfg.SetProperty("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
            cfg.SetProperty("dialect", "NHibernate.Dialect.MsSql2008Dialect");
            cfg.SetProperty("connection.driver_class", "NHibernate.Driver.SqlClientDriver");
            cfg.SetProperty("connection.connection_string", "server=127.0.0.1;database=Company;uid=sa;pwd=123;");
            cfg.AddAssembly(Assembly.GetCallingAssembly());   //加载言所属程序集的以XXX.hbm.xml格式的映射文件(关键:生成操作设置为:嵌入的资源)
            ISessionFactory sessionFactory = cfg.BuildSessionFactory();
            return sessionFactory;
        }

第七步:调用第六步创建的sessionFactory工厂创建session操作数据库

  public static void Text(ISessionFactory sessionFactory)
        {
            ISession session = null;
            ITransaction mTransaction = null;
            if (session == null)
            {
                session = sessionFactory.OpenSession();      //创建session会话
            }
            try
            {
                EmployeeInfo info = new EmployeeInfo() { DeptName = "wiaaaase", EmpNo = 1, Designation = "jock", EmpName = "bia", Salary = 45 };
                mTransaction = session.BeginTransaction();       //打事事务
                session.Save(info); //将对象状态更改为持久态
                session.Transaction.Commit(); //提交
            }
            catch (Exception ex)
            {
                mTransaction.Rollback(); //事务回滚
            }
            finally
            {
                if (session.IsOpen)  //判断会话是否打开
                {
                    session.Close();    //关闭会话
                }
            }
        
        }

最后一步:

调用

  static void Main(string[] args)
        {
            
            //创建工厂第一种方式
            ISessionFactory sessionFactory = CreateISessionFactory2();
            //创建工厂第二种方式
            ISessionFactory sessionFactory2 = CreateISessionFactory();
            Text(sessionFactory);
            Text(sessionFactory2);
           
        }

 

完整代码:

 1 using NH01.Domain;
 2 using NHibernate;
 3 using NHibernate.Cfg;
 4 using System;
 5 using System.Collections.Generic;
 6 using System.IO;
 7 using System.Linq;
 8 using System.Reflection;
 9 using System.Text;
10 using System.Threading.Tasks;
11 
12 namespace NH01
13 {
14 
15     //创建思路:工作 sessionFactory创建ISession   ISession操作数据库
16     class Program
17     {
18         static void Main(string[] args)
19         {
20             
21             //创建工厂第一种方式
22             ISessionFactory sessionFactory = CreateISessionFactory2();
23             //创建工厂第二种方式
24             ISessionFactory sessionFactory2 = CreateISessionFactory();
25             Text(sessionFactory);
26             Text(sessionFactory2);
27            
28         }
29 
30         public static void Text(ISessionFactory sessionFactory)
31         {
32             ISession session = null;
33             ITransaction mTransaction = null;
34             if (session == null)
35             {
36                 session = sessionFactory.OpenSession();      //创建session会话
37             }
38             try
39             {
40                 EmployeeInfo info = new EmployeeInfo() { DeptName = "wiaaaase", EmpNo = 1, Designation = "jock", EmpName = "bia", Salary = 45 };
41                 mTransaction = session.BeginTransaction();       //打事事务
42                 session.Save(info); //将对象状态更改为持久态
43                 session.Transaction.Commit(); //提交
44             }
45             catch (Exception ex)
46             {
47                 mTransaction.Rollback(); //事务回滚
48             }
49             finally
50             {
51                 if (session.IsOpen)  //判断会话是否打开
52                 {
53                     session.Close();    //关闭会话
54                 }
55             }
56         
57         }
58 
59 
60         /// <summary>
61         /// 第二步种实现方式:通过直接设置参数创建工厂
62         /// </summary>
63         /// <returns></returns>
64         static ISessionFactory CreateISessionFactory()
65         {
66             Configuration cfg = new Configuration();
67             cfg.SetProperty("connection.provider", "NHibernate.Connection.DriverConnectionProvider");
68             cfg.SetProperty("dialect", "NHibernate.Dialect.MsSql2008Dialect");
69             cfg.SetProperty("connection.driver_class", "NHibernate.Driver.SqlClientDriver");
70             cfg.SetProperty("connection.connection_string", "server=127.0.0.1;database=Company;uid=sa;pwd=123;");
71             cfg.AddAssembly(Assembly.GetCallingAssembly());   //加载言所属程序集的以XXX.hbm.xml格式的映射文件(关键:生成操作设置为:嵌入的资源)
72             ISessionFactory sessionFactory = cfg.BuildSessionFactory();
73             return sessionFactory;
74         }
75 
76         /// <summary>
77         /// 第-种 :通进读取外部文件创建工厂
78         /// </summary>
79         /// <returns></returns>
80 
81         static ISessionFactory CreateISessionFactory2()
82         {
83             Configuration cfg = new Configuration().Configure(@"E:\NH2015\NH01\NH01\NHibernate\Configuration\hibernate.cfg.xml"); //读取xml文件
84             cfg.AddDirectory(new DirectoryInfo(@"E:\NH2015\NH01\NH01\Domain\Mapping"));   //读取实体类的映射文件
85             ISessionFactory sessionFactory = cfg.BuildSessionFactory();   //创建工厂
86             return sessionFactory; 
87         }
88     }
89 }
完整代码

 下载地址:http://pan.baidu.com/s/1eRcT55o

posted on 2015-12-30 10:39  高达  阅读(137)  评论(0)    收藏  举报

导航