重构项目使用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,如需转载请自行联系原作者

目录
相关文章
|
5天前
|
XML Java 数据格式
Spring 项目如何使用AOP
Spring 项目如何使用AOP
19 2
|
5天前
|
Java Spring
Spring boot项目如何发送邮件
Spring boot项目如何发送邮件
16 2
|
11天前
|
Java API 数据安全/隐私保护
【亮剑】如何在Java项目中结合Spring框架实现邮件发送功能
【4月更文挑战第30天】本文介绍了如何在Java项目中结合Spring框架实现邮件发送功能。首先,需在`pom.xml`添加Spring和JavaMail依赖。然后,在`applicationContext.xml`配置邮件发送器,包括SMTP服务器信息。接着,创建一个使用依赖注入的`EmailService`类,通过`JavaMailSender`发送邮件。最后,调用`EmailService`的`sendSimpleEmail`方法即可发送邮件。最佳实践包括:使用配置管理敏感信息,利用`MimeMessage`构造复杂邮件,异常处理和日志记录,以及在大量发送时考虑使用邮件队列。
|
15天前
|
Java Maven Docker
0.07 秒启动一个 SpringBoot 项目!Spring Native 很强!!
0.07 秒启动一个 SpringBoot 项目!Spring Native 很强!!
26 2
|
22天前
|
安全 Java API
第5章 Spring Security 的高级认证技术(2024 最新版)(上)
第5章 Spring Security 的高级认证技术(2024 最新版)
46 0
|
22天前
|
Java Linux 虚拟化
Docker 部署spring-boot项目(超详细 包括Docker详解、Docker常用指令整理等)
Docker 部署spring-boot项目(超详细 包括Docker详解、Docker常用指令整理等)
56 1
|
23天前
|
存储 Java Maven
江帅帅:Spring Boot 底层级探索系列 01- 搭建项目
江帅帅:Spring Boot 底层级探索系列 01- 搭建项目
35 0
江帅帅:Spring Boot 底层级探索系列 01- 搭建项目
|
23天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
34 0
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
27天前
|
缓存 Java Spring
单体项目中资源管理模块集成Spring Cache
该内容是关于将Spring Cache集成到资源管理模块以实现缓存同步的说明。主要策略包括:查询时添加到缓存,增删改时删除相关缓存。示例代码展示了@Service类中使用@Transactional和@Cacheable注解进行缓存操作,以及在RedisTemplate中处理缓存的示例。
24 5
|
27天前
|
Java Shell 开发者
个人开发者,Spring Boot 项目如何部署
个人开发者部署Spring Boot项目教程:利用Linux、docker和docker-compose。项目目录包含`Dockerfile`、`docker-compose.yml`和脚本`build-docker-compose.sh`。`Dockerfile`基于`openjdk:17-jdk-alpine`构建镜像,设置时区并添加jar。`docker-compose.yml`定义服务,映射端口和挂载数据卷。升级时,将新jar放入`jars`目录,运行`sh build-docker-compose.sh`更新容器。
20 1