1. 程式人生 > >hibernate初識1——hibernate基本認識及hibernate基本配置

hibernate初識1——hibernate基本認識及hibernate基本配置

一、什麼是hibernate

    一個開放原始碼的物件關係對映框架,對jdbc進行了輕量封裝,能夠對資料庫與實體類進行對映,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。少去了建表以及寫sql語句的過程,面對物件的程式設計思維可以使我們能夠更便捷的操作資料庫。

     ps:orm框架:物件-關係對映(OBJECT/RELATIONAL/MAPPING,簡稱ORM),是隨著面向物件的軟體開發方法發展而產生的。用來把物件模型表示的物件對映到基於S Q L 的關係模型資料庫結構中去。

二、使用hibernate的好處

    1、Hibernate不僅負責從Java類對映到資料庫表(從Java資料型別到SQL資料型別),而且還提供了資料查詢和檢索功能。

    2、它可以顯著減少開發時間,可以避免手動編寫SQL語句,實現自動生成SQL語句,自動執行!

    3、Hibernate依然可以使用SQL對資料操作,保證你的技術和知識是有效的一如既往

    4、最為關鍵的一點,Hibernate是ORM模型框架,通過操作實體類(持久化類)進而操作資料庫!這樣Java程式設計師可以隨心所欲的使用面向物件程式設計思想來操作縱資料庫

三、hibernate使用

    1、配置hibernate核心配置檔案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">

頭部資訊來源


資料庫配置

<!-- 1、連線資料庫引數 -->
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_1</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password">111</property>

資料庫方言

<!-- 2、hibernate方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

配置依據

資料庫擴充套件引數

<!-- 3、hibernate擴充套件引數 -->
<!--sql語句是否顯示在console視窗-->
<property name="hibernate.show_sql">true</property>
<!--sql語句是否按格式顯示-->
<property name="hibernate.format_sql">true</property>
<!--表明根據實體類自動更新表結構--><property name="hibernate.hbm2ddl.auto">update</property><property name="current_session_context_class">thread</property> <!--為當前執行緒指定一個值-->

對應的實體類

<mapping resource="com/qfedu/demo/hibernate/pojo/Customer.hbm.xml" />

一般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>

		<!-- 1、連線資料庫引數 -->

		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibdemo</property>

		<property name="hibernate.connection.username">root</property>

		<property name="hibernate.connection.password">123456</property>
		
		<!-- 2、hibernate方言 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

		<!-- 3、hibernate擴充套件引數 -->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		<property name="hibernate.hbm2ddl.auto">update</property>
		<property name="current_session_context_class">thread</property> 
		
		<!-- 4、*.hbm.xml檔案 -->
		<mapping resource="com/qfedu/demo/hibernate/pojo/Customer.hbm.xml" />
	</session-factory>

</hibernate-configuration> 

2、建立實體類

package com.qfedu.demo.hibernate.pojo;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

public class Customer {
	
	private final static Logger LOG = LogManager.getLogger(Customer.class);

	private Long id;

	private String name;
	
	private String gender;
	
	private Integer age;
	
	private String level;
	
	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 String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getLevel() {
		return level;
	}

	public void setLevel(String level) {
		this.level = level;
	}


	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + ", level=" + level
				+ "]";
	}

}

3、新增Customer.hbm.xml

<?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.qfedu.demo.hibernate.pojo">
	<!-- name:類名 table:表名 -->
	<class name="Customer" table="customer">
		<!-- 主鍵 -->
		<id name="id" column="c_id">
			<generator class="native"></generator>
		</id>
		<!-- 其他屬性 -->
		<property name="name" column="c_name"></property>
		<property name="gender" column="c_gender"></property>
		<property name="age" column="c_age"></property>
		<property name="level" column="c_level"></property>
	</class>
</hibernate-mapping>

4、測試

@Test
	public void test() {
		Customer customer = new Customer();
		customer.setName("老王");
		customer.setAge(40);
		customer.setGender("男");
		customer.setLevel("VIP");

		// 3.建立Session物件
		Session session = HibernateUtil.openSession();

		// 4.開啟事務
		Transaction tx = session.beginTransaction();

		// 5.執行新增操作
		session.save(customer);
		//System.out.println(customer.getId());// 自動注入新生成的id

		// 6.提交事務
		tx.commit();

		// 7.關閉資源
		session.close();
		// sessionFactory.close();
		HibernateUtil.close();
	}

執行後發現數據庫添加了資料


ps:junit測試時候會報如下警告


這並不會影響程式碼執行,強迫症可以選擇在hibernate.cfg.xml的hibernate.connection.url的value中添入?useSSL=true,false也可以

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatedemo?useSSL=false</property>

四、hibernate中需要注意的地方

1、hibernate配置檔案中各個標籤的作用

    a.Configuration類:用來讀取Hibernate配置檔案,並生成SessionFactory物件

       

    b. SessionFactory介面:產生Session例項工廠

    

    c.Session介面:用來操作持久化物件。它有get(),load(),save(),update()和delete()等方法用來對PO進行載入,儲存,更新及刪除等操作。它是Hibernate的核心介面

    d.Transaction介面:用來管理Hibernate事務,它主要方法有commit()和rollback(),可以從Session的beginTrancation()方法生成

   e.Query介面:用來對持久化物件進行查詢操作。它可以從Session的createQuery()方法生成

2、實體類配置資訊解析

<?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.qfedu.demo.hibernate.pojo">
	<!-- name:類名 table:表名 -->
	<class name="Customer" table="customer"><!--表名對映的類名與對應的表名-->
		<!-- 主鍵 -->
		<id name="id" column="c_id">
			<generator class="native"></generator>
		</id>
		<!-- 樂觀鎖 -->
		<version name="version" />
		<!-- 其他屬性 -->
		<property name="name" column="c_name"></property>
		<property name="gender" column="c_gender"></property>
		<property name="age" column="c_age"></property>
		<property name="level" column="c_level"></property>
	</class>
</hibernate-mapping>
    

3、session物件的唯一性

    如果由SessionFactory物件來openSession則不能保證接下來同一個執行緒使用的session是同一個session,所以就無法利用session來獲取已經持久化的資料,所以需要其他方式來保證session的唯一性

    在hibernate.cfg.xml中設定

<property name="current_session_context_class">thread</property>

在HibernateUtil工具類中設定獲取session的方法

package com.qfedu.demo.hibernate;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
	private final static Logger LOG = LogManager.getLogger(HibernateUtil.class);

	private static SessionFactory sessionFactory;
	
	private static Map map = new ConcurrentHashMap ();
	
	static {
		// 1.讀取hibernate.cfg.xml檔案
		Configuration cfg = new Configuration();
		cfg.configure();
		sessionFactory = cfg.buildSessionFactory();
	}
	
	public static Session openSession () {
		return sessionFactory.openSession();
	}

	/**
	 * 模擬Hibernate獲取當前執行緒繫結的Session
	 * @return
	 */
	public static Session getCurrentSession2 () {
		Session session = (Session)map.get(Thread.currentThread());
		if (session == null) {
			session = openSession ();
			map.put(Thread.currentThread(), session);
		}
		return session;
	}
	
	public static Session getCurrentSession () {
		
		return sessionFactory.getCurrentSession();
	}
	
	public static void close () {
		sessionFactory.close();
	}
}

對於hibernate.cfg.xml中的配置資訊可以看一下一位大佬的博文:https://www.cnblogs.com/henuyuxiang/p/6676824.html    

相關推薦

hibernate初識1——hibernate基本認識hibernate基本配置

一、什麼是hibernate    一個開放原始碼的物件關係對映框架,對jdbc進行了輕量封裝,能夠對資料庫與實體類進行對映,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。少

資料庫的連線池的原理與Hibernate的內建連線池C3P0的配置

<hibernate-configuration><session-factory>DB連線四要素<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

Ansible-1 基本認識清單與模組

# ansible ##一、常用的自動化運維工具 ###1、puppet 基於ruby開發,採用c/s架構,擴充套件性強,基於ssl,遠端命令執行相對較弱, ###2、saltstack 基於python開發,採用C/S架構,相對puppet更輕量級,配置語法使用YMAL,使得配置指令碼更簡單 ###3、an

HTML基本教程,一些基本常用標簽。

結構 教程 strong pos OS 百度一下 align 百度 fff HTML基本結構,及常用標簽 <DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <ti

hive的基本簡介安裝、配置、使用(一)

hive是什麼? 由facebook開源,用於解決海量結構化日誌的資料統計; 基於hadoop的一個數據倉庫工具,使用HDFS進行儲存並將結構化資料檔案對映成一張表,並提供類sql查詢的功能,其底層採用MR進行計算; 本質是將HQL

windows jdk1.8 改為 1.7過程,環境變數配置

 一、 安裝完成後 當然是配置環境變數:   JAVA_HOME 是我們以後用到jdk所在位置的內容時為了方便,給jdk起的名字,也是java程式約定的變數名,如果沒有,當你在cmd 輸入 java  javac時顯示不出內容; CLASSPATH 是我們引

Hibernate入門學習(1)----認識ORMHibernate

1、ORM(物件/關係資料庫對映) ORM的全稱: Object /Relation Mapping 物件/關係資料庫對映 在目前的java、c#等面向物件的程式語言編寫的資料庫應用程式中,最終的資訊最終儲存在關係型資料庫中,我們在應用程式中需

Hibernate各種基本註解一對一(多)關係對映採坑筆記

hibernate提供兩種方式配置關係對映,一種XMl配置,一種註解。SpringBoot已經自帶了hibernate註解方式,我也是特別喜歡使用註解,特此記下常用的知識點。

JavaWeb學習入門之——圖書館管理系統開發(Hibernate學習1

pass ica void 技術分享 gets 學習 images 創建 driver 最近看了看JavaWeb的書籍,才感覺到大二時候學的JavaWeb才僅僅只是個入門。最尷尬的當初還沒咋學一直在看.NET,現在看起來JavaWeb,各種框架各種頭疼啊。看了幾個例子之後覺

hibernate之初學一對多和多對一配置使用

外鍵 ble dtd nat util gin doc 一對多 dialect 按查詢及存取速率來說的一對多用的相對多對一少一些,這裏只寫主要配置文件的代碼 首先是hibernate的配置文件 <!DOCTYPE hibernate-configuration PU

ssh2項目整合 struts2.1+hibernate3.3+spring3 基於hibernate註解和struts2註解

模塊 port aware -- ids tle des 項目 @service 項目文件夾結構例如以下: 核心配置文件: web.xml <?xml version="1.0" encoding="UTF-8"

hibernate中懶加載和加載的區別

出現 關閉 一個 數據 session異常 hibernate 懶加載 擔心 nat   在hibernate中懶加載會去緩存中找,如果要找的是某一個對象不會出問題,如果是要找某一個對象包含的對象會報session關閉異常,應為我們在緩存中查找了對象過後session就關閉

Hibernate筆記1

oct action 結束 空指針 string 選中 手機 類屬性 tran 一.Hibernate概述 Hibernate是一個實現了ORM思想的,開源的,輕量級的,內部封裝了JDBC操作的持久層框架. 實現了ORM思想的:不再重點關註sql語句的編寫

Hibernate學習筆記(四) --- 映射基本數據類型的List集合

varchar prim drop n) 進行 lis auth pos 方案 集合按其內元素的數據類型分為兩種:基本數據類型集合及復雜對象類型集合,Hibernate對於兩類集合提供不同的映射方式。(在類上以@Embeddable註解的復雜對象數據類型處理方式同基本數據類

Spring的jdbcTemplate 與原始jdbc 整合c3p0的DBUtils Hibernate 對比

throws 殺手鐧 type .org 連接數 tco 一個 iso aso 以User為操作對象 package com.swift.jdbc; public class User { private Long user_id; priva

JavaEE互聯網輕量級框架整合開發(書籍)閱讀筆記(1):Mybatis和Hibernate概念理解

bat 特定 定義 理解 緩存 面向 ont span 等待 一、關鍵字說明: oop:面向對象 aop:面向切面 ioc:控制反轉 orm:對象關系映射 pojo:數據庫表映射的java實體類 二、常識說明:1.hibernate和mybatis都屬於持久層、orm

Hibernate1+N問題以及解決方法

string 使用 number 一個 entity function func 屬性 criteria 1. Hibernate中的1+N問題描述 在多對一關系中,當我們需要查詢多的一方對應的表的記錄時,可以用一條sql語句就能完成操作。然而,在多

hibernate中一對多建表各種操作

實體類: Student private Integer sid; private String sname; private String sage; private String ssex; private Teacher teacher

Hibernate1)——簡單、快速上手

目錄 1. Hibernate-orm 2. 快速上手 2.1 步驟 2.2 建立資料庫表t_user 2.3 建立java物件User.java 2.4 新增jar 2.5  建立hibernate核心配置檔案hibernate.cfg.xml 2.6&n

hibernate11關係

首先主表中要有從表的屬性,從表中有主表的屬性: 主表的hbm.xml: <class name="com.entity.user" table="USER"> <id name="id" type="java.lang.String"&g