当前位置: 首页 > 编程日记 > 正文

ORM武器:NHibernate(三)五个步骤+简单对象CRUD+HQL

前面的两篇文章中。我们对NHibernate已经做了大致了解

    《ORM利器:NHibernate(一)简单介绍》Nhibernate的作用:攻克了对象和数据库的转化问题

    《ORM利器:NHibernate(二)使用CodeSmith高速生成映射文件和映射类 》利用CodeSmith由表导出映射类(就是通常所说的Entity)和映射文件(告诉你表和对象之间是怎样建立一一相应的关系的)。


接下来将会对NHibernate的使用做Demo解析,分为五部曲:

  1. 创建表。若要把对象转换为数据库中的表。自然要有对一个的表。

    因此。首先要在数据库中创建把.Net类持久化的相应表。

  2. 创建类。创建须要被持久化的.Net类.对象。
  3. 创建映射文件。 描写叙述对象和库之间的关系,告诉NH如何持久化这些类的属性.
  4. 创建NH的配置文件,以告诉NH如何连接数据库,以何种方式连接不同种类的数据库。
  5. 使用NH提供的API。维护对象和库之间的关系,对对象的CRUD和对数据库的DML.

步骤详情:
第一部:创建表(步骤非常easy,这里不做解释)

第二部:创建类+第三部:创建映射文件(本Demo利用CodeSmith自己主动生成,具体请參见ORM利器:NHibernate(二)使用CodeSmith高速生成映射文件和映射类 

第四部:创建NH配置文件  
      主要用于连接数据库:驱动的提供者、驱动的位置、数据库的身份验证信息等,和我们以前写过的数据库连接语句无意,仅仅只是放在了配置文件里而已。并且NH採用代理工厂,针对不同的数据库产品进行生产。提供了更好的灵活性。假设你须要把SQLServer数据库。更改为Oracle数据库,仅仅须要更改对应的配置信息就能够。
<?

xml version="1.0" encoding="utf-8" ?> <configuration> <configSession> <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate" requireParmission="false"/> </configSession> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <!--Session工厂,用户级别的对象--> <session-factory name="NHibernate.Test"> <!--驱动是由谁提供的--> <property name="connection.provider">NHibernate.Connection.ConnectionProvider,NHibernate</property> <!--驱动类的位置--> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <!--身份验证登陆--> <property name="connection.connection_string">Server=(local);initial catalog=NHibernate;Integrated Security=SSPI</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <!--是否显示sql语句--> <property name="show_sql">False</property> <!--代理工厂,针对不同的数据库产品进行生产--> <property name="proxyfactory.factory_class">NHibernate.ByteCode.Linfu.ProcxyFactoryFactory,NHibernate.ByteCode.Linfu</property> </session-factory> </hibernate-configuration> </configuration>

    假设你认为配置文件非常复杂、记不住,也没有关系。NH为我们提供了非常多配置文件的模板以供參考。这里我们採用SQLServer,因此能够參照:Configuration_Templates—MSSQL.cfg.xml

第五部:使用NH提供的API维护对象和库之间的关系,对对象的CRUD和对数据库的DML

1、文件夹结构例如以下:

1)新建类库Test:

    用于存放全部的对象和.NET映射文件(如此处的Person.cs对象,Person.hbm.xml映射文件),为了让NHibernate可以找到全部的映射文件。必须设置为“嵌入资源”,生成Test.dll文件备用。

2)加入引用:

    1. 外部引用NHibernate和NHibernate.ByteCode.Linfu.
    2. 项目引用Test.dll

2、加入窗口Form1。如图所看到的:

3、窗口Form1中的代码例如以下所看到的:

    首先,通过config读取配置文件。读取全部映射文件,载入程序集(必须是嵌入资源)
    其次。通过SessionFactory创建session工厂,负责持久化的连接以及OR映射(该对象的开销比較大。一般建议用单例模式实现)
    然后,通过session创建一个能够用于用户级别的操作对象。


    开启事务对象trans = session.BeginTransaction();


    上面的思路和我们以前使用过的SQLServer是一个道理。

接下来看一下不同点:

    曾经D层和数据库打交道的时候,我们通常使用sql语句,而后直接对数据库进行操作。而在NH中全部的操作(增删改查)全都是针对“对象”而言的,假设想要把对象保存在数据库中,就须要先将对象必须转化为数据库能识别的sql语句,因为在SessionFactory中已经保存了全部的OR映射,ISession能依据对应的方言实现sql语句。

    下文的代码中已经实现了简单操作对象。主要是通过session的get、save、delete方法来实现。若要实现复杂的查询不免会比較繁琐。NHibernate提供了一种强大的查询语言HQL(Hibernate Query Language)。它的语法很类似于Sql。不同的是仅仅能用于对数据进行查询操作,不能用于数据增、删、改。它是全然面向对象的,具备继承、多态和关联等特性。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
using NHibernate;
using NHibernate.Cfg;
using Test.Model;
using System.Linq;namespace WinFormTest
{public partial class Form1 : Form{//创建sessionISession session = null;//创建session工厂ISessionFactory factory = null;//创建事务ITransaction trans = null;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//读取配置文件//读取全部映射文件,载入程序集,必须是嵌入资源Configuration config = new Configuration().AddAssembly("Test.Model");//创建session工厂,负责持久化的连接以及OR映射,该对象的开销比較大,一般建议用单例模式实现factory = config.BuildSessionFactory();//创建一个能够用于用户级别的操作对象session = factory.OpenSession();}//加入用户private void btnAdd_Click(object sender, EventArgs e){//开启事务对象trans = session.BeginTransaction();//使用NHibernate现有API//体验过程try{//对象的实例化方式Person p = new Person();p.Name = this.txtName.Text;//把对象保存在数据库中//将对象必须转化为数据库能识别的sql语句//因为在SessionFactory中已经保存了全部的OR映射//ISession能依据对应的方言实现sql语句session.Save(p);trans.Commit();}catch (Exception){//出错后,事务回滚trans.Rollback();}}//查询用户private void btnFind_Click(object sender, EventArgs e){//trans = session.BeginTransaction();//查找ID编号为2的人//2-->ID属性——OR——>SQL的Where语句Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));//Console.WriteLine(p.ToString());this.txtName.Text = p.Name;}//删除用户private void btnDelete_Click(object sender, EventArgs e){try{//开启事务trans = session.BeginTransaction();//依据提供的ID查找该对象Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));//对象删除session.Delete(p);trans.Commit();}catch (Exception){trans.Rollback();}}//更新用户private void btnUp_Click(object sender, EventArgs e){try{//开启事务trans = session.BeginTransaction();//依据提供的ID查找该对象Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));//改动对象属性p.Name = this.txtName.Text;session.Update(p);trans.Commit();}catch (Exception){trans.Rollback();}}//IQuery接口。是针对对象查询private void btnHQL_Click(object sender, EventArgs e){//HQL体验——HQL是针对对象的查询语言//查询全部人的信息//IQuery query = session.CreateQuery("from Person");//IList<Person> persons = query.List<Person>();//persons.p1();//查询编号为2的人的信息//IQuery query = session.CreateQuery("from Person where Id=3");//query.List<Person>().p1();//查询名字中有字母a的人//session.CreateQuery("from Person where Name like '%a%'").List<Person>().p1();//session.CreateQuery("from Person where t_Name like '%a%'").List<Person>().p1();//session.CreateQuery("from Person where name like '%a%'").List<Person>().p1();//错误//查找全部//session.CreateQuery("select p from Person p").List<Person>().p1();//session.CreateQuery("select * from Person ").List<Person>().p1();//错误,没有*//查找编号大于5的人的信息//session.CreateQuery("from Person p where p.Id>5 ").List<Person>().p1();//聚合函数的使用--统计人数//session.CreateQuery("select count(p.Id) from Person p ").List().p2();//传參1//IQuery query = session.CreateQuery("from Person p where p.Id>?");//query.SetParameter(0,7);//query.List<Person>().p1();//传參2//IQuery query = session.CreateQuery("from Person p where p.Id>:id");//query.SetParameter("id", 7);//query.List<Person>().p1();//插入数据——Insert/Update/Delete不建议在HQL里面操作//IQuery query = session.CreateQuery("insert into t_Person(t_Name) values(?

)"); //query.SetParameter(0,"kkk"); //query.ExecuteUpdate(); //查询指定范围的数据——查询第3-7条记录 IQuery query = session.CreateQuery("from Person"); query.List<Person>().Skip<Person>(3).Take<Person>(5).ToList<Person>(); ; //用ICriteria来实现该功能可能更方便 } //对IList<Person>类型数据的输出。建议用C#3.0的拓展方法来实现 public static class ExtraClass { public static void p1(this IList<Person> p) { //获取可枚举的接口对象 IEnumerator<Person> ie = p.GetEnumerator(); Console.WriteLine("\n-----------------------\n"); //遍历 while (ie.MoveNext()) { Console.WriteLine(ie.Current.ToString()); } Console.WriteLine("\n-----------------------\n"); } public static void p2(this IList p) { IEnumerator ie = p.GetEnumerator(); Console.WriteLine("\n-----------------------\n"); while (ie.MoveNext()) { Console.WriteLine(ie.Current.ToString()); } Console.WriteLine("\n-----------------------\n"); } } } }


总结:对于NHibernate的操作。本文通过五部曲进行仔细的解说:1、创建表;2、创建类;3、创建映射文件(表和类是怎样相应的)。4、NH配置文件(连接数据库)。5、利用API操作。

    当中。2、3 我们採用CodeSmith自己主动生成映射类和映射文件;4就是我们曾做的连接数据库操作。5通过NHibernate提供的API。通过对对象操作。已达到操作数据库的目的。避免了冗长复杂的sql语句。

    希望大家重点理解创建的过程,以及API的使用。


版权声明:本文博客原创文章。博客,未经同意,不得转载。

相关文章:

Linux学习笔记8——bash基本概念

一个操作系统的组成中&#xff0c;shell是与用户最接近的部分shell&#xff1a;外壳&#xff0c;也是一种程序GUI&#xff1a;Gnome&#xff0c;KDE,XfaceCLI&#xff1a;sh&#xff0c;csh&#xff0c;ksh&#xff0c;bash&#xff0c;tcsh&#xff0c;zshLinux中大多使用bash…

UIScrollView offset in UINavigationController

转&#xff1a;UIScrollView offset in UINavigationController 通过设置viewCtronller的 self.automaticallyAdjustsScrollViewInsets NO; 禁用苹果scrollview提供的自适应功能。 延伸阅读&#xff1a;https://developer.apple.com/library/ios/documentation/UserExperience…

AI 通过眼睛的反光度,来识别是否 Deepfake 换脸

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; Deepfake 是一种 AI换脸工具&#xff0c;现被滥用&#xff0c;从虚假宣传活动到插入一些违法内容&#xff0c;并且篡改后的图像是难以被检测到的。 一种新的 AI 工具提供了一项令人惊讶的简单方法来发现…

[异常笔记] spring boot 启动-2018040201

异常 1、编码引发异常 00:59:49.311 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Included patterns for restart : [] 00:59:49.318 [main] DEBUG org.springframework.boot.devtools.settings.DevToolsSettings - Excluded patterns for re…

maven基础概念学习1

2019独角兽企业重金招聘Python工程师标准>>> 1.maven是什么&#xff1f; 百度百科&#xff1a; Maven是基于项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的软件项目管理工具。 2.maven的作用&#xff1f; 构建、文档…

php session 二位数组

最普通的用法&#xff1a;一个变量名 $_SESSION[user] 0;echo $_SESSION[user]; 使用数组&#xff1a; $_SESSION[user][a] 1;$_SESSION[user][b] 2;echo $_SESSION[user][a];echo $_SESSION[user][b]; 这样的好处是可以分组可以 $_SESSION[admin][a] 11;$_SESSION[admin][…

「屋漏偏逢连夜雨」,Log4j 漏洞还没忙完,新的又来了

整理 | 郑丽媛、禾木木 出品 | CSDN 这几天&#xff0c;Apache Log4j 2 绝对是众多 Java 程序员提到的高频词之一&#xff1a;由于 Apache Log4j 2 引发的严重安全漏洞&#xff0c;令一大批安全人员深夜修 Bug、打补丁。此次漏洞更是因为其触发简单、攻击难度低、影响人群广泛等…

利用gevent实现异步执行任务

import gevent def task(pid):gevent.sleep(2)print ("task %s done"%pid)def asynchronous():threads [gevent.spawn(task,i) for i in xrange(5)]gevent.joinall(threads)if __name__ __main__:print ("asynchronous")asynchronous()执行结果&#xff…

清理SQL多余登录信息

服务器列表、登陆帐户、密码等信息都记录在 %AppData%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin &#xff08;2008&#xff09;%AppData%\Microsoft\Microsoft SQL Server\90\Tools\Shell\mru.dat&#xff08;2005&#xff09;直接删除后重新启动 SSMS …

AI 真的能够理解人类语言吗?

作者 | Melanie Mitchell 译者 | 弯月 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2011年&#xff0c;IBM 的人工智能系统沃森参加综艺节目《危险边缘》&#xff0c;并获得了冠军&#xff0c;当时他们宣称&#xff1a;“沃森能够理解自然语言的所有歧义和复杂…

【贪心】Google Code Jam Round 1A 2018 Waffle Choppers

题意&#xff1a;给你一个矩阵&#xff0c;有些点是黑的&#xff0c;让你横切h刀&#xff0c;纵切v刀&#xff0c;问你是否能让切出的所有子矩阵的黑点数量相等。 设黑点总数为sum&#xff0c;sum必须能整除(h1)&#xff0c;进而sum/(h1)必须能整除(v1)。 先考虑横行&#xff0…

友盟数据—值得手游创业者关注的玩家数据

友盟数据—值得手游创业者关注的玩家数据 你知道“辣妈”是什么游戏的忠诚玩家吗&#xff1f;你知道“大龄玩家”都喜好怎样的游戏&#xff1f;你知道哪类玩家最“多金”&#xff1f;2015年&#xff0c;不仅宅男、宅女们爱玩游戏&#xff0c;辣妈和奶爸们也成了手游行业的主力军…

这个 AI 模型火上 GitHub 热榜第一,在线修复照片

编译 | 禾木木出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;AI 正在对照片编辑产生重大的影响&#xff0c;但结果是还存在很大分歧。支持者说&#xff0c;人工智能释放了新的艺术历年&#xff0c;减少了创作者花在单调工作上的时间。然而&#xff0c;批评者认为这些…

【我的Android进阶之旅】解决SDK升级到27.0.3遇到的GLIBC_2.14 not found、no acceptable C compiler found in $PATH等问题...

一、问题一&#xff1a;Failed to find Build Tools revision 27.0.3 1.1、问题描述 最近公司的Android项目都要进行SDK升级&#xff0c;目前在本地编译的时候将SDK升级到了27.0.3&#xff0c;本地运行正常&#xff0c;然后在jenkins服务器上跑的时候就会出现异常。异常如下所示…

解析大型.NET ERP系统 设计异常处理模块

异常处理模块是大型系统必备的一个组件&#xff0c;精心设计的异常处理模块可提高系统的健壮性。下面从我理解的角度&#xff0c;谈谈异常处理的方方面面。我的设计仅仅限定于Windows Forms&#xff0c;供参考。 1 定义异常类型 .NET 框架定义很多异常类型&#xff0c;ERP系统中…

内含福利|CSDN 携手字节跳动:云原生Meetup北京站报名热烈启动,1月8日见!

伴随云原生技术的成熟与落地&#xff0c;越来越多框架、中间件等开源项目相继涌现&#xff0c;帮助开发者和企业有效解决业务问题。2022年1月8日&#xff0c;CSDN携手字节跳动基础架构&#xff0c;将在北京举办第四场云原生线下Meetup。在这里&#xff0c;您可以与众多开源技术…

用Thymeleaf在前台下拉列表取值

转自&#xff1a;https://blog.csdn.net/u013600907/article/details/76165748转载于:https://www.cnblogs.com/sharpest/p/8875698.html

PHP使用JSON

JSON 基础 简 单地说&#xff0c;JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串&#xff0c;然后就可以在函数之间轻松地传递这个字符串&#xff0c;或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪&#xff08;稍后会看…

(原创)Python文件与文件系统系列(5)——stat模块

stat模块中定义了许多的常量和函数&#xff0c;可以帮助解释 os.stat()、os.fstat()、os.lstat()等函数返回的 st_result 类型的对象。 通常使用 os.path.is*() 这类函数来测试一个文件的类型&#xff0c;这些方法对同一个文件进行多次测试时&#xff0c;stat()系统调用都是不可…

Azure Neural TTS能让AI语音自然逼真到什么程度?

摘要&#xff1a;微软Azure Neural TTS让AI语音像真人一样富有感情&#xff0c;自然逼真。 Neural TTS&#xff08;神经网络文本转语音&#xff09;是微软Azure认知服务的强大语音合成功能&#xff0c;自推出以来&#xff0c;已被广泛应用于从语音助手、新闻阅读到有声读物创作…

ReentrantLock与synchronized

1、ReentrantLock 拥有Synchronized相同的并发性和内存语义&#xff0c;此外还多了 锁投票&#xff0c;定时锁等候和中断锁等候线程A和B都要获取对象O的锁定&#xff0c;假设A获取了对象O锁&#xff0c;B将等待A释放对O的锁定&#xff0c;如果使用 synchronized &#xff0c;如…

EXT按钮事件

在EXT中&#xff0c;当我们要为按钮点击添加处理function的时候&#xff0c;可以看到一般人的实现分成2类&#xff1a;1.使用onClick: function xx()2.使用handler: function xx()完成后&#xff0c;我们会发现&#xff0c;无论用哪一种实现&#xff0c;再点击按钮时都能触发xx…

浅谈HTTP中Get与Post的区别

Http定义了与服务器交互的不同方法&#xff0c;最基本的方法有4种&#xff0c;分别是GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE。URL全称是资源描述符&#xff0c;我们可以这样认为&#xff1a;一个URL地址&#xff0c;它用于描述一个网络上的资源&#xff0c;而H…

达摩院年终预测重磅出炉:AI for Science 高居榜首,2022 十大科技趋势!

整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;作为“一所探索科技未知的研究院”&#xff0c;阿里巴巴达摩院成立至今已经四年了。这四年来&#xff0c;达摩院秉持着“探索科技位置&#xff0c;以人类愿景为驱动力&#xff0c;开展基础科学和颠覆式…

TensorFlow——入门基础

TensorFlow原理&#xff1a; TensorFlow使用Graph来描述计算任务,图中的节点被称之为op.一个op可以接受0或多个tensor作为输入,也可产生0或多个tensor作为输出.任何一个Graph要想运行,都必须借助上下文Session.通过Session启动Graph,并将Graph中的op分发到CPU或GPU上,借助Sessi…

EXT iconCls说明

今天学习ext 看examples中的事例&#xff0c;其中有一个地方是这样写的&#xff1a; new ButtonPanel( Icon Only, [{ iconCls: add16 },{ iconCls: add24, scale: medium },{ …

25个好用到爆的一行 Python 代码,建议收藏

作者 | 欣一来源 | Pyhton爱好集中营在学习Python的过程当中&#xff0c;有很多复杂的任务其实只需要一行代码就可以解决&#xff0c;那么今天小编我就来给大家介绍实用的一行Python代码&#xff0c;希望对大家能够有所帮助。1.两个字典的合并x {a: 1, b: 2} y {c: 3, d: 4}将…

【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动

SuperIO相关资料下载&#xff1a;http://pan.baidu.com/s/1pJ7lZWf 1.1 服务接口的作用 围绕着设备驱动模块采集的数据&#xff0c;根据需求提供多种应用服务&#xff0c;例如&#xff1a;数据上传服务、数据请求服务、4-20mA服务、短信服务、LED服务以及OPC服务等。保障数…

usermod命令,用户密码管理和mkpasswd命令

2019独角兽企业重金招聘Python工程师标准>>> usermod 设置扩展组 概念&#xff1a;更改用户属性的一个命令。 用法&#xff1a;usermod [选项] 后面跟你需要操作的内容 [用户名] 选项&#xff1a;-c, --comment 注释 GECOS 字段的新值-d, --home HO…

extjs关于jsonreader

在JavaScript中&#xff0c;JSON是一种非常重要的数据格式&#xff0c;key:value的形式比XML那种复杂的标签结构更容易理解&#xff0c;代码量也更小&#xff0c;很多人倾向于使用它作为EXT的数据交换格式。JsonReader支持分页&#xff0c;与JSON数据对应格式如下&#xff1a;t…