1、什麼是ORM?html
ORM,即Object Relational Mapping。咱們知道,利用面向對象的思想編寫的數據庫應用程序最終都是把對象信息保存在關係型數據庫中,因而須要編寫與底層數據庫相關的SQL語句,顯然這與面向對象的思想格格不入。java
編寫大量底層SQL語句很差之處:mysql
1.不一樣數據庫使用的SQL語法略有不一樣。好比:PL/SQL與T-SQL。sql
2.程序過度依賴SQL對程序的移植與擴展,維護等帶來很大的麻煩。數據庫
使用ORM框架技術就能夠完全拋棄SQL語句,使咱們徹底使用面向對象的思想開發軟件。session
2、Hibernate簡介app
Hibernate是Java領域一款開源的ORM框架。它對JDBC進行了很是輕量級的對象封裝,也就說Hibernate最終仍是經過JDBC進行數據庫的操做。Hibernate在項目中扮演持久化層的角色,將業務邏輯層中的對象數據保存到數據庫表中。框架
3、第一個Hibernate例子測試
使用Hibernate以前要準備好Hibernate相關jar包。Hibernate jar包ui
建立Hibernate項目主要步驟:
1.建立Hibernate配置文件
2.建立持久化類
3.建立對象-關係映射文件
4.經過Hibernate API編寫訪問數據庫的代碼
--------------------------------------------------------------------------------------------------------------------------------------------
下面開始編寫第一個Hibernate例子。
① 建立項目HibernateDemo,並導入Hibernate相關jar包,mysql驅動jar包,Junit jar包。
② 在src下建立Hibernate配置文件hibernate.cfg.xml
<?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="hibernate.connection.username">root</property> <!-- 數據庫密碼 --> <property name="hibernate.connection.password">botao521</property> <!-- 數據庫連接 --> <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_demo?user=root&password=botao521&unicode=true&characterEncodeing=utf-8</property> <!-- 數據庫驅動 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 數據庫方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 在控制檯中輸出sql --> <property name="show_sql">true</property> <!-- 格式化控制檯中的sql --> <property name="format_sql">true</property> <!-- hbm2ddl.auto的做用爲:自動建立/更新/驗證數據庫表結構 有如下值: create: 表示啓動的時候先drop,再create create-drop: 也表示建立,只不過再系統關閉前執行一下drop update: 這個操做啓動的時候會去檢查schema是否一致,若是不一致會作scheme更新 validate: 啓動時驗證現有schema與你配置的hibernate是否一致,若是不一致就拋出異常,並不作更新 --> <property name="hbm2ddl.auto">create</property> <!-- 引入對象-關係映射文件 --> <mapping resource="com/cbt/bean/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
③ 建立持久化類Student.java
package com.cbt.bean;
import java.util.Date;
/**
* 學生類
* @author caobotao
*/
public class Student {
private int sid; //學號
private String sname; //姓名
private String gender; //性別
private Date birthday; //出生日期
private String address;//地址
public Student(){}
public Student(int sid, String sname, String gender, Date birthday,
String address) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.address = address;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
④ 建立對象-關係映射文件Student.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- JavaBean與對應的表名 --> <class name="com.cbt.bean.Student" table="STUDENT"> <!-- 主鍵 --> <id name="sid" type="int"> <column name="SID" /> <generator class="assigned" /> </id> <!-- 字段 --> <property name="sname" type="java.lang.String"> <column name="SNAME" /> </property> <!-- 字段 --> <property name="gender" type="java.lang.String"> <column name="GENDER" /> </property> <!-- 字段 --> <property name="birthday" type="java.util.Date"> <column name="BIRTHDAY" /> </property> <!-- 字段 --> <property name="address" type="java.lang.String"> <column name="ADDRESS" /> </property> </class> </hibernate-mapping>
⑤ 在hibernate.cfg.xml中引入Student.hbm.xml
<?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> ...... <!-- 引入對象-關係映射文件 --> <mapping resource="com/cbt/bean/Student.hbm.xml" /> </session-factory> </hibernate-configuration>
⑥ 在mysql中建立數據庫 hibernate_demo
create database hibernate_demo;
⑦ 經過Hibernate API訪問操做數據庫
1> 建立配置對象
Configuration config = new Configuration().configure();
2> 建立服務註冊對象
ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
3> 建立會話工廠對象
sessionFactory = config.buildSessionFactory(service);
4> 打開會話
session = sessionFactory.openSession();
5> 開啓事務
transaction = session.beginTransaction();
使用Junit編寫測試類StudentTest.java
import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.cbt.bean.Student; @SuppressWarnings("deprecation") public class StudentTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void before(){ //建立配置對象 Configuration config = new Configuration().configure(); //建立服務註冊對象 ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); //建立會話工廠對象 sessionFactory = config.buildSessionFactory(service); //建立會話對象 session = sessionFactory.openSession(); //開啓事務 transaction = session.beginTransaction(); } @After public void after(){ transaction.commit(); //提交事務 session.close(); //關閉會話 sessionFactory.close(); //關閉會話工廠 } @Test public void testSaveStudent() { //建立學生對象 Student s = new Student(1,"張三","男",new Date(),"武當山"); /* * 因爲hibernate.cfg.xml中配置的hbm2ddl.auto值爲'Create',因此執行save * 方法會檢查數據庫中是否有student表,沒有的話會建立此表,並將s對象保存進去 */ session.save(s); } }
運行測試用例,會發現控制檯打印出下列SQL語句,在數據庫中有一個STUDENT表被建立,以及對應的一條學生記錄被插入。
Hibernate:
drop table if exists STUDENT
Hibernate:
create table STUDENT (
SID integer not null,
SNAME varchar(255),
GENDER varchar(255),
BIRTHDAY datetime,
ADDRESS varchar(255),
primary key (SID)
)
Hibernate:
insert
into
STUDENT
(SNAME, GENDER, BIRTHDAY, ADDRESS, SID)
values
(?, ?, ?, ?, ?)
至此第一個Hibernate例子結束。
源碼下載:HibernateDemo.zip
4、Hibernate執行流程
1> 獲取Configuration對象,目的是讀取hibernate.cfg.xml配置文件
2> 獲取SessionFactory對象,目的是讀取hibernate.cfg.xml中配置的對象-關係配置文件
3> 獲取Session對象,至關於獲取一個Connection對象,能夠持久化操做,須要先開啓事務
4> 提交事務,完成持久化操做,而後關閉session
5、Session簡介
Hibernate是對JDBC進行了封裝,它不建議使用JDBC的Connection操做數據庫,而是經過Session操做數據庫。Session能夠簡單的理解爲操做數據庫的對象。Session與Connection是多對一的關係,一個Connection不一樣時刻能夠供多個Session 使用。
使用Session進行持久化操做須要調用Session的各類方法,如:save(),update(),delete(),createQuery()等。
獲取Session的方式:
① 使用SessionFactory的openSession()方法
② 使用SessionFactory的getCurrentSession()方法
使用getCurrentSession須要在hibernate.cfg.xml文件中進行配置:
若是是本地事務(JDBC事務):
<property name="hibernate.current_session_context_class">thread</property>
若是是全局事務(jta事務):
<property name="hibernate.current_session_context_class">jta</property>
openSession()與getCurrentSession()的區別:
① getCurrentSession()在事務提交或回滾後會自動關閉,而openSession()須要手動關閉,不然屢次以後會形成鏈接池溢出。
② openSession()每次建立新的session對象,getCurrentSession()返回同一個session對象。