本文記錄學習尚硅谷java視頻的學習記錄。
什麼是Hibernate
對於Hibernate的定義按照以下三點來說明:
- 一個框架
- 一個 Java 領域的持久化框架
- 一個 ORM 框架
首先解釋什麼叫持久化?
1.狹義的理解,“持久化”僅僅指把對象永久保存到數據庫中。
2.廣義的理解,“持久化”包括和數據庫相關的各種操作:
- 保存:把對象永久保存到數據庫中。
- 更新:更新數據庫中對象(記錄)的狀態。
- 刪除:從數據庫中刪除一個對象。
- 查詢:根據特定的查詢條件,把符合查詢條件的一個或多個對象從數據庫加載到內存中。
- 加載:根據特定的OID,把一個對象從數據庫加載到內存中。
所謂OID是指爲了在系統中能夠找到所需對象,需要爲每一個對象分配一個唯一的標識號。在關係數 據庫中稱之爲主鍵,而在對象術語中,則叫做對象標識(Object identifier-OID).
ORM(Object/Relation Mapping): 對象/關係映射
ORM 主要解決對象-關係的映射
ORM的思想:將關係數據庫中表中的記錄映射成爲對象,以對象的形式展現,程序員可以把對數據庫的操作轉化爲對對象的操作。
ORM 採用元數據來描述對象-關係映射細節, 元數據通常採用 XML 格式, 並且存放在專門的對象-關係映射文件中.
Hibernate中實現ORM如下圖
在持久化層中Hibernate會提供API方法來方便對數據的操作,在配置文件中主要是做數據庫與對象之間的具體的關係映射。下圖給出一張Hibernate操作數據庫與jdbc操作數據的對比圖:
通過這圖的對比可以看出使用Hibernate做數據的訪問是很節省開發成本的,省下了很多不必要關係的邏輯,而是將重心放在本身的業務邏輯開發中。
現在編寫一個簡單的Hibernate項目
項目結構如下:
項目結構如圖很清晰的項目結構,lib包中放入的是Hibernate所需要的jar包,resources中放入的是Hibernate的配置文件。其中jar包的下載地址https://pan.baidu.com/s/1i4LfEFb,使用的數據庫是oracle,下載地址中也包含了oracle需要的jar包。
從配置文件hibernate.cfg.xml開始分析
<?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-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">star2013</property>
<property name="connection.password">star2013</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<propertyname="cache.provider_class">
org.hibernate.cache.internal.NoCacheProvider
</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- 是否對 SQL 進行格式化 -->
<property name="format_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="com/iflytek/test/domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
該配置文件是直接從Hibernate的官方開發文檔中拷貝過來的,地址http://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html_single/#d5e83,使用的Hibernate版本是4.3版本。
該配置文件中包含了配置連接數據庫的基本信息,和配置 hibernate 的基本信息,以及指定關聯的.hbm.xml文件文件。
以下貼出配置mysql的配置文件信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置連接數據的基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate</property>
<!-- 配置 hibernate 的基本信息 -->
<!-- hibernate 所使用的數據庫方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 執行操作時是否在控制檯打印 SQL -->
<property name="show_sql">true</property>
<!-- 是否對 SQL 進行格式化 -->
<property name="format_sql">true</property>
<!-- 指定自動生成數據表的策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定關聯的.hbm.xml文件 -->
<mapping resource="com/iflytek/test/News.hbm.xml"/>
</session-factory>
</hibernate-configuration>
需要注意的一點是,其中mapping配置關聯文件使用的是目錄地址,這個是需要注意的。
Student實體類的代碼
package com.iflytek.test.domain;
/**
* @desc: Hibernate01
* @author: star2013
* @createTime: 2017年5月11日 下午9:51:09
* @history:
* @version: v1.0
*/
public class Student {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(Long id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
只是簡單的定義了二個基本屬性,沒說明好說的。
Student.hbm.xml orm映射文件
<?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="com.iflytek.test.domain">
<class name="Student" table="TB_STUDENT">
<id name="id" column="ID" type="long"></id>
<property name="name" column="NAME"></property>
</class>
</hibernate-mapping>
HibernateUtil工具類
package com.iflytek.test.util;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static{
Configuration configuration = new Configuration().configure();
//sessionFactory = configuration.buildSessionFactory();
StandardServiceRegistry ssr = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
sessionFactory = configuration.buildSessionFactory(ssr);
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
用於返回SessionFactory
FirstTest測試類
package com.iflytek.test.main;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.iflytek.test.domain.Student;
import com.iflytek.test.util.HibernateUtil;
public class FirstTest {
public static void main(String[] args) {
//創建session對象
Session session = HibernateUtil.getSessionFactory().openSession();
//開啓事物
Transaction transaction = session.beginTransaction();
//select *from TB_studnet where id=?
Student stu = (Student) session.get(Student.class, 1L);
System.out.println(stu.toString());
session.close();
transaction.commit();
}
}
運行項目控制檯打印結果:
從控制檯打印的消息可以看出,執行了一天查詢語句。而在oracle數據庫中Student表並不存在,現在打開Oracle數據庫會發現:
數據庫中自動創建了一張student表,表名和字段和我們在映射文件中定義的是對應的。
在數據庫中插入一天數據在執行代碼看控制檯:
現在控制檯是打印出了數據的。其中session.get(),這是Hibernate提供的API方法。