Hibernate项目的设计
一、为项目做数据存储的常规处理
⑴在Action部分调用DAO类的save()方法
u 确定DAO类中被调用的方法——save();
u 为save()方法准备数据,即Information类的对象。
代码修改如下:
二、DAO模式实现方式
⑴DAO模式的处理结构
⑵分析处理结构
分析这个图,会有以下几个问题:
u 控制层与DAO层之间是通过业务层做“中介”的,那么业务层应该向控制器提供相应的服务方法来满足控制层的处理要求。
u DAO层中的DAO类集合了对相应数据库表的操作方法,那么业务层应该根据具体的业务要求调用适当的方法完成对数据库表的操作。
u DAO层操作的是Hibernate持久化对象,或者是对象中的某个属性,那么控制层应该准备好相应的数据,通过业务层传递给DAO层。
⑶实施DAO模式设计
需要解决的问题:
① 业务层类汇集了针对某个数据库表的所有业务方法。
② 创建DAO类对象,调用DAO类中的方法。
一个关键机制——创建DAO工厂
⑷创建DAO工厂
创建DAO工厂时的两点说明:
u 由于是static方法,在业务层可以通过DAOFactory.getXXX()的方式调用该方法得到DAO实例了。
u getXXX()方法返回了一个接口:这是DAO模式的一种组织结构,即把DAO类提供的接口独立出来,在业务层只与DAO接口打交道:
遵循的原则是:尽量减少业务层和数据层的各自变化而导致的相互影响,即减少DAO实现变化时Service对DAO层的依赖程度。
三、DAO模式实现过程
⑴编写DAO类接口,并让InformationDAO类实现这个接口
u IInformationDAO接口继承了IBaseHibernateDAO接口,为的是能够拥有getSession()方法,可以在业务层关闭打开的Session对象。
⑵建立DAOFactory工厂类
⑶编写业务层代码
编写业务层时,有以下几点说明:
u 将业务层类放在service包中,给这个类起名为InformationService.java;
uDAO工厂创建了DAO类的实例对象时,使用接口回调的机制;
u 需要通过dao调用getSession()方法获得Seesion对象,这样就可以关闭它了;
u 设计saveInfor()方法的返回类型为boolean型,在控制层可以通过返回值判断数据信息是否在数据库表中存储成功。
⑷修改控制层代码
在前3步设计的基础之上,在控制器部分编程实现与业务层的衔接,InputAction.java中需要修改的代码如下:
Information information=new Information();
information.setNum(Integer.valueOf(0));
information.setBookType(bookType);
information.setBookName(bookName);
information.setBookAuthor(bookAuthor);
InformationService.saveInfor(information);
最后一行代码直接执行了业务层的saveInfor()方法,读者也可以根据其返回值将提示信息存储到内置对象里,在display.jsp页面中进行显示。
⑸发布项目进行测试
⑹整理项目结构
调整过程:将po.information包中的三个文件移动到hibernate包中。这样做的原因是:
被移动的三个文件具有“普遍性”。每创建一个映射文件,其中的DAO类均会引用两个文件:IBaseHibernateDAO.java和BaseHibernateDAO.java;同时DAOFactory.java文件又面向整个项目。
将三个文件放到hibernate包中不是必须的,也可以存到另外的包中。但是hibernate这个名称具有典型性,可能更符合文件的特性。在做了项目结构的调整后,一定要根据快速修复的提示,将诸如import、package等错误修改过来,使得项目正确无误。