Hibernate是属于数据层的工具类,所以在所有的开发之中,Hibernate只能够在数据层上编写代码。
1、建立一个SHProject; 2、数据库脚本如下:
-- 删除数据库 DROP DATABASE IF EXISTS hedb; -- 创建数据库 CREATE DATABASE hedb; -- 使用数据库 USE hedb; -- 删除数据表 DROP TABLE IF EXISTS `member`; -- 创建数据表 CREATE TABLE `member`( mid VARCHAR(50), mname VARCHAR(50), mage INT, msalary DOUBLE, mbirthday DATE, mnote TEXT, CONSTRAINT pk_mid PRIMARY KEY(mid) );3、为项目添加Hibernate支持与Struts 2.x支持; 4、添加完Hibernate项目之后,考虑设置几个属性;
<property name="show_sql">true</property> <property name="format_sql">true</property>5、本次使用Annotation的配置方式;
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>actionPages</param-name> <param-value>org.lks.action</param-value> </init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>6、要生成POJO类以及对应的Member.hbm.xml文件; (1)现在相当于免去了DatabaseConnection(数据库连接类)、以及VO类的编写。
7、Hibernate就是数据层的操作,那么依然要定义IMemberDAO接口;
package org.lks.dao; import org.lks.pojo.Member; public interface IMemberDAO { public boolean doCreate(Member vo) throws Exception; } package org.lks.dao.impl; import org.lks.dao.IMemberDAO; import org.lks.dbc.HibernateSessionFactory; import org.lks.pojo.Member; public class MemberDAOImpl implements IMemberDAO { @Override public boolean doCreate(Member vo) throws Exception { //如果保存的时候成功会返回当前的数据ID,如果不为空表示增加成功 return HibernateSessionFactory.getSession().save(vo) != null; } }8、要创建DAOFactory工厂类
package org.lks.factory; import org.lks.dao.IMemberDAO; import org.lks.dao.impl.MemberDAOImpl; public class DAOFactory { private DAOFactory(){} public static IMemberDAO getIMemberDAOInstance(){ return new MemberDAOImpl(); } }由于存在由HibernateSessionFactory类,所以这块的连接对象就没有必要传递了。
9、定义业务层接口——IMemberService;
package org.lks.service; import org.lks.pojo.Member; public interface IMemberService { public boolean insert(Member vo) throws Exception; } package org.lks.service.impl; import org.lks.dbc.HibernateSessionFactory; import org.lks.factory.DAOFactory; import org.lks.pojo.Member; import org.lks.service.IMemberService; public class MemberServiceImpl implements IMemberService{ @Override public boolean insert(Member vo) throws Exception { try{ boolean flag = DAOFactory.getIMemberDAOInstance().doCreate(vo); HibernateSessionFactory.getSession().beginTransaction().commit(); //事务提交 return flag; }catch(Exception e){ throw e; }finally{ HibernateSessionFactory.closeSession(); } } }所有复杂的引用关系全部忽略了。
10、定义业务层工厂类
package org.lks.factory; import org.lks.service.IMemberService; import org.lks.service.impl.MemberServiceImpl; public class ServiceFactory { private ServiceFactory(){} public static IMemberService getIMemberServiceInstance(){ return new MemberServiceImpl(); } }与直接使用JDBC相比,此时的代码更加的简化。
1、定义一个MemberAction,同时本处使用分发处理;
package ork.lks.action; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.lks.factory.ServiceFactory; import org.lks.pojo.Member; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") @Namespace("/") @Action("MemberAction") public class MemberAction extends ActionSupport { private Member member = new Member(); public Member getMember() { return member; } public void insert(){ try { System.out.println(ServiceFactory.getIMemberServiceInstance().insert(this.member)); } catch (Exception e) { e.printStackTrace(); } } }2、定义member_insert.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; String insertUrl = basePath + "MemberAction!insert.action" ; %> <html> <head> <base href="<%=basePath%>"> <title>Struts 2.x + Hibernate</title> </head> <form action="<%=insertUrl%>" method="post"> ID: <input type="text" name="member.mid" value="31713011021"><br> Name: <input type="text" name="member.mname" value="hhy"><br> Age: <input type="text" name="member.mage" value="20"><br> Salary: <input type="text" name="member.msalary" value="2000.0"><br> Birthday: <input type="text" name="member.mbirthday" value="1999-08-21"><br> Note: <input type="text" name="member.mnote" value="big fool!"><br> <input type="submit" value="add"> <input type="reset" value="reset"> </form> <body> </body> </html>整个的操作变化,Strusts 2.x基本上不关心数据层。
使用了Hibernate之后,整个的MVC设计模式上,数据层的代码开发一下子减少了许多。