HIbernate入門基礎(一)

Hibernate

Hibernate 是一個高性能的對象關係型持久化存儲和查詢的服務,其遵循開源的 GNU Lesser General Public License (LGPL) 而且可以免費下載。

J2EE三層架構

  • 表示層(WEB):
    代表框架:Struts
  • 業務邏輯層(service)
    代表框架:spring
  • 持久化層(Dao)
    代表框架:hibernate或者Mybatis

我們所用的hibernate框架就處於持久化層,相比Mybatis我更喜歡hibernate,原因有如下幾條:

  • hibernate是全自動,而mybatis是半自動
  • hibernate數據庫移植性遠大於mybatis
  • hibernate擁有完整的日誌系統,mybatis則欠缺一些
  • 緩存機制上,hibernate要比mybatis更好一些
  • hibernate比Mybatis封裝度更高

本文使用的開發環境是eclipse
注意:本文開發平臺爲Linux!!!,
首先肯定是下載eclipse,國外下載地址下載非常慢,所以提供個一個國內鏡像下載地址,是清華源的
清華源eclipse下載地址
下載速度快到飛起!!!

下載eclipse的同時我們開始下載hibernate所用的jar包
官網最新版下載地址:
Hibernate官網

但是速度非常慢,所以我把自己下載好的hibernate jar包上傳到了我的github上:
github
我這裏的版本是5.4.14

在eclipse裏安裝好JBoss Tools的hibernate插件,安裝好後新建項目時會看到
在這裏插入圖片描述一個hibernate項目,那就安裝成功了

現在就可以開始寫代碼了,我這裏的示例是JAVA WEB項目
首先先將剛剛下載的hibernate jar包導入我們的項目目錄
需要導入的jar包在hibernate解壓目錄下的lib目錄中,在此目錄中我們需要將required目錄與jpa-metamodel-generator目錄下的所有jar包導入項目,然後還要將mysql(也可以是其他數據庫)官方提供的用於連接數據庫的jar包也導入進來,hibernate本身沒有的,所以需要我們單獨在去下載,然後導入到我的WEB項目中的WEB_INF/lib目錄下
在這裏插入圖片描述然後要記得吧這些jar包要include進去,光是複製進來是沒用的
然後我在mysql數據庫中新建一個表此表位於CppFastSolution庫中,插入內容
在這裏插入圖片描述現在開始寫一個類,因爲在hibernate中會對數據庫表進行映射,他會將一個表對應到一個持久化類上,所以我們還需要寫一個類,我這裏吧這個類寫到src目錄下
代碼:

package cn.CFS.sql;

public class CUserInfo {
	private long userId;
	private String Passwd;
	private String userName;
	private String email;
	private int sex;
	private String birthday;
	private String regtime;
	private String userURL;
	private String work;
	private String home;
	private int jingyan;
	private int level;
	private int Money;
	private String jihuoStatus;
	
	public void setUserId(long userId) {
		this.userId = userId;
	}

	public void setPasswd(String passwd) {
		this.Passwd = passwd;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public void setEmail(String email) {
		this.email = email;
	}
	
	public void setSex(int sex) {
		this.sex = sex;
	}
	
	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
	
	public void setRegtime(String regtime) {
		this.regtime = regtime;
	}
	
	public void setUserURL(String userURL) {
		this.userURL = userURL;
	}
	
	public void setWork(String work) {
		this.work = work;
	}
	
	public void setHome(String home) {
		this.home = home;
	}
	public void setJingyan(int jingyan) {
		this.jingyan = jingyan;
	}
	
	public void setLevel(int level) {
		this.level = level;
	}
	
	public void setMoney(int money) {
		this.Money = money;
	}
	
	public void setJihuoStatus(String jihuoStatus) {
		this.jihuoStatus = jihuoStatus;
	}
	
	public long getUserId() {
		return userId;
	}
	
	public String getPasswd() {
		return Passwd;
	}
	
	public String getUserName() {
		return userName;
	}
	
	public String getEmail() {
		return email;
	}
	
	public int getSex() {
		return sex;
	}
	
	public String getBirthday() {
		return birthday;
	}
	
	public String getRegtime() {
		return regtime;
	}
	
	public String getUserURL() {
		return userURL;
	}
	
	public String getWork() {
		return work;
	}
	
	public String getHome() {
		return home;
	}
	
	public int getJingyan() {
		return jingyan;
	}
	
	public int getLevel() {
		return level;
	}
	
	public int getMoney() {
		return Money;
	}
	
	public String getJihuoStatus() {
		return jihuoStatus;
	}
}

我這裏類的一個屬性與表中的一個字段對應,且名稱我設置的也完全一樣,類名也與表名一致,其實不一樣也可以,他主要是在xml文件中設置對錶的映射,所以等會的xml配置文件中對應關係沒錯就可以了,設置完類屬性後要分別設置屬性的set,get方法以便我們獲取或設置字段值

現在來設置映射xml文件,此文件的保存位置與名稱沒有限制,因爲他並不會直接加載,而是通過一個hibernate的核心配置類加載的,但是按照官方的標準要求,這個映射文件的名稱應該爲:“文件名.hbm.xml”
我選擇在剛纔的持久化類所在的包下新建一個xml文件,現在要設置映射文件的dtd約束

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

這樣約束就設置好了,現在開始編寫映射文件的主體部分,
步驟大概是:

  • 首先根標籤是<hibernate-mapping></hibernate-mappin>
  • 然後是<class></class>標籤,在此標籤內設置對錶與持久化類的對應關係
  • 其次是主鍵的設置<id></id>此標籤內設置主鍵唯一性約束,以及字段與持久化類屬性的對應關係等,主鍵唯一性約束此使用<generator></generator>標籤完成
  • 然後是普通字段設置,使用<property/>標籤完成,此標籤內同樣要設置字段與持久化類屬性的對應關係
    下面分開細說下每個標籤中要用到的屬性值:
<hibernate-mapping>

此標籤內有一個package屬性她的值可以是持久化類所在的包

<class>

此標籤內有name與table屬性,name屬性設置爲持久化類完整類名,也就是"包名+類名"的完整類名,切記一定是完整類名,table屬性設置持久化類所對應的表

<id>

此標籤內有name與column屬性,name爲持久化類中與與主鍵所對應的類屬性名,column爲主鍵字段名

<generator>

此標籤內有一個class屬性,此屬性可以有許多值,詳情可自行百度查看,通常吧此屬性設置爲native

<property>

此標籤內有name與column兩個屬性,也是用於設置表內字段與持久化類對應關係的

完整映射文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

	
	<hibernate-mapping package="cn.CFS.sql">
	<!-- 建立類與表的對應關係 -->
		<class name="cn.CFS.sql.CUserInfo" table="CUserInfo">
		<!-- 主鍵字段 -->
			<id name="userId" column="userId">
				<generator class="native"/>
			</id>
			<!-- 常規字段 -->
			<property name="Passwd" column="Passwd"/>
			<property name="userName" column="userName"/>
			<property name="email" column="email"/>
			<property name="sex" column="sex"/>
			<property name="birthday" column="birthday"/>
			<property name="regtime" column="regtime"/>
			<property name="userURL" column="userURL"/>
			<property name="work" column="work"/>
			<property name="home" column="home"/>
			<property name="jingyan" column="jingyan"/>
			<property name="level" column="level"/>
			<property name="Money" column="Money"/>
			<property name="jihuoStatus" column="jihuoStatus"/>
		</class>
	</hibernate-mapping>

然後開始編寫hibernate核心配置文件,此文件的位置固定爲src文件夾下,名稱固定爲hibernate.cfg.xml不能有不同
此文件內分別設置:數據庫的登錄信息,其他可選的配置信息,映射文件設置
首先登錄信息必須設置必不可少,裏面包括登錄地址,用戶名與密碼

	<!--設置數據庫驅動-->
	<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!--設置數據庫鏈接地址-->
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/CppFastSolution
		</property>
		<!--設置數據庫登錄用戶名與密碼-->
		<property name="hibernate.connection.username">用戶名</property>
		<property name="hibernate.connection.password">密碼</property>

此處要說明的是<property>標籤的name屬性值是固定的,不同的數據庫她的值可能略有不同,具體內容可找到hibernate解壓目錄下的hibernate.properties文件,找到自己所用的數據庫,那裏面有需要設置的值,在我github裏上傳的壓縮包中,我直接將hibernate.properties文件放到了doc目錄中,可直接查看不需要在搜索查找

然後是可選的其他設置,在這塊可設置是否在表不存在的情況下自動創建表(是的hibernate就是這麼強!),也可以設置數據庫方言等其他信息,不過這塊的設置是可選的,不設置也可以

		<!-- 配置數據庫方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
 

自動創建表的設置值也可以在hibernate.properties文件中找到,就是被我選中的這塊
在這裏插入圖片描述本篇先不細說自動創建表的操作

然後就是最重要的,設置映射文件

		<!-- 加載映射文件 -->
		<mapping resource="cn/CFS/sql/sqlrun.hbm.xml"/>

要注意的是resource屬性中要設置的是映射文件的路徑而不是以點隔開的包名

最後要說明的是以上配置要全部放進<session-factory>標籤中,而<session-factory>標籤要放進<hibernate-configuration>,另外核心配置文件的dtd約束設置也與剛剛的映射文件略有不同

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

完整代碼

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
	
<!-- hibernate核心配置文件 -->
<hibernate-configuration>
	<session-factory>
	<!-- 數據庫信息配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/CppFastSolution
		</property>
		<property name="hibernate.connection.username">用戶名</property>
		<property name="hibernate.connection.password">密碼</property>
		
		<!-- 配置其他信息 -->
		<!-- 配置數據庫方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		
		<!-- 加載映射文件 -->
		<mapping resource="cn/CFS/sql/sqlrun.hbm.xml"/>
	</session-factory>
</hibernate-configuration>
	

下面簡單的寫一個測試JSP頁面看看能不能拿到我剛剛創建好的表CUserInfo的內容,此處的步驟可分爲:

  1. 獲取Configuration對象
  2. 獲取SessionFactory對象
  3. 獲取Session,打開事務
  4. 用面向對象的方式操作數據庫
  5. 關閉事務關閉Session
<%@page import="org.hibernate.Transaction"%>
<%@page import="org.hibernate.Session"%>
<%@page import="cn.CFS.sql.CUserInfo"%>
<%@page import="org.hibernate.SessionFactory"%>
<%@page import="org.hibernate.cfg.Configuration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>

<!-- html前端顯示部分 -->
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- JSP後端處理部分 -->
<%
//配置對象
Configuration cfg=new Configuration().configure();
//事物對象
Transaction tx=null;
//持久化對象
CUserInfo ci=null;
//session工廠
SessionFactory sessionFactory=null;
//session對象
Session databaseSession=null;

try{
	sessionFactory=cfg.buildSessionFactory();
	databaseSession=sessionFactory.openSession();
	tx=databaseSession.beginTransaction();
	ci=(CUserInfo)databaseSession.get(CUserInfo.class, 1000L);
	//提交事物
	tx.commit();
}catch(Exception e){
	%>
		<%="Error:" %>
		<h1><%= e.getMessage() %></h1>
	<% 
}
//如果查詢不到數據則持久化對象爲空
if(ci!=null){
	String name=ci.getUserName();
	%>
	<%=ci.getUserName() %>
	<% 
}
else{
	%>
	<%="無數據" %>
	<%
}

//關閉session
databaseSession.close();
%>
</body>
</html>

此處因爲我已經往表裏插入了數據,故此篇不演示插入操作,只簡單的演示一下讀取操作,此處只簡單的獲取指定userId中userName字段的值,我們看看結果
在這裏插入圖片描述在這裏插入圖片描述與數據庫表中一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章