前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Nhibernate_juan benet

Nhibernate_juan benet

作者头像
全栈程序员站长
发布于 2022-11-16 06:38:32
发布于 2022-11-16 06:38:32
3850
举报

大家好,又见面了,我是你们的朋友全栈君。

什么是NHibernate? NHibernate是一个基于.Net,用于关系数据库的对象持久化类库.它是著名的Hibernate的.Net版本. NHibernate用于把你的.Net对象持久化到底层的关系数据库中.你完全不用自己编写Sql语句去操作这些对象,NH会代替你做.你的代码里面只需要关心这些对象,NH生成sql语句并能为你取到正确的东西. 开发过程 HNibernate将会有一些工具帮助你,如:生成schema,根据映射文件(Mapping file)生成类,并更新schema(一个新开发者的建议).然而,在本文档中,前提是你已经手动的数据库的创建喝.Net类的编写… 这里是我们要做的: 1. 在数据库中创建把.Net类持久化的对应表. 2. 创建需要被持久化的.Net类. 3. 创建映射文件,以告诉NH怎样持久化这些类的属性. 4. 创建NH的配置文件,以告诉NH怎样连接数据库. 5. 使用NH提供的API. 步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate go CREATE TABLE users ( LogonID varchar(20) NOT NULL default ‘0’, Name varchar(40) default NULL, Password varchar(20) default NULL, EmailAddress varchar(40) default NULL, LastLogon datetime default NULL, PRIMARY KEY (LogonID) ) go 我使用的是MS Sql Server 2000,但是如果你找到一个任何数据库的.net Data Provider驱动,你可以使用任何数据库. 步骤2:创建.Net类: 当我们这样一堆的用户的时候,我们需要某种对象来保存.NH是通过reflection对象的属性来工作的,所以我们给需要持久化的对象添加属性.一个对应于上面数据库结构的类可以写成这个样子: using System; namespace NHibernate.Demo.QuickStart { public class User { private string id; private string userName; private string password; private string emailAddress; private DateTime lastLogon; public User() { } public string Id { get { return id; } set { id = value; } } public string UserName { get { return userName; } set { userName = value; } } public string Password { get { return password; } set { password = value; } } public string EmailAddress { get { return emailAddress; } set { emailAddress = value; } } public DateTime LastLogon { get { return lastLogon; } set { lastLogon = value; } } } } 在上面的代码里面,我们把属性和构造函数写成了public-NH并不要求一定要这样做.你可以使用public,protected,internal或者干脆private来标记你的属性. 步骤3:编写映射文件(Mapping File) 现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)方法就是为每一个类编写一个映射文件,如果你把命名为”XXX.hbm.xml”的映射文件和XXX类文件放在同一目录下,NH会很让 一切变得很轻松.这儿,我们的User.hbm.xml可能会像这样: <?xml version=”1.0″ encoding=”utf-8″ ?>

<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.0″>

<class name=”NHibernate.Demo.QuickStart.User, NHibernate.Demo.QuickStart” table=”users”>

<id name=”Id” column=”LogonId” type=”String(20)”>

<generator class=”assigned” />

</id>

<property name=”UserName” column=”Name” type=”String(40)”/>

<property name=”Password” type=”String(20)”/>

<property name=”EmailAddress” type=”String(40)”/>

<property name=”LastLogon” type=”DateTime”/>

</class>

</hibernate-mapping> 让我们来看看这个有趣的映射文件:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库中的user表(这里和hibernate有些不同,我们必须告诉NH这个类从哪儿来的.这个差异是由.Net和Java Reflect机制的不同引起的-zyyang).这种情况下,我们是从Assembly NHibernate.Demo.QuickStart中载入NHibernate.Demo.QuickStart.User类..NH遵守.Net Framework使用Reflection载入类型的规则-所以遇到什么疑惑,就去查查.NET Framework SDK. 让我们暂时跳过”id” tag,先说property节点.”name”属性值就是我们写的.Net类中的属性,column属性值就是在数据库中与’Net类属性对应的字段名.type属性是可选的(如果你没有标明,NH会给出一个最适合的),但是推荐的做法是带上这个属性.hibernate用户会注意到,在type属性值里,我们给出了长度值,这是因为ADO.NET需要这样做. 让我们返回到”id” tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property tag的相似.我们从Property(name)映射到目标数据库的字段(colume). 这些嵌入的Generator标记告诉NH怎样生成Primary Key(NH很方便的就能给你生成一个,不管是什么类型的,只要你告诉它怎样去做).在我们举的例子中,把它设置成”assigned”,意思是”我们的对象将自己生成key”(User对象将总是需要一个UserID),如果你乐意让NH代替你生成,你会对uuid.hex和uuid.string类感兴趣的(参看chm文档). Tip:如果你使用vs.net编译,设置Build Action,把User.hbm.xml文件作为资源绑定到Asssembly,这样映射文件就成了Asssembly的一部分了.后面我们会明白这个步骤的重要性. 步骤4:创建数据库配置文件 目前为止,我们还没有告诉NH到哪儿去找数据库.最直接的方法就是在你程序的配置文件中给NH一个部分,就是这样: <?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>

<configSections>

<section name=”nhibernate” type=”System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089″ />

</configSections>

<nhibernate>

<add key=”hibernate.connection.provider”value=”NHibernate.Connection.DriverConnectionProvider” />

<add key=”hibernate.dialect” value=”NHibernate.Dialect.MsSql2000Dialect” />

<add key=”hibernate.connection.driver_class” value=”NHibernate.Driver.SqlClientDriver” />

<add key=”hibernate.connection.connection_string” value=”Server=localhost;initial catalog=nhibernate;User ID=someuser;Password=somepwd;Min Pool Size=2″ />

</nhibernate>

</configuration> 上面的例子中使用SqlClient驱动,连接到本地的nhibernate数据库,并且使用提供的用户和密码.还会有其他的配置项,你可以参看文档. 步骤5:开始体验NHibernate的神奇 所有艰苦的工作已经做完了.如果所有的工作完成后,你将会有这些成果: æ User.cs – 需要持久化的.Net类. æ User.hbm.xml – 映射文件 æ app.config – 带有Ado.net连接信息的配置文件(你也可以在代码中指定的) æ 一个叫做user的数据库表. 在代码里面使用NHibernate是很简单的事情: 1. 创建一个Configuration对象. 2. 告诉Configuration你想要持久化哪一种对象. 3. 创建一个Session连接到你设定的数据库. 4. 载入,保存和查询你的对象. 5. Flush()你的Session 好,让我们来看看一些代码: 创建一个Configuration对象…. Configuration对象知道所有在.Net类和后端数据库之间的映射关系, Configuration cfg = new Configuration(); cfg.AddAssembly(“NHibernate.Demo.QuickStart”); Configuration对象会查找这个Assembly中所有以.hbm.xml结尾的文件.也有其他的方法添加映射文件,这个可能是最简单的一个. 创建一个Session对象……. ISession对象代表着一个到后端数据库连接,ITransaction代表一个NHibernate管理的事务(Transaction). ISessionFactory factory = cfg.BuildSessionFactory(); ISession session = factory.OpenSession(); ITransaction transaction = session.BeginTransaction(); 载入,保存和查询你的对象…… 现在你可以以.net的方式对待这些对象.想在数据库中保存一个新的user?只需要: User newUser = new User(); newUser.Id = “joe_cool”; newUser.UserName = “Joseph Cool”; newUser.Password = “abc123”; newUser.EmailAddress = “joe@cool.com“; newUser.LastLogon = DateTime.Now; // Tell NHibernate that this object should be saved session.Save(newUser); // commit all of the changes to the DB and close the ISession transaction.Commit(); session.Close(); 这就是NH的好处,大部分时间内你只用关心你的业务对象(BO). 假如你需要根据已经知道的user ID查询一个对象,如果session是open的,你只需要一行: // open another session to retrieve the just inserted user session = factory.OpenSession(); User joeCool = (User)session.Load(typeof(User), “joe_cool”); 这样你又会得到这个对象,设置一下对象的属性,它会在下一次Flush()方法出现的时候被持久化到数据库. // set Joe Cool’s Last Login property joeCool.LastLogon = DateTime.Now; // flush the changes from the Session to the Database session.Flush(); 让NH去写入你对对象作出的修改,你只需要Flush Session就可以了. 更好的是,你可以从数据库中查询到一个System.Collections.IList: IList userList = session.CreateCriteria(typeof(User)).List(); foreach(User user in userList) { Console.WriteLine(user.Id + ” last logged in at ” + user.LastLogon); } 这个查询会返回整个表的内容.尤其是当你想要更多的控制时候–像类出所有在March 14, 2004 10:00 PM之后登陆过的用户,你可以: IList recentUsers = session.CreateCriteria(typeof(User)).Add(Expression.Gt(“LastLogon”, new DateTime(2004, 03, 14, 20, 0, 0))).List(); foreach(User user in recentUsers) { Console.WriteLine(user.Id + ” last logged in at ” + user.LastLogon); } 文档里还有很多的查询选项,但是以上这些足够让你看出Hinernate的力量了. 不要忘记了,最后要关掉你的Session. // tell NHibernate to close this Session session.Close();

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/222865.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
白盒测试:如何进行代码级别的测试?
白盒测试也称结构测试,透明盒测试。主要用于单元测试阶段,代码和逻辑的测试,重点复杂的测试,是一种测试用例设计方法,不同于黑盒测试,白盒测试是可以看到内部代码如何运作的,可通过测试来检测产品内部是否符合规定正常运行。
测试开发技术
2023/08/21
3850
白盒测试:如何进行代码级别的测试?
白盒测试的测试用例设计方法
对简单的程序流程而言,确定程序的路径有多少条可通过:语句覆盖(覆盖率100%);分支(判定)覆盖(覆盖率85%);条件覆盖;分支-条件覆盖;条件组合覆盖;路径覆盖(覆盖率80%)来确定,这也是白盒测试的主要技术。
全栈程序员站长
2022/11/07
1.3K0
白盒测试的测试用例设计方法
软件测试:黑白盒测试的区别及白盒测试全面解析与应用
白盒测试方法应用于代码评审、单元程序之中,而黑盒测试方法则应用于模块、组件等大单元的功能测试之中。
Srlua
2024/10/19
2310
软件测试:黑白盒测试的区别及白盒测试全面解析与应用
【白盒测试】单元测试的理论基础及用例设计技术(6种)详解
综上,白盒测试和黑盒测试的主要区别在于测试者对系统内部结构的了解程度。白盒测试关注程序内部逻辑和代码覆盖率,而黑盒测试则关注系统的功能和用户体验。
SarPro
2024/04/25
7890
【白盒测试】单元测试的理论基础及用例设计技术(6种)详解
白盒测试中的几种覆盖方法
文章转自:http://www.51testing.com/html/44/n-3713444.html 白盒测试用例设计的一个很重要的评估标准就是对代码的覆盖度。一说到覆盖,大家都感觉非常熟悉,但是常见的覆盖都有哪些?各自有什么优缺点?在白盒测试的用例设计中我们应该如何自如地运用呢?今天小编就为大家总结了一下几种常见的覆盖以及各自的优缺点。 白盒测试中常见的覆盖有六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。下面我们就分别看看这几种不同的覆盖究竟是什么鬼。 一、语句覆盖(St
张俊怡
2018/04/24
6.8K0
白盒测试中的几种覆盖方法
嵌入式基础知识-逻辑覆盖测试用例设计
上篇文章:嵌入式基础知识-测试基础概念,介绍了软件测试相关的基础概念,其中白盒测试中的逻辑覆盖率知识点比较复杂,本篇通过实例来讲解各种覆盖率的测试用例该如何设计。
xxpcb
2024/02/01
4020
嵌入式基础知识-逻辑覆盖测试用例设计
自动化测试之-测试用例设计方法总结
黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法等。
顾翔
2019/12/12
3.1K0
自动化测试之-测试用例设计方法总结
图解-白盒测试之逻辑覆盖
白盒测试是一种测试用例设计方法,盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。
wangmcn
2022/07/26
8120
图解-白盒测试之逻辑覆盖
软考高级:白盒测试用例(语句覆盖、判断覆盖、条件组合覆盖、条件判定组合覆盖)概念和例题
白盒测试是一种软件测试方法,它检查程序内部的逻辑结构。在白盒测试中,测试用例是基于程序的内部代码和逻辑来设计的。下面是几种常见的白盒测试用例设计方法的概念解释以及它们对应的Java代码示例。
明明如月学长
2024/05/24
6860
技术分享 | 白盒测试方法论
白盒测试又称为结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例设计方法。盒子指的是被测试的软件,白盒指的是盒子是可视的,即清楚盒子内部的东西以及里面是如何运作的。"白盒"法全面了解程序内部逻辑结构,对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。
霍格沃兹测试开发
2022/03/22
4670
测试技术|白盒测试以及代码覆盖率实践
白盒测试也称逻辑驱动测试,是针对被测单元内部是如何进行工作的测试。它根据程序的控制结构设计测试用例,主要用于软件程序验证,属于基于代码的测试技术。与之相对应的黑盒测试是从用户角度对软件进行测试。
互联网金融打杂
2022/08/01
1.8K0
测试技术|白盒测试以及代码覆盖率实践
软件测试基础知识 – 说一说黑盒与白盒的测试方法[通俗易懂]
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net
全栈程序员站长
2022/09/05
1.1K0
浅谈黑盒测试和白盒测试
  从图中可以直接看出来,黑盒测试就当整个程序是个黑盒子,我们看不到它里面做了些什么事情,只能通过输入输出看是否能得到我们所需的来测试。而白盒测试可以当盒子是透明的,里面的一切我们都看的清楚,从而我们可以通过去测内部结构来测试。
lyb-geek
2018/07/26
3.5K0
浅谈黑盒测试和白盒测试
软件测试用例编写
测试用例是测试工作的指导,是软件测试必须遵守的准则。测试用例的内容是一系列情景和步骤的描述,并对每个步骤中必须列出输入的数据,预计输出结果。将这一过程整理成测试文档,称为测试用例。
用户9184480
2024/12/19
1850
白盒测试 | 用例设计方法之条件组合覆盖
条件组合覆盖:列出所有判定条件中可能的取值组合,使得每个判定条件结果的所有可能组合至少出现一次
王大力测试进阶之路
2022/03/14
2.2K0
白盒测试 | 用例设计方法之条件组合覆盖
黑盒测试和白盒测试的区别
1.        软件测试方法:白盒测试、黑盒测试、灰盒测试、静态测试、动态测试
庞小明
2018/10/11
9.4K1
软件测试技术之: 白盒测试和黑盒测试[通俗易懂]
一般地,我们将软件测试活动分为以下几类:黑盒测试、白盒测试、静态测试、动态测试、手动测试、自动测试等等。
全栈程序员站长
2022/10/02
6.3K0
软件测试技术之: 白盒测试和黑盒测试[通俗易懂]
白盒测试技术_静态白盒测试
它是度量测试完整性的一个工具,通常可以分为逻辑覆盖和功能覆盖。覆盖率 =(被执行到的项数/总项数)* 100%
全栈程序员站长
2022/09/27
1.4K0
白盒测试技术_静态白盒测试
从软件测试看芯片验证-白盒测试
白盒测试是关注测试用例覆盖程序逻辑(源代码)的程度。最终的白盒测试是执行程序中的每个路径。但对于大多数的程序(例如带有循环的程序),完全意义上的全路径覆盖是不现实的。
AsicWonder
2023/09/01
2880
从软件测试看芯片验证-白盒测试
软件工程黑盒白盒测试
等价类划分法是把程序的 输入域 划分为若干部分,然后从每个部分中选取少数代表性数据当作测试用例。
wsuo
2021/01/14
1.4K0
软件工程黑盒白盒测试
推荐阅读
相关推荐
白盒测试:如何进行代码级别的测试?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文