Spring[1].NET+到Nhibernate到精通
- 格式:doc
- 大小:445.50 KB
- 文档页数:43
1.Java对象持久化概述1.1.应用程序的分层体系结构1.1.1.基于B/S的典型三层架构说明:1,展现层:提供与用户交互的界面。
2,业务逻辑层:实现各种业务逻辑。
3,数据访问层:负责存放和管理应用程序的持久化业务数据。
1.1.2.数据访问层与Hibernate在Java应用程序中的角色数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的API。
完善的持久化层应该达到的目标:1,代码重用性高,可完成所有的数据访问操作。
2,如果需要的话,能够支持多种数据库平台。
3,具有相对独立性,当持久化层变化时,不会影响上层实现。
在数据访问层(持久化层)中可以使用Hibernate框架以实现要求,如下图所示:1.2.软件模型1.2.1.各种模型的说明概念模型:模拟问题域中的真实实体。
描述每个实体的概念和属性及实体间关系。
不描述实体行为。
实体间的关系有一对一、一对多和多对多。
关系数据模型:在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。
有以下内容组成:1,若干表2,表的所有索引3,视图4,触发器5,表与表之间的参照完整性域模型:在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。
组成部分:1,具有状态和行为的域对象。
2,域对象之间的关联。
域对象(domain object):构成域模型的基本元素就是域对象。
对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。
域对象可代表业务领域中的人、地点、事物或概念。
域对象分为以下几种:1,实体域对象:通常是指业务领域中的名词。
(plain old java object,简单Java 对象)。
2,过程域对象:应用中的业务逻辑或流程。
依赖于实体域对象,业务领域中的动词。
如发出订单、登陆等。
3,事件域对象:应用中的一些事件(警告、异常)。
1.2.2.域对象间的关系关联:类间的引用关系。
以属性定义的方式表现。
依赖:类之间访问关系。
Hibernate+Spring多数据库解决方案我以前在项目中的探索和实践,写出来与大家分享。
大家有其他好的方式,也欢迎分享。
环境:JDK 1.4.x , Hibernate 3.1, Spring 2.0.6, JBOSS4.0, 开发模式: Service + DAO我们项目中需要同时使用多个数据库. 但 Hibernate 不能直接支持,为此我们对比了网上网友的方案,自己做了一点探索。
1. Demo需求我们的项目使用一个全省的公共库加十多个地市库的架构。
本文主要说明原理,将需求简化为两库模型。
主库:User管里,主要是系统管理,鉴权等数据;订单库:Order 管理,存放订单等业务性数据。
2. 原理:1) Hibernate 的每个配置文件对应一个数据库,因此多库需要做多个配置文件。
本文以两个为例:主库 hibernate_sys.cfg.xml,订单库 hibernate_order.cfg.xml每个库,Hibernate 对应一个 sessionFactory 实例,因此Hibernate 下的多库处理,就是在多个 sessionFactory 之间做好路由。
2) sessionFactory 有个 sessionFactory.getClassMetadata(voClass) 方法,返回值不为空时,表示该 VO 类在该库中(hbm.xml文件配置在了对应的hibernate.cfg.xml中),该方法是数据路由的核心和关键所在。
因此, User.hbm.xml 配置在 hibernate_sys.cfg.xml ,Order数据位于配置到 hibernate_order.cfg.xml3)多库处理时,需要使用 XA 事务管理。
本例中使用 Jboss4.0 来做JTA事务管理;用JOTM,其他应用服务器原理相同。
3. 实现1)为做多 sessionFactory 实例的管理,设计 SessionFactoryManager 类,功能就是做数据路由,控制路由的核心是 sessionFactoryMap 属性,它按dbFlag=sessionFactory 的方式存储了多个库的引用。
Hibernate项目的构建与配置1.在项目里倒入Hibernate所必须的Jar包(1)Hibernate框架可以使用在任何的Java项目里,并不一定是Web项目。
只需要在项目里倒入Hibernate所必须要使用的jar包就可以了。
(2)在Hibernate的官网下载hibernate-release-4.2.2.Final.zip解压,要使用Hibernate必须导入的jar包就在目录“hibernate-release-4.2.2.Final\lib\required”下。
倒入此路径下的所有jar包就可以了。
2.配置hibernate.cfg.xml文件(1)配置hibernate.cfg.xml文件可以参考“\project\etc”目录下的hibernate.cfg.xml文件与hibernate.properties文件。
(2)使用Hibernate连接MySQL的hibernate.cfg.xml配置文件如下:<hibernate-configuration><session-factory>(设置显示Hibernate产生的SQL语句)<property name="show_sql">true</property>(设置MySQL的SQL语法的方言)<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>(设置MySQL的驱动程序)<property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>(设置MySQL的数据库路径、用户名、密码)<property name="hibernate.connection.url">jdbc:mysql:///java</property><property name="ername">root</property><property name="hibernate.connection.password">lizhiwei</property>(设置当数据库要保存的表不存在时,就新建表)<property name="hibernate.hbm2ddl.auto">update</property>(设置对象与数据库表的关系映射文件)<mapping resource="vo/User.hbm.xml"/></session-factory></hibernate-configuration>(3)此配置文件一般放在项目的src目录下。
Nhibernate操作原生SQL以及查询DataTable使用Nhibernate时我们很方便实现实体映射,但是如果遇到复杂查询则显得力不从心,这是我们可以利用Nhibernate来操作原生sql来查询到DataTable来实现我们复杂的查询及其它操作。
以下实例已经过调试,现与大家分享。
///<summary>///执行ExecuteNonQuery///</summary>///<param name="sql"></param>public void ExecuteNonQuery(string sql){ISession session = null;ITransaction transaction = null;try{session = NHibernateHelper.GetCurrentSession();transaction = session.BeginTransaction();IDbCommand command = session.Connection.CreateCommand();transaction.Enlist(command);//注意此处要把command添加到事物中mandText = sql;command.ExecuteNonQuery();mit();}catch (Exception ex){if (transaction != null){transaction.Rollback();}throw ex;}finally{if (session != null){session.Close();}}}///<summary>///填充DataSet///</summary>///<param name="sql"></param>///<returns></returns>public static DataSet ExecuteDataset(string sql){ISession session = null;DataSet ds = new DataSet();try{session = NHibernateHelper.GetCurrentSession();IDbCommand command = session.Connection.CreateCommand(); mandText = sql;IDataReader reader = command.ExecuteReader();DataTable result = new DataTable();//result.Load(reader);//此方法亦可DataTable schemaTable = reader.GetSchemaTable();for (int i = 0; i < schemaTable.Rows.Count; i++){string columnName = schemaTable.Rows[i][0].ToString(); result.Columns.Add(columnName);}while (reader.Read()){int fieldCount = reader.FieldCount;object[] values = new Object[fieldCount];for (int i = 0; i < fieldCount; i++){values[i] = reader.GetValue(i);}result.Rows.Add(values);}ds.Tables.Add(result);}catch (Exception ex){Debug.Assert(false);}finally{if (session != null){session.Close();}}return ds;}///<summary>///填充DataSet(此方法亦可)///</summary>///<param name="sql"></param>///<returns></returns>public DataSet ExecuteDataset(string sql){ISession session = null;DataSet ds = new DataSet();try{session = NHibernateHelper.GetCurrentSession();IDbCommand command = session.Connection.CreateCommand(); mandText = sql;SqlDataAdapter da = new SqlDataAdapter(cmd as SqlCommand); da.Fill(ds);}catch (Exception ex){Debug.Assert(false);}finally{if (session != null){session.Close();}}return ds;}。
长久以来,程序员和数据库总是保持着一种微妙的关系,在商用应用程序中,数据库一定是不可或缺的元件,这让程序员一定要为了连接与访问数据库而去学习SQL 指令,至少对于我而言,我觉得这是一个很不爽的事情。
因此在信息业中有很多人都在研究如何将程序设计模型和数据库集成在一起,对象关系对应(Object-Relational Mapping) 的技术就是由此而生,像Hibernate或NHibernate都是这个技术下的产物,而微软官方一直没有推出类似的框架,依旧依靠这个传统的数据访问工具。
估计微软也听到了来自程序员的抱怨,于是从一个ObjectSpace(ObjectSpace最早在2005年?被提出,可以让应用程序可以用完全对象化的方法连接与访问数据库,其技术概念与NHibernate相当类似)的概念最后在2008年随.net framework 3.5 SP1发布了 Entity Framework,一个附带有图形化设计器的面向实体数据库访问框架。
Entity Framework 利用了抽象化数据结构的方式,将每个数据库对象都转换成应用程序对象(entity),而数据字段都转换为属性(property),关系则转换为结合属性(association),让数据库的E/R 模型完全的转成对象模型,如此让程序设计师能用最熟悉的编程语言来调用访问。
而在抽象化的结构之下,则是高度集成与对应结构的概念层、对应层和储存层,以及支持Entity Framework 的数据提供者(provider),让数据访问的工作得以顺利与完整的进行。
Entity Framework 以Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为Conceptual Schema, Mapping Schema 与Storage Schema 三层:(1) 概念层:负责向上的对象与属性显露与访问,让上层的应用程序码可以如面向对象的方式般访问数据。
*编写环境:*开发工具:Myeclipse6.01*SPRING :spring2.0*STRUTS :struts1.2*HIBERNATE:hibernate3.0*JDK: 1.6*TOMCAT: 6.0*WINDOW641.新建web项目。
2.选中新建项目,右键--》选择“myeclipse”--》添加Struts支持。
3.在弹出的信息框,有必要修改一下图中的地方。
4.上面的操作完成之后,打开我们的项目我们可以看到我们的项目结构发生了变化,引入了一些struts标签和生成了struts-config.xml配置文件。
5.开始添加spring支持,同样选中新建项目,右键--》选择“myeclipse”--》“添加spring 支持”,在弹出的信息框,做如下内容修改:6.点击“next”,直接选择默认,当然也可根据自己的规则做修改。
7.在添加“Hibernate”支持的时候,首先做的工作是创建一个数据源。
这个创建方法有很多中(找百度可得)这里只介绍一种:打开你的myeclipse的右上角的小三角,选择“myeclipsedatabase explorer”在弹出的界面中,在如图位置右键“new”在弹出的界面中做如下修改:修改完成后点击“test driver”成功则继续。
8.暂时回到myeclipse开发界面。
正式开始添加“Hibernate”支持。
在弹出的界面中做如图修改:点击“next”这里如图,选择spring的配置文件。
下一步操作后,做如下图修改操作:下一步之后,界面修改操作,如下图:去掉复选框中的选项,然后点击“finish”完成整个操作。
之后将会直接打开spring的配置文件,然后你核对一下您的数据库连接是否正确。
至此三大支持操作完成,启动没有问题说明框架雏形已经完成。
9.在项目中的WEB-INF下找到web.xml,做如下修改:格式头部分省略,下面是需要新增的代码<!--初始化spring配置参数 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 配置监听 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</list ener-class></listener><!-- 配置spring过滤器解决中文乱码问题 --><filter>Ps :这个时候我们再次启动服务的时候,发现可能会报错:因为我们在刚才已经把spring 的配置文件做了初始化,而在spring 的配置文件中有数据源的连接,而我们的项目中可能还缺少一个包:commons-pool-1.4.jar(/detail/u013806366/7897665 )当我们把这个包放在lib 下,我们再次启动项目的时候,错误信息应该会消失。
SpringMVC的搭建一直以来接触到的都是SSH的框架,形成了MVC模式,本来并没有想着去弄另一个MVC模式,但现在springMVC模式很热,所以我也学习一下,首先我声明一下,这个框架我也是在网上找了一些资料才完成的,源文件等也是利用的网上的现成的,但是有对其进行修改。
下面来详细的说一说这个模式的搭建。
首先在spring中是以controller来作为控制器(相当于SSH中的action),其他的和SSH框架没有区别。
因为Spring是基于注解的,所以在整个的模式中都是采用注解的方式来处理,这个项目是用springMVC+hibernate一起来搭建的。
这个项目的搭建我花了很久的时间,也弄了蛮久才成功,希望日后能更加完善!理解更加的深入。
一:整体框架的结构图以及所需的jar包。
这里spring是3.0.1,hibernate是用的3.6,数据库是用的mysql 5.6 ,前提工作是要建立好一个数据库,我这里是名为springmvc的数据库来进行操作,这里是采用的hibernate自动更新的方式,所以可以不需要建表只需要建立起数据库就好。
项目框架的代码结构:二:开始搭建环境。
1,首先把上面所需的包添加进来后,我们要在/WEB-INF目录下的web.xml里面添加spring的监听器,以及相关的配置。
源码如下:<?xml version="1.0"encoding="UTF-8"?><web-app version="2.5"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"><display-name>s3h3</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext*.xml</param-value> </context-param><listener><listener-class>org.springframework.web.context.ContextLoaderList ener</listener-class></listener><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</se rvlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><!-- 这里在配成spring,下边也要写一个名为spring-servlet.xml的文件,主要用来配置它的controller --> <url-pattern>*.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list></web-app>2,接下来可以编写spring的配置文件,来整合hibernate,主要的配置写在一个专门存放配置文件的源码目录下config文件夹下,这里的applicationContext.xml是spring的主要配置文件,包括数据源等的配置。
回到 Spring.NET & NHibernate of C#.NET 技术论坛 实战C#.NET编程----Spring.NET & NHibernate从入门到精通
您可以从以下网址下载最新版:http://tech.bokeecn.com 本文中的源代码下载地址:http://tech.bokeecn.com
作 者:李绿华 (William Lee) 制作时间:2006-11-30 版 本 号:V 0.50 版权声明:未经作者本人许可,任何公司、团体、个人都不得以任何方式复制或抄袭本文内容的部分或全部。 转载本文请通过以下方式联系作者获得许可。 邮件:it1630@163.com 目 录 实战C#.NET编程----Spring.NET & NHibernate从入门到精通 第一章 Visual C# .NET 入门指南 一、 C# 简介 二、 使用Visual Studio 开始C# 项目 步骤 1. 开始项目 步骤 2. Hello, World! 步骤 3. 程序结构 步骤 4. 控制台输入 步骤 5. 使用数组 步骤 6. 文件输入/输出 步骤 7. 创建函数 步骤 8. 使用调试器 小结 第二章 面向对像ORM 一、 什么是ORM 二、 为什么需要ORM 三、 流行的ORM框架简介 第三章 Spring.NET入门 一、 Spring.NET概览 二、 第一个Spring.NET的程序 第四章 NHibernate入门 一、 什么是Nhibernate 二、 Nhibernate概述 三、 第一个NHibernate 程序 第五章 Spring.NET 与 NHibernate 的整合 一、 建立新的项目(SpringNHibernateSample) 二、 添加NHibernate程序 三、 添加Spring.NET的程序 四、 添加Spring.NET为NHibernate的容器配置 五、 编写测试程序代码 六、 测试并查看结果 第六章 深入Spring.NET 与 NHibernate开发 第七章 项目实战----办公自动化系统 第八章 结束语
第一章 Visual C# .NET 入门指南
一、 C# 简介 Visual C# .NET 是 Visual Studio 系列中的最新成员。这种新语言基于 C/C++,但它深化了更容易地使用面向组件编程的发展方向。C/C++ 程序员应该非常熟悉它的语法。 下面的示例应用程序示范了如何构建一个简单的实现 QuickSort 算法的 C# 项目。它包括了 C# 程序的基本组成部分:读/写控制台和文件、创建函数和使用基本数组。 这些入门指南并不打算涵盖该编程语言的所有方面。它们只是您探索这种语言的一个起点。我们鼓励您按照本教程的说明执行,因为它包括了 QuickSort 应用程序的各个不同部分。您还可以获得完整的源代码和项目文件。 建议的要求 编译此示例应用程序需要 Visual Studio.NET 2003/2005。关于 C/C++ 的知识是有帮助的但不是必需的。
二、 使用Visual Studio 开始C# 项目
Visual C# .NET 入门指南通过实现一个简单的 QuickSort 算法,带您领略如何构建 Visual C# .NET 项目。 本节将按以下的步骤让大家一步一步了解Visual C#: 步骤 1. 开始项目 步骤 2. Hello, World! 步骤 3. 程序结构 步骤 4. 控制台输入 步骤 5. 使用数组 步骤 6. 文件输入/输出 步骤 7. 创建函数 步骤 8. 使用调试器 小结
你可以下载 Quicksort_Visual_CSharp_.NET.exe 。里面包含了下面的代码。
步骤 1. 开始项目 Visual Studio 中的开发工作以解决方案的形式进行组织,每个解决方案包含一个或多个项目。在本教程中,我们创建的解决方案包含一个 C# 项目。
创建一个新项目 在 Visual Studio .NET 环境中,从菜单中选择 File | New | Project。
在左侧选择 Visual C#Projects,然后在右侧选择 Console Application。
指定项目的名称,然后输入创建项目的位置。Visual Studio 会自动创建项目目录。
单击 OK,那么现在就正式开始了 Visual C# 解决方案 Visual Studio.NET 已经创建了含有一个简单 Visual C# 项目的解决方案。该项目包含两个文件:assemblyinfo.cs 和 class1.cs。 接下来的几步骤将讨论这些不同的文件以及如何编译该项目。 步骤 2. Hello, World! 很遗憾,但我们仍然无法抵御这种诱惑„„我们还是不得不完成一个基于 C# 的经典"Hello, World!"应用程序,这个应用程序最初是用 C 语言编写的。 修改源代码 在 Solution Explorer 中双击文件"class1.cs"。可以通过"View"菜单来显示 Solution Explorer。 更改预生成的模板 (class1.cs),如下面以斜体突出显示的 代码所示。 using System; namespace quicksort { /// /// Summary description for Class1. /// class Class1 { static void Main(string[] args) { // // TODO: Add code to start application here // Console.WriteLine ("Hello, C#.NET World!"); } } }
注意,当您键入代码时,Visual Studio 将为您提示类和函数的名称(因为 .NET 框架发布了这种类型信息)。
编译应用程序 既然您已经完成了修改,就可以通过在 Build 菜单中简单地选择 Build 来编译 Visual C# 项目。
来自 C# 编译器的错误和消息会在 Output 窗口中显示。如果没有错误,则可以通过单击 Debug 菜单下的 Start without Debugging 来运行 Hello World 应用程序。
程序输出 在 Visual C# 中运行 Hello World 示例应用程序时,输出结果的屏幕截图如下:
理解更改
System.Console 类的 WriteLine() 函数打印传递给它的字符串,其后紧跟一行新的字符。此函数可以接受许多其他数据类型(包括整型和浮点型)的参数。 在程序加载完成后,控制就传递给 Main() 函数。这就是我们在该过程中插入对 WriteLine() 调用的原因。 步骤 3. 程序结构 既然我们已经构建了一个简单的 Hello World 应用程序,那么就让我们停下来分析一下 Visual C# 应用程序的基本组成部分。 源代码注释 字符 “//” 将行的剩余部分标记为一个注释,这样 C# 编译器就会忽略它。另外,/* 和 */ 之间的代码也会被当作注释。 // This line is ignored by the compiler. /* This block of text is also ignored by the Visual C# compiler. */
Using 指令
.NET 框架为开发人员提供了许多有用的类。例如,Console 类处理对控制台窗口的输入和输出。这些类是按照层次树的形式组织的。Console 类的完全限定名实际上是 System.Console。其他的类包括 System.IO.FileStream 和 System.Collections.Queue。 using 指令允许您在不使用完全限定名的情况下引用命名空间中的类。以斜体突出显示的代码应用了 using 指令。 using System; class Class1 { static void Main(string[] args) { System.Console.WriteLine ("Hello, C#.NET World!"); Console.WriteLine ("Hello, C#.NET World!"); } }
类声明
与 C++ 或 Visual Basic 不同,Visual C# 中的所有函数都必须封装在一个类中。class 语句声明一个新的 C# 类。就 Hello World 应用程序来说,Class1 类包含一个函数,即 Main() 函数。如果用一个 namespace 块将类的定义括起来,就可以把类组织为诸如 MsdnAA.QuickSortApp 这样的层次。