hibernate學習筆記(一)
Hibernate
1.hibnate是什麼
1.Hibernate是一個開發原始碼的物件關係對映框架(ORM);
2.對JDBC進行了輕量級的封裝,可以將實體類和資料庫中的表產生對映關係;
3.是一個全自動的ORM框架;hibernate能自動生成sql語句;
2.hibnate的概念
hibernate簡要結構圖,中間的hibernate.properties,可以讓資料持久化,這裡面我們換成***.cfg.xml,表與屬性名對應
全面解決”的體系結構方案
3.Hibernate提供了5種檢索物件的方式
1.導航物件圖檢索方式:根據已經載入的物件導航到其他物件 from Emp e group by e.dept.deptName 2.OID檢索方式:按照物件的OID來檢索物件 get/load 3.HQL檢索方式:使用面向物件的HQL查詢語言 from Student 4.QBC檢索方式:使用QBC(Query By Criteria)API來檢索物件,這種API封裝了基於字串形式的查詢語句,\ 提供了更加面向物件的查詢介面 5.本地SQL檢索方式:使用本地資料庫的SQL查詢語句 createSqlQuery();
1.2核心配置檔案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">
標頭檔案
配置檔案中的需要我們配置的重要內容:
01.連線資料庫的四要素
02.管理各種hbm.xml對映檔案
03.快取的設定
04.是否顯示sql語句
05.是否格式化sql語句
06.hbm2ddl的配置
3.1.關於核心API
1. Configuration 類
載入hibernate的核心配置檔案,以及負責啟動hibernate,建立SessionFactory物件
2. SessionFactory 介面
初始化Hibernate,是資料儲存源的代理,負責建立Session物件!
一個專案中我們使用一個SessionFactory就足夠了!
如果我們需要操作多個數據庫時,建立每個資料庫指定一個SessionFactory!
3. Session介面
負責執行持久化物件的CRUD操作!是執行緒不安全的!可以開啟事務!建立Transaction物件!
Session ===>會話session
HttpSession ===>使用者session
4. Transaction介面
針對於事務的操作!
5. Query介面
方便我們對資料庫資料的查詢,有兩種方式來實現查詢:
01.sql
02.hql
6. Criteria介面
和query介面非常相似!完全面向物件的思想去操作資料庫!
2.Hibnate入門例子
讓表中的屬性名和資料庫中的欄位名一致,
2.1.建立hibernate,hbm.xml
?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- package: 需要對映的實體類所在包 class節點 name:對應的是實體類的類名,如果沒有書寫package,則必須是完整限定類名 table:資料庫中的表名,如果表名和實體類名一致,可以省略 id節點: 表中的主鍵 generator:主鍵生成策略 ,主鍵由誰去建立?程式猿?Hibernate?資料庫 name: 必須和實體類中的屬性名一致 column : 必須和資料庫中的列名一致,如果列名和屬性名一致,可以省略 --> <hibernate-mapping package="com.xdf.bean"> <class name="Teacher" table="teacher"> <id name="id" column="tid"> <generator class="assigned"/><!--主鍵生成策略--> </id> <property name="name"/><!--資料庫中的也是name--> </class> </hibernate-mapping>
2.2.建立實體類
public class teacher(){ private Intger Id; private String name; }
2.3建立hibnate.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> <!--配置連線資料庫的四要素--> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/t17</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password"></property> <!--是否顯示底層生成的sql語句--> <property name="hibernate.show_sql">true</property> <!--是否格式化sql語句--> <property name="hibernate.format_sql">true</property> <!--hbm2ddl 就是把xx.hbm.xml檔案中的配置生成資料庫中DDL(資料定義語言) create: 每次執行都會刪除 上次生成的表,還會建立新的! update: 沒有表會自動建立,有表就增加資料! validate: 如果hbm檔案和資料庫中的欄位對應 就會新增, 否則丟擲異常! create-drop: 每次執行都會刪除 上次生成的表,前提是sessionFactory關閉 --> <property name="hbm2ddl.auto">update</property> <!--載入需要的hbm.xml對映檔案 現階段還沒有 --> <mapping resource="com/xdf/bean/Teacher.hbm.xml"/> </session-factory> </hibernate-configuration>
注意要:
***.Hbm.xml一定要被**.cfg.xml管理!
建text測試類
public class TeacherTest {
Transaction transaction=null; // 定義在這裡 是為了 後續每個方法中使用
Session session=null;
@Before
public void before(){
//01.讀取核心配置檔案 configure()底層就是載入了/hibernate.cfg.xml
Configuration configuration=new Configuration().configure();
//02.建立會話工廠 sessionFactory
SessionFactory factory= configuration.buildSessionFactory();
//03.建立會話 session
session=factory.openSession();
//04.開啟事務
transaction = session.beginTransaction();
}
@After
public void after(){
//07.提交事務
transaction.commit(); // assigned 產生sql語句
//08.關閉會話
session.close();
}
/**
* 新增教師資訊
*/
@Test
public void addTeacher(){
//05.建立新增的物件
Teacher teacher=new Teacher();
teacher.setId(1);
teacher.setName("教師1");
//06.持久化操作
System.out.println("******************************");
session.save(teacher); //identity產生sql語句
System.out.println("******************************");
// factory.close();
}
/**
* 資料庫有對應的資料產生2條sql
*
* 01.先根據物件的id 去資料庫中查詢 看有沒有資料
* 02.如果存在根據id刪除指定的資訊
* 如果不存在 只做查詢操作
*/
@Test
public void deleteTeacher(){
//建立需要刪除的物件
Teacher teacher=new Teacher();
teacher.setId(2);
System.out.println("***********************");
//刪除
session.delete(teacher);
System.out.println("***********************");
}
@Test
public void updateTeacher(){
//建立需要修改的物件
Teacher teacher=new Teacher();
teacher.setId(1);
teacher.setName("小黑111");
System.out.println("***********************");
//修改
session.update(teacher);
System.out.println("***********************");
}
還有生成策略等,