初識Hibernate

hibernate_logo

1、什麼是Hibernate?

Hibernate (開放源代碼的對象關係映射框架): Hibernate是一個開放源代碼的 對象關係映射框架,它對JDBC進行了很是輕量級的對象封裝,它將POJO與數據庫表創建映射關係,是一個 全自動的ORM框架,hibernate能夠 自動生成SQL語句,自動執行,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。

<!-- more -->java

2、爲何使用Hibernate?

2.1 Hibernate相對於傳統JDBC的優勢

  1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
  2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做。
  3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。
  4. hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。

2.2 Hibernate相對於MyBatis的區別與聯繫

二者區別:

Hibernate與MyBatis

二者聯繫:

緩存方面node

相同點:mysql

Hibernate和Mybatis的二級緩存除了採用系統默認的緩存機制外,均可以經過實現你本身的緩存或爲其餘第三方緩 存方案,建立適配器來徹底覆蓋緩存行爲。程序員

不一樣點:sql

Hibernate的二級緩存配置在SessionFactory生成的配置文件中進行詳細配置,而後再在具體的表-對象映射中配置是那種緩存。數據庫

MyBatis的二級緩存配置都是在每一個具體的表-對象映射中進行詳細配置,這樣針對不一樣的表能夠自定義不一樣的緩存機制。而且Mybatis能夠在命名空間中共享相同的緩存配置和實例,經過Cache-ref來實現。編程

3、Hibernate的使用

準備好User實體類和數據庫記錄緩存

User.javasession

public class User {
    private Integer id;
    private String userName;
    private String passWord;
    //Get、Set方法,此處省略。
}

mysql數據庫:架構

mysql數據庫

3.1 添加pom依賴

Hibernate基礎Maven依賴:

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!-- 添加hibernate的依賴 開始-->
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6.1</version>
    </dependency>
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
    </dependency>
    <!-- http://mvnrepository.com/artifact/org.hibernate/hibernate -->
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.3.2.Final</version>
    </dependency>

    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.2.1</version>
    </dependency>
   <!-- <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib-nodep</artifactId>
      <version>3.1</version>
    </dependency>
    &lt;!&ndash; Hibernate library dependecy end &ndash;&gt;
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
    </dependency>-->
    <!-- 添加hibernate的依賴 結束-->
    <!-- mysql數據庫的驅動包 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.6</version>
    </dependency>
  </dependencies>

3.2 hibernate.cfg.xml配置文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--<property name="hibernate.bytecode.use_reflection_optimizer">false</property>-->
        <!--指定數據庫的驅動程序-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!--指定鏈接數據庫的口令-->
        <property name="hibernate.connection.password">admin</property>
        <!--指定鏈接數據庫的URL-->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernatetraning</property>
        <!--指定鏈接數據庫的用戶名-->
        <property name="hibernate.connection.username">root</property>
        <!--數據庫方言,用於指定使用的sql從屬於哪一個數據庫-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!--若是爲true,表示在程序運行時會在控制檯輸出SQL語句,有利於跟蹤Hibernate的運行狀態,默認爲false。應用開發階段設置爲true,發佈階段應設置爲false提升運行性能-->
        <property name="show_sql">true</property>
       <!-- <property name="hibernate.hbm2ddl.auto">update</property>-->
        <mapping resource="mapper/User.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

3.2 User.hbm.xml映射文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 4.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.entity.User" table="tbl_user">
        <!--  在User裏面 id 的set 和 get 方法裏 也要設置爲Integer類型的,否則會報錯 -->
        <id name="id" column="id" type="java.lang.Integer">
            <generator class="assigned"/>
        </id>
        <property name="userName" column="username"  type="java.lang.String" length="20" />
        <property name="passWord" column="password"  type="java.lang.String" length="20"/>

    </class>
</hibernate-mapping>

測試

Configuration config = new Configuration().configure();
        SessionFactory sessionFactory = config.buildSessionFactory();

        //測試session是否建立,以及是否能夠從user映射的表裏獲取記錄
        Session session = sessionFactory.openSession();
        //System.out.println("session=="+session);
        User user = (User)session.get(User.class,1);
        System.out.println(user);
        //關閉會話工廠,項目自動中止。生產環境中千萬不要寫這句。
        //sessionFactory.close();

控制檯輸出:User{id=1, userName='Jack', passWord='123'}

4、Hibernate基本概念

Hibernate是自動化程度更高ORM(Object-Relational Mapping)框架,不是面向SQL的持久層框架,以更加OO方式來編寫數據讀寫代碼。

Hibernate

4.1 對象與關係型數據庫

對象與關係型數據庫

注意:必定要清楚當前操做的東西,是屬於對象層面的仍是關係型數據庫層面的,解決異常也是如此。

Hibernate核心架構

Hibernate中的對象有3中狀態,瞬時對象(Transient Objects)、持久化對象(Persistent Objects)和離線對象(Detached Objects也叫作脫管對象)。

4.2 HibernateUtils.java工具類

public class HibernateUtils {

    private static SessionFactory sessionFactory = null;

    static {
        try {
            Configuration configuration = new Configuration().configure();
            ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                    .applySettings(configuration.getProperties())
                    .build();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        }catch (HibernateException e){
            System.out.println("SessionFactory初始化失敗");
            e.printStackTrace();
        }
    }

    public static SessionFactory getSessionFactory() throws Exception{
        if (sessionFactory != null){
            return sessionFactory;
        }else {
            throw new Exception("sessionFactory爲空,請檢查配置文件");
        }
    }

    public static Session getSession(){
        Session session = null;
        try {
            if (sessionFactory != null){
                session = sessionFactory.openSession();
            }
        }catch (HibernateException e){
            e.printStackTrace();
        }
        return session;
    }

    public static void closeSession(Session session){
        try {
            if (session != null && session.isOpen()){
                session.close();
            }
        }catch (HibernateException e){
            e.printStackTrace();
        }
    }
}

4.3 瞬時對象與持久化對象

測試代碼:

Session session = HibernateUtils.getSession();
        Transaction tx = session.beginTransaction();

        User user1 = new User();
        user1.setId(2);
        user1.setUserName("Frank");
        user1.setPassWord("111");
        // 當前user1在數據庫中沒有記錄進行關聯,因此此時user1是瞬時對象。

        // 將user1持久化
        session.save(user1);
        tx.commit();

        User user2 = (User)session.get(User.class, 2);
        System.out.println(user2);
        // 當前user2在數據庫有惟一一條記錄對應,因此此時user2是持久化對象。

4.4 hibernate.hbm2ddl.auto

hibernate.cfg.xml配置文件中hibernate.hbm2ddl.auto屬性值(從類自動生成數據庫DDL操做)

<property name="hibernate.hbm2ddl.auto">update</property>設置爲update能夠不用手動建表了。

  1. create:若是設置爲該值,則每次加載hibernate時(準確說應是建立SessionFactory時)都會刪除之前建立的表而根據model從新生成表,即便先後的表沒有任何變化,一般會形成數據庫數據丟失,需謹慎使用這個取值。
  2. create-drop:與create差很少,所不一樣的是每次sessionFactory關閉時,就會刪除全部表。
  3. update(最經常使用):這個取值比較經常使用,須要先創建數據庫,在第一次加載hibernate時會自動建立表,之後建立hibernate會自動根據model更新表結構,即便表結構改變了,之前的行不會被刪除。
  4. validate:每次加載hibernate時,驗證建立數據庫表結構,只會和數據庫中的表進行比較,不會建立新表,可是會插入新值。
相關文章
相關標籤/搜索