Hibernate的環境搭建、API、CRUD學習筆記
什么是hibernate?
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關系,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。
什么是ORM?
Object Relational Mapping,對象關系映射,為了解決傳統jdbc中對object的參數改變而引起的一系列修改的辦法。強調將java對象和關系型數據庫(如:MySQL) 建立一種關系,直接操作java對象就相當于操作表。
映射關系通過配置(XML)實現。
Hibernate環境搭建
版本:Hibernate3.x Hibernate4.x(過渡版) Hibernate5.x(最新版) 。
本學習筆記使用的是 hibernate-release-5.0.7.Final版本。
下載Hibernate的壓縮包
去官網~ 下載完成后解壓 里面有一個required文件夾,這個文件夾里面的jar包是使用hibernate必須的jar包
創建一個項目,引入jar包
引入jar包清單:
數據庫驅動包
Hibernate開發必備的jar包
日志記錄包
完整清單如下:
創建表和實體類
CREATE DATABASE hibernate_day01;
SELECT Hibernate_day01;
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
`cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客戶信息來源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移動電話',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
package com.aloha.hibernate.demo1;
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public String getCust_source() {
return cust_source;
}
public void setCust_source(String cust_source) {
this.cust_source = cust_source;
}
public String getCust_industry() {
return cust_industry;
}
public void setCust_industry(String cust_industry) {
this.cust_industry = cust_industry;
}
public String getCust_level() {
return cust_level;
}
public void setCust_level(String cust_level) {
this.cust_level = cust_level;
}
public String getCust_phone() {
return cust_phone;
}
public void setCust_phone(String cust_phone) {
this.cust_phone = cust_phone;
}
public String getCust_mobile() {
return cust_mobile;
}
public void setCust_mobile(String cust_mobile) {
this.cust_mobile = cust_mobile;
}
}
表中的列名最好和實體類的成員變量名稱一致。
創建映射關系
映射關系通過配置文件xml來配置,這樣可以有利于我們后期對表結構修改的時候盡量少的動java代碼。
配置文件放在對應包目錄下,可以隨意命名,但是最好還是統一命名規范為: 類名.hbm.xml 。 下面是我寫的Customer.hbm.xml用來建立java類和表的關系,表主鍵與java類中對應成員變量的關系以及表中列與java類的對應成員變量的關系。
<?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>
<class name="com.aloha.hibernate.demo1.Customer" table="cst_customer">
<id name="cust_id" column="cust_id" >
<generator class="native" />
</id>
<property name="cust_name" column="cust_name" />
<property name="cust_source" column="cust_source" />
<property name="cust_industry" column="cust_industry" />
<property name="cust_level" column="cust_level" />
<property name="cust_phone" column="cust_phone" />
<property name="cust_mobile" column="cust_mobile" />
</class>
</hibernate-mapping>
dtd約束怎么引入:hibernate-core-5.0.7.Final.jar/org.hibernate/hibernate-mapping-3.0.dtd
在這個文件里包含了引入映射dtd約束的語句,語句在上例中寫出了。這時就可以些hibernate-mapping的標簽了。
類表映射 中:主鍵映射、成員映射。
創建一個hibernate核心配置文件
核心配置文件位置是在src文件下,名稱固定為:hibernate.cfg.xml。主要配置jdbc,內容如下:
<?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>
<!-- 連接數據庫的基本參數 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置hibernate的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可選配置:打印sql語句到控制臺上,格式化sql語句 -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<mapping resource="com/aloha/hibernate/demo1/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
dtd約束怎么引入:hibernate-core-5.0.7.Final.jar/org.hibernate/hibernate-configuration-3.0.dtd
在這個文件里包含了引入核心配置dtd約束的語句,語句在上例中寫出了。這時就可以寫hibernate-configuration的標簽了。
Hibernate入門
搭建完成Hibernate環境,寫好配置文件后,我們就可以開始寫執行的java文件的,一個原生的寫入案例:
@Test
public void test1(){
//1.加載核心配置文件
Configuration configuration = new Configuration().configure();
//2.創建SessionFactory對象:類似JDBC連接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
//3.通過SessionFactory獲取Session對象:類似Connection
Session session = sessionFactory.openSession();
//4.手動開啟事務:hibernate5以后以可不用了,但是為了兼容性,還是寫著把
Transaction transaction = session.beginTransaction();
//5.編寫代碼
Customer customer = new Customer();
customer.setCust_name("aloha");
session.save(customer);
//6.事務提交
transaction.commit();
//7.資源釋放
session.close();
}
我們往數據庫中插入了一條cust_name為aloha的記錄,結果如下:
hibernate配置
-
-
- Hibernate的映射的配置
- 映射的配置
- Hibernate的映射的配置
-
- 【class標簽的配置】
- 標簽用來建立類與表的映射關系
- 屬性:
- name :類的全路徑
- table :表名(類名與表名一致,table可以省略)
- catalog :數據庫名
- 【id標簽的配置】
- 標簽用來建立類中的屬性與表中的主鍵的對應關系
- 屬性:
- name :類中的屬性名
- column :表中的字段名(類中的屬性名和表中的字段名如果一致,column可以省略)
- length :長度
- type :類型
- 【property標簽的配置】
- 標簽用來建立類中的普通屬性與表的字段的對應關系
- 屬性:
- name :類中的屬性名
- column :表中的字段名
- length :長度
- type :類型
- not-null :設置非空
- unique :設置唯一
-
-
- Hibernate的核心的配置
- Hibernate的核心配置方式(了解)
- Hibernate的核心的配置
-
- 一種方式:屬性文件的方式
- hibernate.properties
- hibernate.connection.driver_class=com.mysql.jdbc.Driver
- …
- hibernate.show_sql=true
- 屬性文件的方式不能引入映射文件(手動編寫代碼加載映射文件)
- hibernate.properties
- 二種方式:XML文件的方式
- hibernate.cfg.xml
-
- 核心的配置
-
- hibernate.cfg.xml
- 必須的配置
- 連接數據庫的基本的參數
- 驅動類
- url路徑
- 用戶名
- 密碼
- 方言
- 連接數據庫的基本的參數
- 可選的配置
- 顯示SQL :hibernate.show_sql
- 格式化SQL :hibernate.format_sql
- 自動建表 :hibernate.hbm2ddl.auto
- none :不使用hibernate的自動建表
- create :如果數據庫中已經有表,刪除原有表,重新創建,如果沒有表,新建表。(測試)
- create-drop :如果數據庫中已經有表,刪除原有表,執行操作,刪除這個表。如果沒有表,新建一個,使用完了刪除該表。(測試)
- update :如果數據庫中有表,使用原有表,如果沒有表,創建新表(更新表結構)
- validate :如果沒有表,不會創建表。只會使用數據庫中原有的表。(校驗映射和表結構)。
- 映射文件的引入
- 引入映射文件的位置
核心配置
1.
- 必須的配置
- 連接數據庫的基本的參數
- 驅動類
- url路徑
- 用戶名
- 密碼
- 方言
- 連接數據庫的基本的參數
- 可選的配置
- 顯示SQL :hibernate.show_sql
- 格式化SQL :hibernate.format_sql
- 自動建表 :hibernate.hbm2ddl.auto
- none :不使用hibernate的自動建表
- create :如果數據庫中已經有表,刪除原有表,重新創建,如果沒有表,新建表。(測試)
- create-drop :如果數據庫中已經有表,刪除原有表,執行操作,刪除這個表。如果沒有表,新建一個,使用完了刪除該表。(測試)
- update :如果數據庫中有表,使用原有表,如果沒有表,創建新表(更新表結構)
- validate :如果沒有表,不會創建表。只會使用數據庫中原有的表。(校驗映射和表結構)。
- 映射文件的引入
- 引入映射文件的位置
Hibernate核心API
Configuration:Hibernate的配置對象
這個類的作用是對Hibernate 進行配置,以及對它進行啟動。在Hibernate的啟動過程中,Configuration類的實例首先定位映射文檔的位置,讀取這些配置,然后創建一個SessionFactory對象。雖然Configuration類在整個Hibernate項目中只扮演著一個很小的角色,但它是啟動Hibernate時所遇到的第一個對象。
作用:
加載核心配置文件
hibernate.properties
Configuration cfg = new Configuration();
hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
手動加載映射:
configuration.addResource("映射文件路徑");
SessionFactory: Session工廠
SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,并負責創建Session對象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級的,因為一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以為每個數據庫指定一個SessionFactory。
內部維護了Hibernate的連接池和Hibernate的二級緩存。(企業里二級緩存用的時redis)。是線程安全的對象。
需要引入C3P0連接池時,我們可以在下載hibernate的hibernate-release-5.0.7.Final\lib\optional\c3p0路徑中的3個jar包導入項目中,將C3P0的配置代碼寫入hibernate.cfg.xml中:
<!-- 配置C3P0連接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在連接池中可用的數據庫連接的最少數目 -->
<property name="c3p0.min_size">5</property>
<!--在連接池中所有數據庫連接的最大數目 -->
<property name="c3p0.max_size">20</property>
<!--設定數據庫連接的過期時間,以秒為單位,
如果連接池中的某個數據庫連接處于空閑狀態的時間超過了timeout時間,就會從連接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒檢查所有連接池中的空閑連接 以秒為單位-->
<property name="c3p0.idle_test_period">3000</property>
這是一個重量級的對象,為了防止重復創建浪費資源,我們創建一個工具類:
package com.aloha.hibernate.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* hibernate的工具類
* @author malaganguo
*
*/
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static{
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
/**
* 獲取session對象
* @return 返回session對象
*/
public static Session openSession(){
return sf.openSession();//這個openSession()方法來自SessionFactory
}
}
Session:連接對象
類似Connection對象,Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session對象是非線程安全的。同時,Hibernate的session不同于JSP應用中的HttpSession。這里當使用session這個術語時,其實指的是Hibernate中的session,而以后會將HttpSession對象稱為用戶session。
Hibernate中的Session是Hibernate與數據庫鏈接的對象。是線程不安全的。是與數據庫交互的橋梁。
Session 中的API
保存方法: Serializable save(Object obj) ;
查詢方法:(hibernate版本大于3.x才有的泛型) T find(Class c, Serializable id); T load(Class c, Serializable id);
查詢方法演示以及find,load方法的區別:
/**
* 查詢客戶
*/
@Test
public void test2(){
Session session =HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//get方法查詢
Customer customer = session.get(Customer.class, 1l);
System.out.println(customer);
//load方法查詢
Customer customer1 = session.load(Customer.class, 1l);
System.out.println(customer1);
/**
* 兩種查詢方式的打印語句與查詢結果完全相同,區別是?
* get方法采用立即加載,執行到這行代碼時就會馬上進行查詢
* 查詢返回的是真實對象
* 查詢一個找不到的對象的時候返回null
*
* load方法采用延遲(懶)加載,指執行到這行代碼時不會發送SQL語句,真正使用對象時才發送SQL語句,
* 因為id已知,所以用id都不會發語句,也太懶了。
* 查詢返回的是代理對象,使用的是javassist.jar包技術產生的代理
* 拋出一個ObjectNotFindException
*/
transaction.commit();
session.close();
}
修改方法:void update(Object obj);
/**
* 修改客戶
*/
@Test
public void test3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
/* //直接創建對象進行修改(不推薦,因為不修改的會被賦null)
Customer customer = new Customer();
customer.setCust_id(4l);
customer.setCust_name("王思聰");
session.update(customer);*/
//先查詢再修改(推薦,不會將沒有修改的內容賦為null)
Customer customer = session.get(Customer.class, 4l);
customer.setCust_name("王尼瑪");
session.update(customer);
transaction.commit();
session.close();
}
直接創建對象進行修改的結果:
我們現在將王思聰的來源依然改為小廣告,使用先查詢再修改的方式來看看修改的結果:
刪除方法: void delete(Object obj);
/**
* 刪除客戶
*/
@Test
public void test4(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
/*//直接創建對象刪除
Customer customer = new Customer();
customer.setCust_id(3l);
session.delete(customer);*/
//先查詢再刪除
Customer customer = session.get(Customer.class, 2l);
session.delete(customer);
transaction.commit();
session.close();
}
結果:我們刪除了兩個id為2和3的客戶名為aloha的客戶記錄
保存或更新方法: void saveOrUpdate(Object obj);
/**
* 保存或更新:不設置id——保存;設置id——更新。
*/
@Test
public void test5(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
/*customer.setCust_name("王九蛋");//保存王九蛋*/
customer.setCust_id(6l);
customer.setCust_name("伍佰");//更新id為6的的name為伍佰
session.saveOrUpdate(customer);
transaction.commit();
session.close();
}
查詢所有:
/**
* 查詢所有:使用HQL或SQL查詢
*/
@Test
public void test6(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//接收:HQL對象
//HQL:Hibernate Query Language是一種面向對象的查詢語言
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
//接收:SQL對象
SQLQuery query2 = session.createSQLQuery("select * from cst_customer");
List<Object[]> list2 = query2.list();
for (Object[] objects : list2) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
session.close();
}
HQL查詢:
SQL查詢:
Transaction:事務對象
常用的就是commit()和rollback()兩個方法。提交和回滾。在hibernate5在,如果沒有引入C3P0的話,開啟事務和提交事務是可以不寫的,因為C3P0內代碼是可以完成事務的開啟和提交的。
智能推薦
Hibernate學習筆記(二)API詳解
體系結構 Hibernate框架操作數據庫,數據庫中的表必須要有主鍵!!! PO:persistent object ,用于與數據庫交互數據。–dao層 (JavaBean + hbm ) BO:Business object 業務數據對象。–service層 VO:Value Object 值對象。–web層 開發中:直接使用JavaBean 描述三個對象。 ...
Hibernate學習之對實體類的crud操作
文章目錄 1 前期準備 1.1 環境搭建 1.2 創建工具類實現表的創建 1.3 創建測試類 2 crud操作實現 2.1添加 2.2 根據id查詢 2.3 修改 2.4 刪除 1 前期準備 1.1 環境搭建 見Hibernate入門和基本操作篇環境搭建步驟。 應有以下內容: User類中要生成相應的set、get和toString方法: 1.2 創建工具類實現表的創建 運行工具類把表生成:(注意...
struts2學習筆記 -- day03 struts2整合hibernate環境搭建
一、搭建struts2與Hibernate整合的環境 1、創建web項目,導入jar包 (1)、hibernate所需包 (2)、log4j日志包 (3)、數據庫驅動包 (4)、c3p0連接池包 (5)、struts2包 (6)、刪除重復的低版本的jar包 (7)、導入jstl包 2、編寫hibernate主配置文件 3、編寫struts2主配置文件 4、在web.xml中配置sruts2核心過濾...
Hibernate(2)_Hibernate 環境搭建
本系列博客匯總在這里:Hibernate 匯總 環境搭建 一、文件下載 二、搭建環境 1、建立一個 java 項目 2、導包 3、創建 hibernate.cfg.xml 4、創建實體類(model) 源碼工程文件為: 一、文件下載 官網下載地址 :http://hibernate.org/orm/downloads/ 本教程使用的:點擊下載,提取碼:bszm。 官方文檔:點擊下載,提取碼:qkb...
hibernate的環境搭建及使用
文章目錄 一、hibernate簡介 1.什么是hibernate 2.什么是ORM 二、環境搭建 1.工程環境 2.hibernate映射配置 3.hibernate的核心配置 三、代碼測試 1.代碼目錄結構 2.持久化類的編寫 3.hibernate映射文件的編寫 4.hibernate核心配置文件的編寫 一、hibernate簡介 1.什么是hibernate hibernate是一個開放源...
猜你喜歡
Hibernate 環境的搭建與簡單使用
Hibernate 框架(Object Relational Mapping ORM) http://sourceforge.net/projects/hibernate/files/hibernate3/ Hibernate 下載鏈接 優勢 Hibernate 對 JDBC 訪問數據庫的代碼進行了輕量級封裝,大大簡化了數據訪問層繁瑣的重復性代碼,并且減少了內存消耗,加快了運行效率。 Hibern...
Hibernate框架的學習筆記
前言 什么是Hibernate? 輕量級JavaEE應用的持久層框架,是一個完全的ORM框架。(說完這句話,肯定有很多人懵圈了,下面我來一個個解釋) 持久化:將我們想要保存的數據保存到硬盤上,也就是我們電腦的磁盤上,為什么叫持久化呢,就是數據能夠保存的很久,所以叫持久化,現在對持久化的實現過程大多通過各種關系型數據庫完成,所以我們常說的,將數據保存到數據庫中,其實是數據庫幫我們幫數據保存到硬盤...
Hibernate的學習筆記(一)
寫在前面 什么是ORM?ORM全稱是Object Relational Mapping,也叫對象關系映射,是一種持久層的技術。它解決了域模型對象和關系型數據庫不匹配的現象,通過映射從而將對象自動持久到數據庫中。目前主流的框架是Mybatis,它是一種半自動化的ORM框架,需要寫sql語句,操作性強,更為靈活。另一種在許多企業中仍然還在使用,它就是Hi...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...