重构项目使用Spring+Hibernate+HibernateAnnotation+GenericDao技术

简介:

本文首先要讲述我重构原先课程大作业做过的一个汽车4S店业务管理系统的过程。

2011-12-25

  记录将原有项目从Spring+Hibernate的框架改造成Spring+Hibernate+HibernateAnnotation+GenericDao的过程。

  首先,是要尽量做到使系统的数据库访问层能够通用,以后做类似的基于SSH框架的项目可用重用我们现在的数据访问层的代码。比如用户信息数据访问层UserDao的实现我们可以参见我前一篇博客:数据库访问层中使用GenericDao和HibernateDaoSupport。其实,如果为了简洁方便,在需要访问数据库的时候,我们可以不写接口UserDao和接口实现UserDaoImpl,而是直接通过如下代码来实现UserDaoImpl的功能:

  GenericDaoImplHibernate<User> userDaoImpl=new GenericDaoImplHibernate<User>();
List<User> list=userDaoImpl.findAll(User.class);

但是为了使得我们的数据库访问层扩展性更好,我们还是使用了UserDao和UserDaoImpl这两个类。在后面我们会见到扩展性的优势。

  其次,是关于Hibernate-Annotation的使用问题,原先是通过pojo文件+.hbm文件进行数据库映射,现在发现使用.hbm文件过于繁杂,考虑使用带标注的pojo来实现数据库映射。具体方法可以参见我前面写过的一篇博客:使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本。在这篇文章中介绍了在已知.hbm文件的情况下,如何生成带标注的pojo文件。

2011-12-26

  然后是对各个技术进行分析,原先系统使用了Spring-MVC中的一些内容,比如url拦截,session注入等功能。那么我现在考虑不使用Spring提供的sessionFactory注入,而是在具体的dao中使用自己定义的HibernateSessionFactory来实例化sessionFactory。这样也是可以实现的。(之所以不使用Spring提供的sessionFactory注入是为了调试方便,因为如果要使用Spring的依赖注入,则必须启动tomcat服务器进行调试,而不能直接通过写java demo类来调试方法。

  首先我们来看spring配置文件的变更,原来是通过在spring中注册.hbm文件来实现数据库的映射,配置方法如下:

View Code

  现在我们使用了Hibernate-Annotation,因此不再需要管理.hbm文件,不过需要一个单独的hibernate.cfg.xml来进行数据库映射。spring配置内如容下:

View Code

  注意到在上述配置中有一个 <property name="configurationClass">,这个属性指定的类就是org.hibernate.cfg.AnnotationConfiguration。这表示使用hibernate-annotation。还有 <property name="configLocation">指定的地址是:classpath:hibernate.cfg.xml。这表示要将hibernate.cfg.xml文件放在src的根目录下。eclipse项目中,classpath就是src目录,当将项目发布到服务器以后,hibernate.cfg.xml会被发布到apache-tomcat\webapps\carmis\WEB-INF\classes这个目录下。接下来是hibernate.cfg.xml配置文件的内容,内容如下所示:

View Code

  对于hibernate.cfg.xml的结构与内容我们都已经很熟悉了,这里就不再赘述。仔细查看这个配置文件,我们会发现<mapping class>对应的属性是Pojo类,而之前我们在spring中配置的是 <property name="mappingResources">,他所对应的是.hbm文件。

  上述的变更都是为了适应hibernate-annotation,也就是不再使用.hbm文件进行数据库映射,而使用带注释的Pojo进行数据库映射作出的配置文件变更。下面的变更是为了不使用sessionFactoryd的IOC,而是通过在DaoImpl中手动知道sessionFactory。下面先来看一下配置文件的对比:

View Code

——————————————————————————————

PS:2012-5-20反射的应用

  在使用spring的时候我们经常会提到依赖注入的问题,这里所谓的依赖注入就是并不在类中显示创建对象,比如类似:UserDaoImpl userDaoImpl=new UserDaoImpl(); 这样的显示创建userDaoImpl实例,而是通过<bean id="userDaoImpl" class="edu.sjtu.ist.ssh.dao.impl.UserDaoImpl">这样的配置文件来创建一个userDaoImpl对象实例。这里用到了java的反正机制,通过一个字符串描述具体的类型就可以创建一个userDaoImpl对象。在具体使用userDaoImpl对象的时候,相当于调用了UserDaoImpl userDaoImpl=Class.forName(edu.sjtu.ist.ssh.dao.impl.UserDaoImpl).getInstance(); 这样的方法。

  至于其中的property属性:<property name="sessionFactory"> <ref bean="sessionFactory" /> </property> 相当于是在构造函数中设置了一定的参数。如果我们不设置property属性那么就需要在UserDaoImpl类中显示声明那些必须进行初始化的参数。比如上述的sessionFactory这个属性。这个sessionFactory就是需要注入的参数

——————————————————————————————

  spring的一大特点就是IOC,IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务,容器负责将这些联系在一起。现在就是在配置文件中,我们指定组件userDaoImpl是由类edu.sjtu.ist.ssh.dao.impl.UserDaoImpl实例化而来,并且sessionFactory是需要注入的对象实例。而carDaoImpl中则没有需要注入的对象实例,这是因为我们在CarDaoImpl这个类中进行了手工注入,代码如下所示:

View Code

  而HibernateSessionFactory的定义则如下述代码所示:

View Code

  这里HibernateSessionFactory所起到的功能就是类似于spring配置文件中的<bean id="sessionFactory">。通过上述的方法,我们就不再需要在配置文件中注入sessionFactory这个实例。这样做的一个好处是我们能够在不启动tomcat服务器的情况下,就能使用CarDaoImpl这个类,能够更好的测试他们。如果要使用spring的依赖注入这一特性注入sessionFactory这个实例,那么必须启动tomcat,然后才能使用CarDaoImpl这个类。

  还有就是不使用spring的action,而是使用stucts来作为项目MVC架构中的Controller。即真正实现我们的SSH架构,而不是我们当前的SH架构。

2011:12-27--12-28

再接着实现日志管理功能。我们可以使用log4j,也可以让common-logging结合log4j来使用,还有可以使用sflog4j等等日志管理功能。更是可以自己对log4j进行封装,自定义日志管理功能。当前比较推荐的使用common-logging和log4j结合使用的模式。因为common-logging和log4j都是开源项目,可是使用GreenUML来查看这两个项目的整体架构,可以从中学习到一些知识,比如设计模式中的单例模式,工厂模式的使用等等。关于log这一部分的内容,可以参考我的一篇博客:log4j+commons-logging结合使用,里面详解介绍了log的使用方法,并且根据log的不同等级往不同地址存储log。

2012-1-10

1)使用消息托送的方式实现看板,消息中间件用ActiveMQ。

2)实现数据库的备份还原,不得单单只是按钮,还需要一个操作界面,能够选择具体备份还原哪一个数据库。刚开始需要插入的信息是数据的基本信息,比如connecturl,databasename,username,password等等,后期就是对这个数据库进行操作。

3)实现文件的上传下载功能,还有一个上传下载的功能界面用户管理上传的文件。比如删除功能。

2012-2-19

一个多月的寒假,玩到罪恶感回来,开始新的学期,fighting!

2012-10-29

那么IOC的好处是什么呢?

在以前如果要使用一个类B的方法,那么就必须在当前类A下new一个B类的实例,这样间接会造成A与B的耦合,而如果使用IOC,那么就不需要使用new来创建对象了,而是通过配置文件来创建对象,负责这一任务的是spring 容器。这样相当于是解耦工作,当我们业务发生变成的时候,就不再需要修改原有代码,而只需要修改配置文件即可。

比如我们要访问数据库都会使用到DAO层,而DAO层也是根据特定数据库来写的,加入原先使用的是SQL Server,那么现在加入要使用Oracle了,如果没有使用IOC,那么就必须在原有代码下修改。而加入使用了IOC,那么我们只需要修改配置文件,将DAO指向新的数据库访问层即可。不过这些需要具体Oracle的DAO层。但是这样没有修改原有的代码。代码增加远远好于代码变更。

 

本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/12/26/2302225.html,如需转载请自行联系原作者

目录
相关文章
|
19天前
|
消息中间件 Java 开发者
【颠覆想象】Spring Boot重构未来:解耦与隔离,打造坚不可摧的微服务帝国!
【8月更文挑战第29天】本文通过构建电子商务平台的具体案例,深入探讨了如何利用 Spring Boot 实现服务间的解耦与隔离。文章详细介绍了依赖注入、模块化设计及异步通信等关键技术,并提供了具体代码示例。通过依赖注入,对象间耦合得以降低;模块化设计使各功能域独立,降低系统复杂度;异步通信则利用消息队列提升系统吞吐量与响应速度。这些方法不仅优化了系统架构,还加快了开发进程。
38 0
|
19天前
|
开发框架 负载均衡 Java
当热门技术负载均衡遇上 Spring Boot,开发者的梦想与挑战在此碰撞,你准备好了吗?
【8月更文挑战第29天】在互联网应用开发中,负载均衡至关重要,可避免单服务器过载导致性能下降或崩溃。Spring Boot 作为流行框架,提供了强大的负载均衡支持,通过合理分配请求至多台服务器,提升系统可用性与可靠性,优化资源利用。本文通过示例展示了如何在 Spring Boot 中配置负载均衡,包括添加依赖、创建负载均衡的 `RestTemplate` 实例及服务接口调用等步骤,帮助开发者构建高效、稳定的应用。随着业务扩展,掌握负载均衡技术将愈发关键。
41 6
|
15天前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
39 7
|
1月前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
199 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
1月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
31 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
1月前
|
前端开发 JavaScript Java
spring boot+vue前后端项目的分离(我的第一个前后端分离项目)
该博客文章介绍了作者构建的第一个前后端分离项目,使用Spring Boot和Vue技术栈,详细说明了前端Vue项目的搭建、后端Spring Boot项目的构建过程,包括依赖配置、数据库连接、服务层、数据访问层以及解决跨域问题的配置,并展示了项目的测试结果。
spring boot+vue前后端项目的分离(我的第一个前后端分离项目)
|
13天前
|
JavaScript 前端开发 Java
【颠覆传统】Spring框架如何用WebSocket技术重塑实时通信格局?揭秘背后的故事与技术细节!
【9月更文挑战第4天】随着Web应用对实时交互需求的增长,传统的HTTP模型已无法满足现代应用的要求,特别是在需要持续、双向通信的场景下。WebSocket协议由此诞生,提供全双工通信渠道,使服务器与客户端能实时互发消息。作为Java开发中最受欢迎的框架之一,Spring通过其WebSocket模块支持这一协议,简化了WebSocket在Spring应用中的集成。
31 0
|
16天前
|
前端开发 Java Spring
Spring与Angular/React/Vue:当后端大佬遇上前端三杰,会擦出怎样的火花?一场技术的盛宴,你准备好了吗?
【8月更文挑战第31天】Spring框架与Angular、React、Vue等前端框架的集成是现代Web应用开发的核心。通过RESTful API、WebSocket及GraphQL等方式,Spring能与前端框架高效互动,提供快速且功能丰富的应用。RESTful API简单有效,适用于基本数据交互;WebSocket支持实时通信,适合聊天应用和数据监控;GraphQL则提供更精确的数据查询能力。开发者可根据需求选择合适的集成方式,提升用户体验和应用功能。
47 0
|
16天前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
35 0