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
第四步:根椐数据库存实现实体类与映射类对应文件
实体类: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
浙公网安备 33010602011771号