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的內容,此處的步驟可分爲:
- 獲取Configuration對象
- 獲取SessionFactory對象
- 獲取Session,打開事務
- 用面向對象的方式操作數據庫
- 關閉事務關閉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字段的值,我們看看結果
與數據庫表中一致