首先介紹一下javaEE開發的三層架構java
Web層 也被稱爲表現層 它是表現層的一個設計模型:也就是你們經常使用的MVC開發模式mysql
Service層 它是和需求相關的web
DAO層 它只和數據庫打交道,對數據庫進行增刪改查(CURD)、sql
Hibernate是持久層的框架 只能對數據庫進行增刪改查數據庫
框架的底層其實就是webapi
框架其實就是一個骨架,準備了大量代碼:框架的目的就是抽取一些重複性結構的代碼,減小程序的開發量 session
而hibernate主要就是替換DAO層的框架,hibernate操做簡單,經過保存一個實體對象,自動將數據保存到數據庫,形 兩個步驟:描述一個實體對象,對應數據庫的表架構
描述實體的屬性,對應數據庫表中的字段oracle
Hibernate的環境搭建app
一、 建立一個項目,導入相關jar包,hibernate的必須包 mysql的jar包 日誌包(非必須的包,日誌包就是在控制檯上打印執行的sql語句)
二、建立實體類和對應的數據庫
三、建立一個映射文件 名稱爲(實體類.hbm.xml)
描述實體類和數據庫的關係
描述實體類中字段和數據庫表中字段的關係
配置核心文件 文件須要在src下建立hibernate.cfg.xml
配置文件中 基本配置
基本四項(數據庫驅動 鏈接串 用戶名 和密碼)、
· 其餘配置
加載映射文件
下面是一個示例配置
<?xml version="1.0" encoding="UTF-8"?> <!-- 約束 :規定xml的寫法--> <!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.itheima.domain" > <!-- 記憶性知識 1.配置 實體和數據庫表的關係 <class> 描述實體和數據庫表的關係 name="" 實體的全限定類名 由於用到反射 table="" 對應的數據表名稱 lazy 最後一節課 非記憶性知識: catalog="" 數據庫名稱 package="" 包的名稱 若是有了此配置 之後在該包下的全部類 不須要寫全限定類名 只須要類的名稱 可是若是不是該包下的內容 須要配置全限定名 length="" 表示字段的長度 type="" 表示字段的類型 1.hibernate的類型 string 2.java的類型 java.lang.String 3.數據庫類型 varchar() <column name="cust_name" sql-type="數據庫類型"></column> 但若是沒寫 默認使用實體類類的類型 --> <class name="Customer" table="cst_customer" > <!-- 2.配置 實體字段和數據庫表字段的關係 2.1 特殊字段 id <id></id> name="" 實體的屬性名稱 get/set方法 去掉get首字母小寫 column="" 數據庫表字段的名稱 column="" 配置能夠省略 前提是實體的字段名稱 和數據庫的字段名稱必須保持一致 但開發中 實體字段使用駝峯式命名規則 cust_name ==>> custName 今天省略 <generator class="native"></generator> 主鍵生成策略 class="native" 策略名稱 native 表示使用數據庫默認的本地策略 oracle和mysql的主鍵生成策略不同 mysql auto_increament 自動增加 oralce sequence 序列 native 自動根據數據庫 自動匹配 2.2 普通字段 --> <id name="cust_id" column="cust_id"> <generator class="native"></generator> </id> <!-- 普通字段 --> <property name="cust_name" > <!-- <column name="cust_name" sql-type="數據庫類型"></column> --> </property> <property name="cust_source" column="cust_source"></property> <property name="cust_industry" column="cust_industry"></property> <property name="cust_level" ></property> <property name="cust_phone" ></property> <property name="cust_mobile" ></property> </class> </hibernate-mapping>
核心配置文件中的其餘配置
<?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 session的工廠 建立session對象
此處的session 指的是java和 數據庫的會話
session做用 : session內部封裝了操做數據的api 等效之前的connction
-->
<session-factory>
<!-- 1.基本四項 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///ee291_hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 2.其餘配置 從配置文件中找 都是優化內容-->
<!-- 配置方言
不一樣數據庫的基本語法一致 但不一樣的數據庫有本身的特點
爲了方便hibernate生成不一樣sql使用
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 在控制檯上是否打印sql -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- ddl : 數據庫定義語言 怎麼建立表 怎麼刪除表 怎麼給表加字段
沒用(測試使用 測試表結構)
create-drop :
先判斷數據庫存不存在表 若是存在刪除 建立新表(根據xml來) 操做數據 操做完之後刪除表
數據庫沒有表 建立表的時候 xml沒有指定長度 默認採用該字段的最大長度
create
先判斷數據庫存不存在表 若是存在刪除 建立新表(根據xml來) 操做數據
數據庫有表且只有一條記錄
重要(上線使用)
update : 以xml爲主 修改數據庫(仍是以數據庫爲主 先建立數據庫 再寫實體類)
validate : 以數據庫爲主 若是不一致的狀況數據庫報錯
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- c3p0鏈接池
配置後報錯
org.hibernate.service.spi.ServiceException: Unable to create requested service
[org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]
緣由是 沒有導入c3p0的鏈接池包
org.hibernate.connection.C3P0ConnectionProvider 不是一個類 而是一個字符串
org.hibernate.c3p0.internal.C3P0ConnectionProvider 這是一個類
爲何倆個均可以? 字符串是之前hibernate的早期版本 處理版本兼容問題
-->
<!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- 3.加載映射 -->
<mapping resource="com/itheima/domain/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
一個簡單的demo
public void demo2(){
詳解:
Configuration 加載配置文件
* new Configuration() 表示加載hibernate.properties文件
* .configure() 加載hibernate.cfg.xml
* .configure(路徑) 加載hibernate.cfg.xml
* buildSessionFactory() 構建session工廠
* configuration.addResource(resourceName) 加載映射文件 在覈心配置文件中加載過了
* configuration.addClass(Class) 加載實體類.class 要求 映射文件的名稱必須是 實體類名.hbm.xml
*SessionFactory 由Configuration加載核心配置文件建立(基本四項)
* SessionFactory 做用 建立session對象
* SessionFactory 加載須要浪費大量資源 工廠通常不關閉
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Transaction transaction = session.beginTransaction();//開啓事務
Customer customer = new Customer();
customer.setCust_name("門三三石22");
session.save(customer);
transaction.commit(); //事務提交
session.close();
sessionFactory.close();
session對象內部封裝了一套對數據庫的增刪改查的方法
1.查詢 get(Object)
* 2.增長 save(Object)
* 3.修改 update(Object)
* 4.刪除 delete(Object)
只須要將須要操做的對象傳入便可
詳細的操做能夠在hibernate的doc文件中查找其具體操做方法
}