Hibernate是属于数据层的工具类,所以在所有的开发之中,Hibernate只能够在数据层上编写代码。
1 开发业务层
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相比,此时的代码更加的简化。
2 开发控制层及显示层
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设计模式上,数据层的代码开发一下子减少了许多。