您好,欢迎访问一九零五行业门户网

ORM利器:NHibernate(三)五部曲+简单对象CRUD+HQL

前面的两篇文章中,我们对nhibernate已经做了大致了解 《orm利器:nhibernate(一)简介》nhibernate的作用:解决了对象和数据库的转化问题 《orm利器:nhibernate(二)使用codesmith快速生成映射文件和映射类 》利用codesmith由表导出映射类(就是通常所说
前面的两篇文章中,我们对nhibernate已经做了大致了解
《orm利器:nhibernate(一)简介》nhibernate的作用:解决了对象和数据库的转化问题
《orm利器:nhibernate(二)使用codesmith快速生成映射文件和映射类 》利用codesmith由表导出映射类(就是通常所说的entity)和映射文件(告诉你表和对象之间是如何建立一一对应的关系的)。
接下来将会对nhibernate的使用做demo解析,分为五部曲:
创建表。若要把对象转换为数据库中的表,自然要有对一个的表。因此,首先要在数据库中创建把.net类持久化的对应表。创建类。创建需要被持久化的.net类.对象。创建映射文件。 描述对象和库之间的关系,告诉nh怎样持久化这些类的属性.创建nh的配置文件,以告诉nh怎样连接数据库,以何种方式连接不同种类的数据库。使用nh提供的api。维护对象和库之间的关系,对对象的crud和对数据库的dml.
步骤详情: 第一部:创建表(步骤很简单,这里不做解释)
第二部:创建类+第三部:创建映射文件(本demo利用codesmith自动生成,详细请参见《orm利器:nhibernate(二)使用codesmith快速生成映射文件和映射类 》)
第四部:创建nh配置文件 主要用于连接数据库:驱动的提供者、驱动的位置、数据库的身份验证信息等,和我们曾经写过的数据库连接语句无意,只不过放在了配置文件中而已。而且nh采用代理工厂,针对不同的数据库产品进行生产,提供了更好的灵活性,如果你需要把sqlserver数据库,更改为oracle数据库,只需要更改相应的配置信息就可以。 nhibernate.connection.connectionprovider,nhibernate nhibernate.driver.sqlclientdriver server=(local);initial catalog=nhibernate;integrated security=sspi nhibernate.dialect.mssql2008dialect false nhibernate.bytecode.linfu.procxyfactoryfactory,nhibernate.bytecode.linfu
如果你觉得配置文件很复杂、记不住,也没有关系。nh为我们提供了很多配置文件的模板以供参考,这里我们采用sqlserver,因此可以参照:configuration_templates—mssql.cfg.xml第五部:使用nh提供的api。维护对象和库之间的关系,对对象的crud和对数据库的dml
1、目录结构如下:
1)新建类库test:
用于存放所有的对象和.net映射文件(如此处的person.cs对象,person.hbm.xml映射文件),为了让nhibernate能够找到所有的映射文件,必须设置为“嵌入资源”,生成test.dll文件备用。
2)添加引用:
外部引用nhibernate和nhibernate.bytecode.linfu.项目引用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 { //创建session isession 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 persons = query.list(); //persons.p1(); //查询编号为2的人的信息 //iquery query = session.createquery(from person where id=3); //query.list().p1(); //查询名字中有字母a的人 //session.createquery(from person where name like '%a%').list().p1(); //session.createquery(from person where t_name like '%a%').list().p1(); //session.createquery(from person where name like '%a%').list().p1();//错误 //查找全部 //session.createquery(select p from person p).list().p1(); //session.createquery(select * from person ).list().p1();//错误,没有* //查找编号大于5的人的信息 //session.createquery(from person p where p.id>5 ).list().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().p1(); //传参2 //iquery query = session.createquery(from person p where p.id>:id); //query.setparameter(id, 7); //query.list().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().skip(3).take(5).tolist(); ; //用icriteria来实现该功能可能更方便 } //对ilist类型数据的输出,建议用c#3.0的拓展方法来实现 public static class extraclass { public static void p1(this ilist p) { //获取可枚举的接口对象 ienumerator 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的使用。
其它类似信息

推荐信息