1. 程式人生 > >Hibernate入門學習(一)

Hibernate入門學習(一)

都說年底了,大夥應該都在衝回款,忙的不可開交啊啥的。唯獨我這個剛轉正三個月的閒來無事,只得在上班時間來給自己充充電,也不好玩別的,畢竟剛來公司不久,沒有那些老鳥膽子大,凡事低調點,就開始看起了視訊。下面簡單記錄下自己學習到的東西,今天一天看了Hibernate的學習視訊,自己總結了一下,也好順便縷縷,消化一下:

一:下載Hibernate:http://hibernate.org/orm/downloads/並且進行解壓,裡面有個lib資料夾,裡面全是Hibernate所依賴的jar包,當然,不能缺少的核心包hibernate3.jar(這裡我用到的是hibernate3),至於和現在的hibernate4有啥區別,自己也不清楚(希望有大牛能給我指正);

二:jar包都準備好後,就可以新建一個java project,將剛才的的jar包全部匯入(當然可能不是所有jar包都需要,但是本屌也不清楚哪些可以不要,為了以防萬一,都進行匯入,安全起見嘛);
三:工程建好後,我們就可以來進行我們的開發練習咯:
首先,我們先在src目錄下新建一個hibernate.cfg.xml檔案(至於為啥在src目錄下,因為src目錄最終會編譯到一個bin資料夾中也就是類路徑下(classpath下面),伺服器啟動時會自己在classpath下尋找該檔案進行解析載入進來);
其次,就開始進行對hibernate.cfg.xml檔案配置進行講解(我連線的是MySQL5資料庫,這裡必須將mysql-connector-java.jar驅動包匯入):

<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- mysql驅動 -->
<property name="hibernate.connection.url">jdbc:mysql:///test</property><!-- mysql預設連線資料庫test以及預設埠3306 -->
<property name="hibernate.connection.username">root</property><!-- 使用者名稱 -->
<property name="hibernate.connection.password">root</property><!-- 密碼 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- mysql方言 -->
<property name="hbm2ddl.auto">create</property><!-- 更新資料庫方式 -->
<property name="show_sql">true</property><!-- 是否後臺列印語句 -->
<mapping resource="toone/com/cn/bo/User.hbm.xml"/><!--對映檔案-->
</session-factory>
</hibernate-configuration>

以上屬性(property)我們都可以在之前下載的Hibernate解壓包中的etc資料夾下的hibernate.properties檔案中找到()。這裡對hbm2ddl.auto進行說明一下(有四個值):

create:每次載入hibernate時都會刪除上一次的生成的表,然後根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,這就是導致資料庫表資料丟失的一個重要原因。
create-drop :每次載入hibernate時根據model類生成表,但是sessionFactory一關閉,表就自動刪除。
update:最常用的屬性,第一次載入hibernate時根據model類會自動建立起表的結構(前提是先建立好資料庫),以後載入hibernate時根據 model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等應用第一次執行起來後才會。
validate::啟動時驗證現有schema與你配置的hibernate是否一致,如果不一致就丟擲異常,並不做更新。

四:接下來我們就可以來進行我們的實體開發了:

User.java

package toone.com.cn.bo;
import java.util.Date;
public class User {
	private int id;//必須有主鍵,因為hibernate很多方法都需要用到主鍵id
	private String name;
	private Date birthday;//必須提供預設的構造方法,這裡沒有,但是所有類都帶有預設的構造方法;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

User.hbm.xml(對映檔案)

<hibernate-mapping package="toone.com.cn.bo.domain">
	<class name="User" table="user"><!--這裡的table值對應資料庫中的表名;如果沒有table值,預設等於類名小寫 -->
		<id name="id" column="id">
			<generator class="native"></generator><!--採用主鍵自增長方式-->
		</id>
		<property name="name" column="name"/><!-- 這裡的column值對應資料庫中的屬性名;如果沒有column值,預設等於屬性名 -->
		<property name="birthday" column="birthday"/>
	</class>
</hibernate-mapping>


五:最後我們就可以來進行我們的業務開發了(主要進行user的增刪改查操作):

以前的採用jdbc來進行連線資料庫的方式是很煩瑣的,這裡就充分發揮了hibernate的方便與優勢了:

Main.java

package toone.com.cn;
import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import toone.com.cn.bo.User;
public class Main {
	public static void main(String[] args){	
//這裡千萬注意,不能寫成Configuration cfg = new Configuration();否則會報Hibernate Dialect must be explicitly set 錯誤資訊將我們誤導
//;實際上前面我們已經配置了mysql的方言;
		Configuration cfg = new Configuration().configure();//對於configure()方法,我們可以引入其原始碼進行檢視,其會在類路
//徑下自動去載入一個預設的hibernate.cfg.xml檔案;如果我們想換其他名字,可以使用其過載方法,具體可以檢視其原始碼(下載的壓縮包中有)
		SessionFactory factory = cfg.buildSessionFactory();
		User user = new User();
		user.setName("Kobi");
		user.setBirthday(new Date());
		Session session = null;
		Transaction tx = null;
		try {
			session = factory.openSession();
			tx = session.beginTransaction();//開啟事務
			session.save(user);//進行儲存
			tx.commit();//提交事務
		} catch (HibernateException e) {
			if(tx!=null){
				tx.rollback();//回滾事務
			}
			throw e;//必須丟擲異常
		}finally{
			if(session!=null){
				session.close();//關閉session
			}
		}
	}
}
好了,一個新增功能就已經實現,但是寫到這裡,我們可能發現我們每進行一次操作,比如新增,修改,刪除,查詢都需要執行這段程式碼:
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
這段程式碼非常耗效能,因為它每次都需要去載入解析配置檔案hibernate.cfg.xml,並且每次都需要建立session;因此我們不妨自己建立一個工具類,採用單利的方式來進行實現,並且該工具類實現實體的增刪改查,程式碼如下:

HibernateUtils.java

package toone.com.cn.util;

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
	private static SessionFactory sessionfactory;
	private HibernateUtils(){}
	static{
	Configuration cfg = new Configuration().configure();
	sessionfactory = cfg.buildSessionFactory(); 
	}
	public static Session getSession(){
		return sessionfactory.openSession();
	}
	//新增
	public static void add(Object obj){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			session.save(obj);//區別:save()方法如果沒有開啟事務,它會執行一條插入語句,但之後由於沒有提交事務,它又進行
			//session.persist(obj);//回滾了,而persist()方法在沒有開啟事務的時候,它根本不會去執行,即沒有那條插入語句
			tx.commit();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	//修改
	public static void update(Object obj){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			session.update(obj);
			tx.commit();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	//刪除
	public static void delete(Object obj){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			session.delete(obj);
			tx.commit();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}
	//查詢 不需要開啟事務
	public static Object findById(Class clazz,Serializable id){
		Session session = null;
		try {
			session = HibernateUtils.getSession();
		//這裡需要區分一下get()與load()的區別,load()不會立即//去訪問資料庫只有在第一次使用的時候才會去載入(懶載入);
		//load方法永遠不可能返回空物件(如果不存在,其會產生一個user的子類)具體可以去查資料區別這兩個方法
			//Object obj = session.load(clazz, id);
			Object obj = session.get(clazz, id);return obj;}finally{if(session!=null){session.close();}}}}

最後,一個實體的增刪改查操作就完成了,下面我們可以重寫Main.java檔案來使用HibernateUtils工具類來對實體進行操作了:

Main.java

package toone.com.cn;
import java.util.Date;


import toone.com.cn.bo.User;
import toone.com.cn.util.HibernateUtils;


public class Main {
	public static void main(String[] args){
		User user = new User();
		user.setName("Kobi");
		user.setBirthday(new Date());
		HibernateUtils.add(user);//新增
		user.setName("Jams");
		HibernateUtils.update(user);//修改
		HibernateUtils.delete(user);//刪除
		User user1 = (User) HibernateUtils.findById(User.class, user.getId());//查詢
		System.out.println(user1.getName());
		
	}
}

總結:瞭解了Hibernate的基本作用,學會了使用其來進行增刪改查操作,算是工作之餘的一點收穫吧,以後還得繼續堅持發帖,不斷學習!


相關推薦

Hibernate入門學習

都說年底了,大夥應該都在衝回款,忙的不可開交啊啥的。唯獨我這個剛轉正三個月的閒來無事,只得在上班時間來給自己充充電,也不好玩別的,畢竟剛來公司不久,沒有那些老鳥膽子大,凡事低調點,就開始看起了視訊。下面簡單記錄下自己學習到的東西,今天一天看了Hibernate的學習視訊,自

VueJS入門學習

try pre 發的 沒有 cnpm lan light install 上一個   剛剛接觸VueJs的時候,還不懂NodeJs是什麽,單頁面應用是什麽?隨著慢慢的深入慢慢的理解了這些東西。簡單介紹一些VueJs,一個頁面一個Vue實例,包含了頁面中控件所需要的方法,事件

NS3入門學習之指令碼執行例項

 ns3中使用的編譯系統是waf,所有的c++工程都需要經過waf編譯後執行,除錯時也需要waf的。 在3.1.3中還是使用C++寫指令碼,在/ns-3.1.3/examples/tutorial/的second.cc指令碼中可以看出來,在3.2.6以上版本中已經增加了python

OpenCV入門學習

OpenCV入門學習(2) IplImage* img = cvLoadImage(argv[1]); 上面的函式程式碼聲明瞭一個IPLImage* 影象指標,然後根據影象名稱的字串argv[1],將影象載入到記憶體中。 影象結構體IplImage IplImage

Java NIO入門學習

本文為NIO入門學習的第一篇,將會介紹NIO中幾個重要的概念。 I/O即輸入輸出,指的是計算機和外界的介面,或者是單個程式同計算機其他部分的介面。 在Java1.4之前的I/O系統中,提供的都是面向流的I/O系統,系統每次處理一個位元組,輸入流(input stream)生

Python入門學習,安裝Eclipse開發環境

  近日,山東省在其最新出版的小學資訊科技六年級教材中,加入了Python的內容。      簡單來說,Python是一種廣泛使用的高階程式語言,屬於通用型程式語言,由荷蘭人Guido van Rossum創造。它的第一版釋出於1991年。由於可擴充套件性,

Mybatis框架入門學習

什麼是MyBatis?        MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java

Linux執行緒入門學習-認識執行緒

1. 執行緒的概念 執行緒,又稱輕量級程序,是程序中執行運算的最小單位,是程序中的一個實體,是被系統獨立排程和分派的基本單位,主要有以下特點: 1)執行緒自己不擁有系統資源,只擁有一點在執行中必不可少的資源; 2)與同屬一個程序的其它執行緒共享程序所擁有的全

安卓入門學習使用者介面設計

第三章 使用者介面設計 寫在前面: 有人問為什麼網路上那麼多教程,直接學習就好了,為啥還要浪費時間跟精力自己重新寫一系統的帖子? 寫部落格不是一種情懷,而是對自己所學所用知識的總結。寫文章是一種態度,是對自己已知能力的輸出的考核。 最重要一點,人生在世,總要留

Linux程序入門學習-認識程序

1.程序的概念 一個可執行的程式檔案(ELF格式)被載入到記憶體當中,然後讓CPU逐條執行其程式碼,根據程式碼作出相應的動作,這樣一個動態程序就產生了。因此,程序是一個動態變化的過程。 下面用一張圖來表示一個程式從編寫到最終執行的過程: 一段固化在磁碟

OpenCV入門學習影象放縮【簡單的按比例放縮,無技術含量】

其中,filename 是待載入影象的名稱,包括影象的副檔名;iscolor是一個輔助引數項,可選正數、零和負數三種值,正數表示作為三通道(CV_LOAD_IMAGE_COLOR)影象載入,零(CV_LOAD_IMAGE_GRAYSCALE)表示該影象作為單通道影象,負數(CV_LOAD_IMAGE_UNCH

salesforce 零基礎開發入門學習Salesforce功能介紹,IDE配置以及資源下載

目前國內已經有很多公司做salesforce,但是國內相關的資料確是少之又少。上個月末跳槽去了新公司,主要做的就是salesforce,不過當時想要看一些相關資料確實比較難。為了避免想要零基礎學習的人少走一點彎路,所以整理一下這幾天學到的簡單的東西,包括登入salesforce後如何操作,如何下載配置IDE

testNG入門學習

這裡有兩種方法,因為我的機器上線上安裝失敗,所以又增加了第二種方法。 方法一、線上安裝: 開啟Eclipse   Help ->Install New Software ,   然後Add   "http://beust.com/eclipse" 方法二、 1.下載附件,並解壓。百度網盤:http:

Hibernate入門學習1----認識ORM及Hibernate

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

Solr入門學習—— Solr 的安裝、啟動與關閉

Server : Ubuntu 16.04 Java Version : 1.8 Solr Version : 7.4.0 Solr 下載與安裝 首先,到 http://lucene.apache.org/solr/downloads.html 獲取 Sol

Mybatis入門學習

Mybatis是一款優秀的開源持久層框架。 入門demo 解壓,把mybatis-3.3.0.jar,以及lib下的所有jar,額外引入mysql的驅動包到Eclipse的lib目錄,並加入到classpath中。 第二步:新建資料庫表,建立myb

mybatis學習----入門

配置 ati 開源 bold 文件中 手動 arch mage git 一.Mybatis介紹 MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為

MyBatis學習簡介及入門案例

結果集 提交 ace 支持 nag 實例 exce 空間 cti 1.什麽是MyBatis?   MyBatis是一個支持普通SQL查詢,存儲過程,和高級映射的優秀持久層框架。MyBatis去掉了幾乎所有的JDBC代碼和參數的手工設置以及對結果集的檢索封裝。MyBatis可

機器學習入門點滴待補充完整

arr intro 統計 int ica nts 機器學習算法 .com 場景 Step1-知識準備: 1. 數學:線性代數,概率論和統計,高數 2. 程序語言:Matlab R 或 Python(只用於學習入門,不是實現的最佳語言) 3. 推薦書籍:選擇一到兩本公式較少、

Hibernate 學習

column str 數據庫服務器 app this select log new where 一、Hibernate 簡介 1、Hibernate 簡介   Hibernate是一個開放源代碼的對象關系映射(ORM)框架,它對JDBC進行了非常輕量級的對象封裝,它將POJ