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設計模式上,數據層的代碼開發一下子減少了許多。