21-Java-Hibernate框架(一)

1、Hibernate瞭解java

    Hibernate框架是Java持久層的框架,是Gavin King發明的,2001年發佈的,JBoss公司的產品,2003年進入市場。mysql

    Hibernate是基於對象來操做數據庫的,但他最終仍是被轉換爲SQL去進行操做web

    Hibernate對JDBC進行封裝,簡化數據庫訪問操做,採用ORM(Object Relation Mapping,對象關係映射)技術的持久層框架,自動實現表記錄和實體對象之間的映射。sql

    Hibernate與JDBC的區別:數據庫

      Hibernate與JDBC都應用在持久層上,但Hibernate輕量級封裝JDBCapi

      Hibernate是自動的,不須要手寫SQL語句的,它自動生成SQL語句,是面向對象的;緩存

      Mybatis是半自動的;安全

      JDBC是手動的(需手寫代碼與數據庫創建鏈接,獲取對象,寫SQL語句,執行SQL語句,返回結果,關閉鏈接),是面向過程的。session

      

    Hibernate體系結構:app

      1.框架工具包和驅動包

      2.hibernate.cfg.xml

      3.主配置文件,用於定義數據庫鏈接參數

      4.實體類(以entity爲例)

      5.映射描述文件entity.hbm.xml(這一步能夠用註解代替)

      6.定義類和表對應關係,屬性和字段對應關係

      

2、Hibernate框架搭建(想要如下內容涉及的資源包的網友評論留言私聊,我百度網盤分享)

    1.加載12個Hibernate包

      dom4j-1.6.jar

      geronimo-jta_1.2_spec-1.0-alpha-1.jar

      hibernate-commons-annotations-4.0.5.Final.jar

      hibernate-core-5.0.11.specid.jar

      hibernate-jpa-2.1-api-1.0.2.Final.jar

      javassist-3.18.0-ga-sources.jar

      jboss-logging-3.3.0.Final.jar

      mysql-connector-java-5.1.46.jar

      slf4j-api-2.0.0-alpha1.jar

      slf4j-jdk14-1.7.7.jar

      slf4j-log4j12-1.7.5.jar

      ant-antlr-1.6.5.jar

      將上述12個工具包放到web項目文件夾下的WebRoot/WEB-INF/lib/下

    2.Hibernate兩個配置文件(這一步也能夠本身建xml文件配置參數,由於我以前建過,因此直接導入兩個配置文件)

      (1)*.hbm.xml         映射文件    建議放在entity/包下

      (2)hibernate.cfg.xml     主配置文件   建議放在src/下

      第一步:配置hibernate.cfg.xml文件(數據庫鏈接信息,JDBC驅動,數據庫dialect方言等)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 
 6 <hibernate-configuration>
 7 
 8 <session-factory>
 9     <!--hibernate 方言 區分身份 -->
10     <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
11     <!-- 數據庫鏈接信息 -->
12     <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
13     <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernatetest</property>
14     <property name="connection.username">root</property>
15     <property name="connection.password">root</property>
16 
17     <!-- hibernate自動生成表 -->
18 
19     <!-- hibernate在控制檯顯示SQL語句 -->
20     <property name="show_sql">true</property>
21     <!-- hibernate格式化SQL,控制檯看起來更整齊 -->
22     <property name="format_sql">true</property>
23     <!-- 設置自動提交 -->
24     <property name="connection.autocommit">true</property>
25 
26     <!-- <property name="connection.characterEncoding">UTF-8</property> -->
27     <!--加載hibernate映射  -->
28     <mapping resource="com/hibernatetest/entity/User.hbm.xml" />
29 
30 </session-factory>
31 
32 
33 
34 </hibernate-configuration>

 

      第二步:配置*hbm.xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3                                    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping>
 5     <!-- name:對應的實體類的權限定名稱,table:對應數據庫表名稱 -->
 6  <class name="com.hibernatetest.entity.User" table="hibernateUser">
 7      <!-- id標籤用於配置主鍵屬性
 8              name:對應實體類中屬性名稱
 9              type:能夠省略,若是省略默認實體類中屬性的對應類型
10       -->
11   <id name="uid" type="java.lang.Integer">
12           <!-- column用於設置對應數據庫表中字段名
13               name:數據庫表中的字段名
14               length:設置字段長度
15            -->
16           <column name="u_id" length="32"></column>
17           <!-- generator用於設置主鍵生成策略 -->
18           <generator class="native"></generator>
19   </id>
20   
21   <!-- property標籤用於配置其餘屬性
22              name:對應實體類中屬性名稱
23              type:能夠省略,若是省略默認實體類中屬性的對應類型
24       -->
25   <property name="uname" column="u_name">
26           <!-- column用於設置對應數據庫表中字段名
27               name:數據庫表中的字段名
28               length:設置字段長度
29            -->
30            <column name="u_name" ></column>
31   </property>
32   
33  </class>
34 </hibernate-mapping>

三.使用Hibernate框架操做數據庫(Hibernate有五大核心接口一個核心類)

    Configuration:從hibernate.cfg.xml文件中加載主配置信息(數據庫url,用戶名,密碼,jdbc驅動,數據庫Dialect方言,數據庫鏈接池,hibernate映射文件等)

    SessionFactory:用於建立Session對象工廠,它可經過configuration建立獲得,保存了數據庫的配置信息和全部的映射關係

    Session:用於執行數據庫增刪改查基本操做

    Query和Criteria接口:用於負責執行各類數據的查詢,它可使用HQL語言或SQL語句兩種表達方式

    Transaction:用於事務控制(默認事務不自動提交)

    Hibernate框架運行原理:

      1.首先經過configuration去加載hibernate.cfg.xml這個配置文件

      2.根據配置文件的信息去建立SessionFactory,SessionFactory是線程安全的,是一個session工廠

      3.用SessionFactory來建立session,session不是線程安全的,經過session進行數據庫的各類操做

      4.在進行增刪查改操做的時候經過Session打開Transaction進行事務的控制

 1 public static void main(String[] args) {
 2         //1.加載主配置文件
 3         Configuration configuration = new Configuration().configure();//此處讀取默認名稱「hibernate.cfg.xml」,想要讀取指定名稱,需.configure("xxx.xml");
 4         
 5         //2.建造Session工廠
 6         SessionFactory sessionfactory = configuration.buildSessionFactory();
 7         
 8         //3.獲取Session,這個對象中提供了一套增刪改查的方法
 9         Session sess = sessionfactory.openSession();
10         
11         //4.查詢獲取對象
12         User user = sess.get(User.class, 1);//在數據庫數據表中獲取id爲1的記錄
13         System.out.println(user);
14         //5.釋放session
15         sess.close();
16     }

4、Session經常使用接口演示及Hibernate框架使用步驟

    第一步:編寫hibernate工具類

 1 package HibernatenateUtils;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 
 7 public class hibernateUtils {
 8     public static Session getSession(){
 9         //1.加載主配置文件
10         Configuration configuration = new Configuration().configure();
11         
12         //2.建造Session工廠
13         SessionFactory    sessfactory = configuration.buildSessionFactory();
14         
15         //3.獲取Session,這個對象中提供了一套增刪改查的方法
16         Session    session = sessfactory.openSession();
17         
18         return session;
19     }
20 }

    第二步:編寫實體類

 1 package com.hibernatetest.entity;
 2 
 3 public class User {
 4     private Integer uid;
 5     private String uname;
 6     public User() {
 7         super();
 8         // TODO Auto-generated constructor stub
 9     }
10     public User(Integer uid, String uname) {
11         super();
12         this.uid = uid;
13         this.uname = uname;
14     }
15     public Integer getUid() {
16         return uid;
17     }
18     public void setUid(Integer uid) {
19         this.uid = uid;
20     }
21     public String getUname() {
22         return uname;
23     }
24     public void setUname(String uname) {
25         this.uname = uname;
26     }
27     @Override
28     public int hashCode() {
29         final int prime = 31;
30         int result = 1;
31         result = prime * result + ((uid == null) ? 0 : uid.hashCode());
32         result = prime * result + ((uname == null) ? 0 : uname.hashCode());
33         return result;
34     }
35     @Override
36     public boolean equals(Object obj) {
37         if (this == obj)
38             return true;
39         if (obj == null)
40             return false;
41         if (getClass() != obj.getClass())
42             return false;
43         User other = (User) obj;
44         if (uid == null) {
45             if (other.uid != null)
46                 return false;
47         } else if (!uid.equals(other.uid))
48             return false;
49         if (uname == null) {
50             if (other.uname != null)
51                 return false;
52         } else if (!uname.equals(other.uname))
53             return false;
54         return true;
55     }
56     @Override
57     public String toString() {
58         return "User [uid=" + uid + ", uname=" + uname + "]";
59     }
60     
61     
62 }

    第三步:進行數據庫操做(此處只對Session相關經常使用操做進行註釋)

package com.hibernatetest.test;
import java.io.Serializable;
import org.hibernate.Session;
import com.hibernatetest.entity.User;
import HibernatenateUtils.hibernateUtils;

public class SessionTest {
    public static void main(String[] args) {
        Session    session = hibernateUtils.getSession();
        
        //4.數據庫操做
        /*save()            添加
         *Update()            修改
         *saveOrUpdate()    添加或修改
         *createQuery()        建立Query查詢對象
         *delete()            刪除
         *get()                根據id查詢,獲取對象(當即加載,無論有沒有訪問對象,都會生成對應的SQL語句並執行)
         *load()            根據id查詢,獲取對象(延遲加載,只有當訪問對象的時候,才生成對應的SQL語句並執行)
         *flush()            清理session緩存,在事務提交和session關閉時都會自動執行flush()
         *beginTransaction()開啓事務
         * */
        //(4 - 1)save添加操做
        User user1 = new User(null,"lisi");
        Serializable save = session.save(user1);//將對象添加到數據庫中做爲表的一條記錄,返回的是一個主鍵值
        //注意:此處我hibernate.cfg.xml設置的事務自動提交爲true
        //        事務自動提交默認爲false,可在hibernate.cfg.xml中修改,
        //                            也可經過session.beginTracsation()開啓事務和session2.getTransaction().commit();//提交事務 
        //        若是事務自動提交爲false,此時數據並未同步到數據庫中
        //           若是事務自動提交爲true,此時數據便已經同步到數據庫中
        System.out.println(save);
        
        
        //(4 - 2)Update修改操做
        session.beginTransaction();//開啓事務
        User user2 = session.get(User.class, 5);//先從數據庫中取出數據
        user2.setUname("zhangsan");//再修改數據,此處不能修改設置了主鍵自增加的id.
        session.update(user2);//最後再把數據放回去
        session.getTransaction().commit();//提交事務
        
        //(4 - 3)delete刪除操做
        //注意:使用delete操做必須保證刪除對象在數據庫中,若是數據庫中沒有則會報錯:
        //Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1;
        session.beginTransaction();//開啓事務
        User user3 = new User(null,null);
        user3.setUid(21);
        session.delete(user3);
        session.flush();
        session.getTransaction().commit();//提交事務
        
        //(4 - 4)saveOrUpdate刪除操做:若是對象中主鍵不爲null(而且這個主鍵的值在數據庫中存在)作修改操做,若是爲null作添加操做
        //注意:若是對象中的主鍵在數據庫中不存在,會報錯:
        //Error during managed flush [Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1]
        session.beginTransaction();//開啓事務
        User user4 = new User(17,"zhangsan");
        session.saveOrUpdate(user4);
        User user5 = new User(null,"zhangsan");
        session.saveOrUpdate(user5);
        session.getTransaction().commit();//提交事務
        
        //5.釋放Session
        session.close();//若是事務自動提交爲false,此時session緩存中的數據會自動同步到數據庫中,以後會自動調用flush清空緩存。
    }
}
相關文章
相關標籤/搜索