hibernate是做用於傳統的mvc開發dao層的框架java
在以往的開發中咱們如何的編寫dao的代碼呢mysql
1.原始的jdbc操做,在dao中到操做Connection/Statement/ResultSetsql
2.自定義一個持久層的框架,對上述的crud進行了封裝。數據庫
3.dbutils組件,是阿帕奇提供的一個輕量級的組件api
4.Hibernate技術,是一個開放源代碼的對象關係映射框架。 【hibernate最終執行的也是jdbc代碼!】數組
在學習hibernate以前咱們必須瞭解orm概念session
O, Object 對象mvc
R, Realtion 關係 (關係型數據庫: MySQL, Oracle…) ---------->ORM, 對象關係映射!(說白了是類和表的一種對應關係,目的是將對象保存到表中)app
M,Mapping 映射框架
思考:
ORM, 解決什麼問題?
存儲: 可否把對象的數據直接保存到數據庫?
獲取: 可否直接從數據庫拿到一個對象?
想作到上面2點,必需要有映射!
即:咱們經過映射關係,將類和表相對應,對象和表中的元組(每一條記錄)相對應,類的屬性和表中的字段(列)相對應,屬性的類型和字段的類型相對應。
思考: Hibernate與ORM的關係?
Hibernate是ORM的實現!(也就是說orm是一種思想,hibernate只不過是一種實現而已,其餘的實現還有 ibatise等)
首先對於一個組件/框架的學習咱們通常經過如下幾個步驟完成。
1.引入相應的jar文件
2.配置
3.api的學習
hibernate的配置相對的比較麻煩,咱們在這裏只作簡單的介紹,詳細的配置介紹會在後邊的學習中進行詳細的介紹
搭建一個Hibernate環境,開發步驟:
1. 下載源碼
我用的版本:hibernate-distribution-3.6.0.Final (注意不一樣的版本你的的配置過程可能稍微有所不一樣,不過大同小異)
2. 引入jar文件
hibernate3.jar核心 + required 必須引入的(6個) + jpa 目錄 + 數據庫驅動包
3. 寫對象以及對象的映射
Employee.java 對象(測試對象,員工對象)
Employee.hbm.xml 對象的映射 (映射文件,注意這是命名規範咱們必須這樣寫)
4. src/hibernate.cfg.xml 主配置文件
-à 數據庫鏈接配置
-à 加載所用的映射(*.hbm.xml)
5. App.java 測試
employee.java
public class Employee { private int empId; private String empName; private Date empDate; public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public Date getEmpDate() { return empDate; } public void setEmpDate(Date empDate) { this.empDate = empDate; } @Override public String toString() { return "Employee [empId=" + empId + ", empName=" + empName + ", empDate=" + empDate + "]"; } }
映射文件 Employee.hbm.xml
這裏的package表示的是映射的實體類所在的包名(有關這裏的文件怎麼寫。後續會作詳細的講解,你們能夠參考咱們下載的src源碼中寫好的. xml文件 直接搜 *.*.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"> <hibernate-mapping package="cn.best.test"> <!-- 指明類和表的對應關係 table:表名 name:類名 --> <class table="employee" name="Employee"> <!-- 配置咱們的映射關係 --> <!-- 主鍵映射關係 --> <id name="empId" column="id"> <generator class="native" /> </id> <!-- 配置非主鍵屬性 --> <property name="empName" column="name"></property> <property name="empDate" column="date"></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的工廠 創造session,咱們與數據庫之間的會話 --> <session-factory> <!-- 首先咱們要對須要鏈接數據進行配置 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysqL:///hib_demo</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">yujiaming</property> <!-- 區別不一樣的sql語言,要告訴本數據庫的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.show_sql">true</property> <!-- 加載映射文件 --> <mapping resource="cn/hhua/test/Employee.hbm.xml" /> </session-factory> </hibernate-configuration>
接下來我麼拿來作一個測試案例:
1 @Test 2 public void test() { 3 // 建立模擬數據對象 4 Employee employee = new Employee(); 5 employee.setEmpName("faker"); 6 employee.setEmpDate(new Date()); 7 // 1.首先咱們建立加載配置文件管理對象 8 Configuration configuration = new Configuration(); 9 // 加載配置文件,默認加載src/hibernate.hbm.xml 10 configuration.configure(); 11 // 2.建立session工廠對象 12 SessionFactory buildSessionFactory = configuration.buildSessionFactory(); 13 // 建立session(表明一個回話,與數據庫鏈接的會話) 14 Session session = buildSessionFactory.openSession(); 15 // 開啓事務 16 Transaction beginTransaction = session.beginTransaction(); 17 // 執行crud 18 session.save(employee); 19 // 提交事務 20 beginTransaction.commit(); 21 // 關閉session 和工廠 22 session.close(); 23 buildSessionFactory.close(); 24 25 }
注意 主鍵必定是非空惟一且遞增。
|-- Configuration 配置管理類對象
1. config.configure(); 加載主配置文件的方法(hibernate.cfg.xml)
默認加載src/hibernate.cfg.xml
public Configuration configure() throws HibernateException { configure( "/hibernate.cfg.xml" ); return this; }
2.config.configure(「cn/config/hibernate.cfg.xml」); 加載指定路徑下指定名稱的主配置文件
3.config.buildSessionFactory(); 建立session的工廠對象
|-- SessionFactory session的工廠(或者說表明了這個hibernate.cfg.xml配置文件)
1. sf.openSession(); 建立一個sesison對象
2.sf.getCurrentSession(); 建立session或取出session對象(這個相對上邊功能更強大)
3.sf.close();關閉工廠方法
|--Session session對象維護了一個鏈接(Connection), 表明了與數據庫鏈接的會話。
是 Hibernate最重要的對象: 只要使用hibernate與數據庫操做,都用到這個對象
1. session.beginTransaction(); 開啓一個事務; hibernate要求全部的與數據庫的操做必須有事務的環境,不然報錯!
2.更新操做:
session.save(Object obj); 保存一個對象
session.update(Object obj); 更新一個對象、注意必須是有主鍵的對象。
session.delete(Object obj); 刪除一個對象
session.saveOrUpdate(emp); 保存或者更新的方法:
à沒有設置主鍵,執行保存;
à有設置主鍵,執行更新操做;
à若是設置主鍵不存在報錯!
舉例:
//模擬天更新操做
Employee employee = new Employee(); employee.setEmpId(1); employee.setEmpName("bang"); employee.setEmpDate(new Date()); openSession.update(employee); beginTransaction.commit()
3.查詢操做
主鍵查詢:
session.get(Employee.class, 1); 主鍵查詢,返回的是一個具體的對象。
session.load(Employee.class, 1); 主鍵查詢 (支持懶加載)。
//模擬主鍵查詢操做 Object object = openSession.get(Employee.class, 1); System.out.println(object);
HQL查詢(經常使用):
HQL查詢與SQL查詢區別:
SQL: (結構化查詢語句)查詢的是表以及字段; 不區分大小寫。
HQL: hibernate query language 即hibernate提供的面向對象的查詢語言,查詢的是對象以及對象的屬性, 區分大小寫。
方法:Query createQuery(); .穿件hql查詢語句
query.list(); 返回查詢到的集合
query.setParameter(int index, Obejct obj); 設置查詢預處理的參數,若是知道具體的參數類型也能夠用setString() .等
注意:這裏的index是從0開始的和咱們的sql中的不一樣
//模擬hql查詢 Query createQuery = openSession.createQuery("from Employee where empId =?"); createQuery.setParameter(0, 1); List list = createQuery.list(); System.out.println(list); //結果爲[Employee [empId=1, empName=bang, empDate=2017-12-17 00:00:00.0]]
sql查詢:
hibernate也爲咱們提供的sql查詢,複雜的查詢,就要使用原生態的sql查詢,也能夠,就是本地sql查詢的支持! (缺點: 不能跨數據庫平臺!)
方法: createSQLQuery(sql語句); 構建sql語句
setParameter(int index,Object object); 設置參數 注意這裏的index是從1開始的
//sql語句查詢 SQLQuery createSQLQuery = openSession.createSQLQuery("select * from employee where id = ?"); createSQLQuery.setParameter(0, 1); List list = createSQLQuery.list(); System.out.println(list); //結果爲[[Ljava.lang.Object;@217ed35e]
查詢結果並沒範返回的也是一個list,可是list中並無封裝一個對象,而是將對象的屬性封裝在一個數組中,將數組存到了list集合中
SQLQuery createSQLQuery = openSession.createSQLQuery("select * from employee where id = ?"); createSQLQuery.setParameter(0, 1); List list = createSQLQuery.list(); Object[] arr = (Object[]) list.get(0); for (Object o : arr) { System.out.println(o); } //查詢結果爲:1 bang 2017-12-17
Criteria查詢:
徹底面向對象的查詢。也稱爲QBC查詢 。
//指定查詢的結果集的對象,其實也是在經過映射指明表 Criteria criteria = session.createCriteria(Employee.class); // 指明條件,注意是對象的屬性,映射表的字段 criteria.add(Restrictions.eq("empId", 1)); // 查詢所有 List<Employee> list = criteria.list(); System.out.println(list); //查詢結果爲:[Employee [empId=1, empName=bang, empDate=2017-12-17 00:00:00.0]]
|-- Transaction hibernate事務對象。
transaction.commit(); 表示事務的提交。
對於hibernate的初識,咱們就講到這裏。這是個人第一篇博客,很高興您能看完,若是其中的點滴語句能給你幾分幫助,這再好不過,也是給我最大的鼓勵--謝謝。