springMVC系列之(四) spring+springMVC+hibernate 三大框架整合
首先我們要知道Hibernate五大物件:,本例項通過深入的使用這五大物件和spring+springMVC相互結合,體會到框架的好處,提高我們的開發效率
Hibernate有五大核心介面,分別是:Session Transaction Query SessionFactoryConfiguration 。這五個介面構成了Hibernate執行的基本要素,可以執行存取,持久化,事務管理等操作。這五個介面可以位於系統的業務邏輯層和持久化層。下面是一張Hibernate的關係圖:
Session介面:
Session介面 Session 介面對於Hibernate 開發人員來說是一個最重要的介面。然而在Hibernate中,例項化的Session是一個輕量級的類,建立和銷燬它都不會佔用很多資源。這在實際專案中確實很重要,因為在客戶程式中,可能會不斷地建立以及銷燬Session物件,如果Session 的開銷太大,會給系統帶來不良影響。但是Session物件是非執行緒安全的,因此在你的設計中,最好是一個執行緒只建立一個Session物件。 session
SessionFactory介面:
SessionFactroy介面負責初始化Hibernate。它充當資料儲存源的代理,並負責建立Session物件。這裡用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因為一般情況下,一個專案通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個資料庫指定一個SessionFactory。
Transaction介面
Transaction介面負責事務相關的操作,一般在Hibernate的增刪改中出現,但是使用Hibernate的人一般使用Spring去管理事務。
Query介面
Query負責執行各種資料庫查詢。它可以使用HQL語言或SQL語句兩種表達方式。它的返回值一般是List。需要自己轉換。
Configuration介面:
Configuration物件用於配置並根啟動Hibernate。Hibernate應用通過Configuration例項來指定物件—關係對映檔案的位置或者動態配置Hibernate的屬性,然後建立SessionFactory
第一步:引入相關的包
(對於每個包,我們要有意識的去了解其功能,這樣今後的時候專案中報錯之後我們也可以及時知道錯誤出在哪裡?)
第二: 繼續配置hibernatexml檔案( springAnnotation-hibernate.xml)
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
]>
<beans>
<!-- 配置hibernate相關資料庫的操作 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 資料庫的驅動 -->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<!-- 資料庫的Id,使用者名稱與密碼 -->
<property name="url" value="jdbc:oracle:thin:@192.168.24.248:1521:ORCL"/>
<property name="username" value="lishehe"/>
<property name="password" value="lishehe"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<!-- 配置不同資料庫的方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<!-- 其實這個引數的作用主要用於:自動建立|更新|驗證資料庫表結構。如果不是此方面的需求建議set value="none".
其它幾個引數的意思,我解釋一下:
validate 載入hibernate時,驗證建立資料庫表結構
create 每次載入hibernate,重新建立資料庫表結構,這就是導致資料庫表資料丟失的原因。
create-drop 載入hibernate時建立,退出是刪除表結構
update 載入hibernate自動更新資料庫結構 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 是否顯示sql語句 -->
<prop key="hibernate.show_sql">true</prop>
<prop key="hiberante.format_sql">true</prop>
</props>
</property>
<property name="configLocations">
<list>
<value>
<!-- 讀取和實體相關的xml -->
classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml
</value>
</list>
</property>
</bean>
<!-- 定義事務管理器(宣告式的事務) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
<!-- 配置事務管理器 -->
<property name="transactionManager" ref="transactionManager"></property>
<!-- 配置事務管理器 -->
<property name="transactionAttributes">
<props>
<!-- 下面就開始配置各個模組所必須的部分,在各自的applicationContext-XXX-beans.xml配置的對於事務管理的詳細資訊。
首先就是配置事務的傳播特性,如下: -->
<!-- 配置事務傳播特性 -->
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_NEVER</prop>
</props>
</property>
</bean>
</beans>
</span></span></span>
第三: 新建IUserDAO
<span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;
import java.util.List;
import com.tgb.web.controller.entity.User;
public interface IUserDAO {
public void addUser(User user);
public List<User> getAllUser();
public boolean delUser(String id);
public User getUser(String id);
public boolean updateUser(User user);
}
</span></span>
實現類UserDAo
<span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import com.tgb.web.controller.entity.User;
public class UserDAO implements IUserDAO {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public void addUser(User user) {//新增使用者
sessionFactory.getCurrentSession().save(user);
}
@Override
public List<User> getAllUser() {//查詢所有使用者資訊
String hql = "from User";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
return query.list();
}
@Override
public boolean delUser(String id) {//刪除使用者
String hql = "delete User u where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, id);
return (query.executeUpdate() > 0);
}
@Override
public User getUser(String id) {//根據id得到單個使用者
String hql = "from User u where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);//此時使用的是hql語句
query.setString(0, id);
return (User) query.uniqueResult();
}
@Override
public boolean updateUser(User user) {//修改使用者資訊,hql語句
String hql = "update User u set u.userName=?,u.age=? where u.id=?";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setString(0, user.getUserName());
query.setString(1, user.getAge());
query.setString(2, user.getId());
return (query.executeUpdate() > 0);
}
}
</span></span>
第四: 新建實體User
<span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="T_USER")
public class User {
@Id
@GeneratedValue(generator = "system-uuid") //使用uuid生成主鍵的方式
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(length=32)
private String id;
@Column(length=32)
private String userName;
@Column(length=32)
private String age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
</span></span>
通常是 hibernate.cfg.xml)中宣告永續性類 hibernate.cfg.test.xml
<span style="font-size:18px;"><span style="font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<!-- (通常是 hibernate.cfg.xml)中宣告永續性類: -->
<hibernate-configuration>
<session-factory>
<mapping class="com.tgb.web.controller.entity.User"/>
</session-factory>
</hibernate-configuration></span></span>
第五 : IUserManager
<span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;
import java.util.List;
import com.tgb.web.controller.entity.User;
public interface IUserManager {
public void addUser(User user);
public List<User> getAllUser();
public boolean delUser(String id);
public User getUser(String id);
public boolean updateUser(User user);
}
</span></span>
UserManager實現類
<span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;
import java.util.List;
import com.tgb.web.controller.dao.IUserDAO;
import com.tgb.web.controller.entity.User;
public class UserManager implements IUserManager {
private IUserDAO userDao;
public void setUserDao(IUserDAO userDao) {
this.userDao = userDao;
}
@Override
public void addUser(User user) {
userDao.addUser(user);
}
@Override
public List<User> getAllUser() {
return userDao.getAllUser();
}
@Override
public boolean delUser(String id) {
return userDao.delUser(id);
}
@Override
public User getUser(String id) {
return userDao.getUser(id);
}
@Override
public boolean updateUser(User user) {
return userDao.updateUser(user);
}
}
</span></span>
第六 UserController,控制類
<span style="font-size:18px;">package com.tgb.web.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.tgb.web.controller.entity.User;
import com.tgb.web.controller.service.IUserManager;
@Controller
@RequestMapping("/user")
public class UserController {
@Resource(name="userManager")// 獲取spring配置檔案中bean的id為userManager的,並注入
private IUserManager userManager;
@RequestMapping("/toAddUser")
public String toAddUser(){
return "/addUser";
}
@RequestMapping("/addUser")// 請求url地址對映,類似Struts的action-mapping
public String addUser(User user){
userManager.addUser(user);
return "redirect:/user/getAllUser";
}
@RequestMapping("/getAllUser")
public String getAllUser(HttpServletRequest request){
List<User> user = userManager.getAllUser();
request.setAttribute("user", user);
return "/userManager";
}
@RequestMapping("/delUser")
public void delUser(String id,HttpServletResponse response){
String result = "{\"result\":\"error\"}";
if(userManager.delUser(id)){
result = "{\"result\":\"success\"}";
}
PrintWriter out = null;
response.setContentType("application/json");
try {
out = response.getWriter();
out.write(result);
} catch (IOException e) {
e.printStackTrace();
}
}
@RequestMapping("/getUser")
public String getUser(String id,HttpServletRequest request){
User user = userManager.getUser(id);
request.setAttribute("user", user);
return "/editUser";
}
@RequestMapping("/updateUser")
public String updateUser(User user,HttpServletRequest request){
if(userManager.updateUser(user)){
user = userManager.getUser(user.getId());
request.setAttribute("user", user);
return "/editUser";
}else{
return "/error";
}
}
}
</span>
第七:前臺頁面(詳細內容不再詳列出,原始碼分享給大家)
執行效果
:
總結
這個過程雖然簡單,但是自己操作的過程中還是出現了很多的問題,解決問題,快速成長,進一步驗證了一句話:實踐是檢驗真理的唯一標準!