Hibernate

1. 初識Hibernate

基本概念

  • ORM:(object relation mapping)


    ORM示意圖1

    ORM示意圖2
  • 阻抗不匹配:對象和關系型數據庫不匹配
  • 沒有侵入性:代碼中不用去繼承hibernate提供的借口
  • Hibernate是一個ORM輕量級框架;解決持久化操作,使得程序員可以從便攜反復的JDBC工作中解放出來,專注于業(yè)務。提高程序員的開發(fā)效率。Hibernate是一個全功能ORM框架
  • 移植性:方言HQL:hibernate query language。根據配置轉換成對應數據庫的sql。

配置文件:

  • hibernate.cfg.xml:主配置文件,跟數據庫打交道,
  • *.hbm.xml:和對象匹配

2. 入門demo

  • hibernate.cfg.xml
<hibernate-configuration>
    <session-factory>
        <!-- 配置數據庫連接信息 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!-- 數據庫方言 --><!-- hibernate4以上可以直接使用MySQL5Dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
    </session-factory>
</hibernate-configuration>

  • 建庫和pojo對象
public class User {
    private Integer id;
    private String name;
    private String pwd;
}
  • 編寫*.hbm.xml
<hibernate-mapping>
    <class name="com.yxxy.pojo.User" table="user">
        <id>
            <!-- 主鍵生成策略 -->
            <generator class="native"></generator>
        </id>
        <!-- 實體類的屬性 -->
        <property name="name"></property>
        <property name="pwd"></property>
    </class>
</hibernate-mapping>
  • 添加該hbm.xml到hibernate.cfg.xml中
<mapping resource="com/yxxy/pojo/User.hbm.xml"/>
  • 測試功能
public class HibernateTest {

    public static void main(String[] args) {
        // 1、新建Configuration對象
        Configuration cfg = new Configuration().configure();
        // 2、通過Configuration對象創(chuàng)建SessionFactory
            //在hibernate3.x中是這樣寫
            //SessionFactory sf = cfg.buildSessionFactory();
        // hibernate4.3
        ServiceRegistry sr = new StandardServiceRegistryBuilder()
                                    .applySettings(cfg.getProperties()).build();
        SessionFactory sf = cfg.buildSessionFactory(sr);
        // 3、通過SessionFactory得到Session
        Session session = sf.openSession();
        // 4、通過Session對象得到Transaction對象
        Transaction tx = session.beginTransaction();
        // 5、保存數據
        User user = new User();
        user.setName("張三");
        user.setPwd("111");
        session.save(user);
        // 6、提交事務
        tx.commit();
        // 7、關閉session
        session.close();
    }
    
}

3. Hibernate詳解

  • Configuration管理讀取配置文件
        // 1、新建Configuration對象
        Configuration cfg = new Configuration().configure();
            // 讀取src下hibernate.properties,不推薦使用
            //Configuration cfg1 = new Configuration();
            // 默認讀取是src下的hibernate.cfg.xml
            // 如果hibernate的核心配置文件不叫hibernate.cfg.xml
            // Configuration cfg2 = new Configuration().configure("hb.cfg.xml");
            // 可編程式,不需要配置文件
            // cfg2.addProperties(extraProperties);
            // cfg2.addResource(resourceName);

  • SessionFactory對象
// 2、通過Configuration對象創(chuàng)建SessionFactory
            //在hibernate3.x中是這樣寫
            //SessionFactory sf = cfg.buildSessionFactory();
        // hibernate4.3
        ServiceRegistry sr = new StandardServiceRegistryBuilder()
                                    .applySettings(cfg.getProperties()).build();
        SessionFactory sf = cfg.buildSessionFactory(sr);

  • Session對象
    Hibernate對數據庫crud操作,主要使用session。Session可以理解為對Connection對象的一個包裝。Session是一個線程不安全的對象,生命周期非常短暫,一般和事務一一對應。使用完馬上關閉就是為了放置線程不安全問題。Session又成為hibernate的一級緩存。
  • Transaction對象
    事務管理對象,通過session來獲取該對象。
        // 第一種
        Transaction tx = session.beginTransaction();
        // 第二種
        Transaction getTx = session.getTransaction();
        getTx.begin();
  • 事務和異常處理
public class TestException {
    
    public static void main(String[] args) {
        Configuration cfg = null;
        SessionFactory sf = null;
        Session session = null;
        Transaction tx = null;
        try {
            // 1、新建Configuration對象
            cfg = new Configuration().configure();
            // 2、通過Configuration對象創(chuàng)建SessionFactory
            ServiceRegistry sr = new StandardServiceRegistryBuilder()
                                        .applySettings(cfg.getProperties()).build();
            sf = cfg.buildSessionFactory(sr);
            // 3、通過SessionFactory得到Session
            session = sf.openSession();
            // 4、通過Session對象得到Transaction對象
            tx = session.beginTransaction();
            // 5、操作數據
            User u = (User) session.get(User.class, 2);
            System.out.println(u);
            // 6、提交事務
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            // 回滾事務
            tx.rollback();
        } finally {
            // 7、關閉session
            if(session != null && session.isOpen())
                session.close();
        }
    }
    
}
  • Query對象--后續(xù)再說

4. Hibernate log和配置文件詳解

  • log
    確定要使用日志的實現——log4j


    log4j的jar包

    編寫log4j.properties

  • hibernate.cfg.xml講解
<hibernate-configuration>
    <session-factory>
        <!-- 配置數據庫連接信息 -->
        <!-- 數據庫驅動 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!-- hibernate可選項信息 -->
        <!-- 數據庫方言 --><!-- hibernate4以上可以直接使用MySQL5Dialect -->
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 是否打印sql語句 -->
        <property name="show_sql">true</property>
        <!-- 格式化sql語句 -->
        <property name="format_sql">true</property>
        <!-- 
            數據庫更新方式
                create:每次執(zhí)行都先把原有數據表刪除,然后創(chuàng)建該表
                create-drop:關閉SessionFactory時,將刪除掉數據庫表
                validate:檢測
                update:如果表不存在則直接創(chuàng)建表,有就不用創(chuàng)建
         -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 映射文件信息 -->
        <mapping resource="com/yxxy/pojo/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
  • *.hbm.xml
<!-- 
    package聲明pojo類所在的包,如果不寫那么在class中需要指明pojo類所在的包
 -->
<hibernate-mapping package="com.yxxy.pojo">
    <!-- 
        class指一個pojo類
        name表示pojo類名
        table表示pojo類對應數據庫中的表名;如果不寫默認是類名
     -->
    <class name="User">
        <!-- 
            id表示實體類的標識
            對應數據庫表中的主鍵
            name指實體類的標識屬性名
            column表示對應數據庫表的列名;如果不寫則數據庫中列名和屬性名一致
            length表示數據庫表中對應數據類型的長度,如果不寫用默認值
            type表示類型,如果不寫hibernate可以找到對應pojo類的屬性的類型
         -->
        <id name="id">
            <!-- 
                主鍵生成策略
                    uuid:UUID被編碼為一個32位16進制數字的字符串
                    native:根據底層數據庫的能力選擇identity、sequence、hilo中的一個去自增
                    assigned:自己指定主鍵
             -->
            <generator class="native"></generator>
        </id>
        <!-- 
            實體類的屬性
            name:指pojo類屬性名稱(區(qū)分大小寫)
            column:兩種寫法效果一致
         -->
        <property name="name" column="name"></property>
        <property name="pwd">
            <column name="pwd"></column>
        </property>
    </class>
</hibernate-mapping>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容