hibernate入門 ( 一 )

實(shí)體類的編寫規(guī)則

  1. 實(shí)體類中屬性私有
  2. 私有屬性使用公有的set get方法進(jìn)行操作
  3. 要求屬性中有一個(gè)值都是唯一的
  4. 實(shí)體類中屬性的數(shù)據(jù)類型,不建議基本數(shù)據(jù)類型,而要使用包裝類

hibernate主鍵生成策略

  <!--            設(shè)置數(shù)據(jù)表字段生成和增長(zhǎng)策略
              native 生成表主鍵和自動(dòng)增長(zhǎng)-->
            <generator class="native"></generator>

native:

根據(jù)底層數(shù)據(jù)庫對(duì)自動(dòng)生成表示符的能力來選擇,identity,sequence,hio三種生成器的一種,適合跨數(shù)據(jù)庫平臺(tái)開發(fā),適用于代理主鍵.
uuid: hibernate采用128位的uuid算法來生成標(biāo)識(shí)符,該算法能夠在網(wǎng)絡(luò)環(huán)境中生成唯一的字符串標(biāo)識(shí)符,該策略并不流行,因?yàn)樽址愋偷闹麈I比整數(shù)類型的主鍵占用更多的數(shù)據(jù)庫空間,適合于代理主鍵.

演示uuid

  • 使用uuid,實(shí)體類中的唯一屬性是String
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!--        name  實(shí)體類的全路徑
           table  表的名稱-->
    <class name="entity.User" table="user">
        <!--        配置實(shí)體類屬性和表字段一一對(duì)應(yīng)-->
        <id name="id" column="id">
            <!--            設(shè)置數(shù)據(jù)表字段生成和增長(zhǎng)策略
              native 生成表主鍵和自動(dòng)增長(zhǎng)-->
            <generator class="uuid"></generator>
        </id>
        <!--        配置其他屬性-->
        <property name="name" column="name"></property>
        <property name="address" column="address"></property>
    </class>
</hibernate-map

實(shí)體類操作

  • 添加操作
//   5. 具體操作
// uid 設(shè)置或者不設(shè)置沒有影響
        User u = new User();
        u.setName("靳飛飛");
        u.setAddress("西安");
        session.save(u);
  • 根據(jù)id查詢
  @Test
    public void test() {
//
//        2. 創(chuàng)建sessionFactory對(duì)象
//        讀取hibernate配置文件內(nèi)容,創(chuàng)建sessionFactory
//        在過程中,根據(jù)映射關(guān)系,在配置數(shù)據(jù)庫里面將表創(chuàng)建
        SessionFactory factory = HibernateFactory.getFactory();

//        3. 獲取session
        Session session = factory.openSession();
        
//        查詢根據(jù)id
        User user = session.get(User.class, 1);
        System.out.println(user);


//        6. 關(guān)閉
        session.close();
        factory.close();
    }
  • 修改操作
    先查詢,在修改

//        進(jìn)行操作
        User user = session.get(User.class, 1);
        user.setName("虎哥");
        session.update(user);

        transaction.commit();

使用下面這種修改方法,相當(dāng)于重新對(duì)所有的屬性改變,如果沒有設(shè)置,相當(dāng)于是null;

    User u = new User();
        u.setId(1);
        u.setName("飛飛飛");
        session.update(u);

  • 刪除操作
//        操作
        User user = session.get(User.class, 2);
        session.delete(user);

或者

//        操作
        User user = new User();
        user.setId(1);
        session.delete(user);

實(shí)體類對(duì)象狀態(tài)

  1. 瞬時(shí)態(tài)

對(duì)象里面沒有id值,對(duì)象與session沒有關(guān)聯(lián)

  User user = new User();
  user.setName("戶戶");      
  1. 持久態(tài)

對(duì)象里面有id值,對(duì)象與session有關(guān)聯(lián)

  User user = session.get(User.class, 1);
  1. 托管態(tài)

對(duì)象有id值,對(duì)象與session沒有關(guān)聯(lián)

User u=new User();

u.setId(1);

session.saveOrUpdate()此方法在實(shí)體類為瞬時(shí)態(tài)時(shí)候做添加,托管態(tài)和持久態(tài)時(shí)候做修改

hibernate的一級(jí)緩存

  1. 什么是緩存?

數(shù)據(jù)存到數(shù)據(jù)庫里面(硬盤),數(shù)據(jù)庫本身是文件系統(tǒng),使用流方式操作文件效率不是很高.

(1) 把數(shù)據(jù)存到內(nèi)存里面,不需要使用流的方式,可以直接讀取內(nèi)存中的數(shù)據(jù)
(2) 把數(shù)據(jù)放到內(nèi)存中,提高讀取效率.

hibernate緩存

  1. hibernate 框架中提供很多優(yōu)化方式,hibernate緩存你就是一個(gè)優(yōu)化方式.

  2. hibernate緩存特點(diǎn)

  • 第一類緩存 Hibernate一級(jí)緩存
    a. hibernate一級(jí)緩存默認(rèn)打開
    b. hibernate一級(jí)緩存使用范圍,是從session創(chuàng)建到session關(guān)閉范圍
    c. hibernate一級(jí)緩存中,存儲(chǔ)數(shù)據(jù)必須持久態(tài)數(shù)據(jù).
  • 第二類緩存 hibernate二級(jí)緩存
    a. 目前已經(jīng)不使用了,替代技術(shù)redis
    b. 二級(jí)緩存默認(rèn)不是打開的,需要配置
    c. 二級(jí)緩存適用范圍,是sessionFactory的范圍

驗(yàn)證一級(jí)緩存

//        進(jìn)行操作
        User user = session.get(User.class, 3);
        System.out.println(user);

        User user1 = session.get(User.class,3);
        System.out.println(user1);

第一次查詢時(shí)會(huì)發(fā)送sql語句進(jìn)行查詢
第二次查詢同樣的東西,不會(huì)在發(fā)送sql語句

一級(jí)緩存特性

  1. 持久態(tài)自動(dòng)更新數(shù)據(jù)
    不需要寫update方法
cache.png

hibernate 事務(wù)規(guī)范寫法

 @Test
    public void updateTest() {
        SessionFactory factory = null;
        Session session = null;
        Transaction tx = null;
        try {
//        獲取sessionFactory
             factory = HibernateFactory.getFactory();
//        獲取session
             session = factory.openSession();
             tx = session.beginTransaction();

//        進(jìn)行操作
            User user = session.get(User.class, 3);
            user.setName("飛飛");

            int i = 10/0;


            tx.commit();
        }catch (Exception e){
//            事務(wù)回滾
            tx.rollback();
        }finally {
            //        關(guān)閉
            session.close();
            factory.close();

        }

    }

hibernate綁定session

  1. session類似于jdbc中的connection,
  2. hibernate幫忙實(shí)現(xiàn)與本地線程綁定session
  3. 獲取與本地線程綁定的session
    (1) 在hibernate核心配置文件中配置
  <!--配置本地線程綁定session-->
        <property name="hibernate.current_session_context_class">thread</property>

(2) 調(diào)用sessionFactory里面的方法得到session


    /**
     * 獲取與本地線程綁定的session
     * @return
     */
    public static Session getSession(){
        return factory.getCurrentSession();
    }

(3) 獲取與本地線程綁定的session時(shí)候,關(guān)閉session報(bào)錯(cuò),不需要在手動(dòng)關(guān)閉session了.

query對(duì)象查詢所有記錄

  1. 使用query對(duì)象,不需要寫sql語句,但是寫hql語句
    (1) hql:hibernate query language 提供查詢語言,這個(gè)sql語句和普通sql語句很相似.
    (2) hql和sql語句的區(qū)別
  • 使用sql操作表和表字段
  • 使用hql 操作實(shí)體類和屬性.
  1. 查詢所有hql語句
    (1) from 實(shí)體類名稱

  2. query 對(duì)象的使用
    (1) 創(chuàng)建query對(duì)象
    (2) 調(diào)用里面的方法

    @Test
    public void queryTest(){
        Session session = null;
        Transaction tx = null;
        try{
            session = HibernateFactory.getSession();

             tx = session.beginTransaction();

            Query query = session.createQuery("from User");
            List<User> list = query.list();
            for(User u:list){
                System.out.println(u);
            }
        } catch (Exception e) {

            tx.rollback();
        }finally {
            session.close();
        }

    }
  1. Criteria對(duì)象的使用,必須先開啟事務(wù),在獲取對(duì)象
  @Test
    public void testCritera() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateFactory.getSession();

            tx = session.beginTransaction();

            Criteria criteria = session.createCriteria(User.class);
            List<User> list = criteria.list();

            for (User u : list) {
                System.out.println(u);
            }

        } catch (Exception e) {
            tx.rollback();
        } finally {
       //     session.close();
        }
    }
  1. sqlquery對(duì)象的使用
    sqlQuery默認(rèn)返回的是List<Object[]>
 @Test
    public void testSQLQuery(){
        Session session = null;
        Transaction tx = null;
        try{
            session = HibernateFactory.getSession();

//            開啟事務(wù)
             tx = session.beginTransaction();

            SQLQuery sqlQuery = session.createSQLQuery("select * from user");
            List<Object[]> list = sqlQuery.list();
            for(Object[] u:list){
                System.out.println(Arrays.toString(u));
            }

        }catch (Exception e){
            tx.rollback();
        }finally {

        }
    }

讓list()直接返回User對(duì)象

 @Test
    public void testSQLQuery(){
        Session session = null;
        Transaction tx = null;
        try{
            session = HibernateFactory.getSession();

//            開啟事務(wù)
             tx = session.beginTransaction();

            SQLQuery sqlQuery = session.createSQLQuery("select * from user");
            sqlQuery.addEntity(User.class);
            List<User> list = sqlQuery.list();
            for(User u:list){
                System.out.println(u);
            }

        }catch (Exception e){
            tx.rollback();
        }finally {
            session.close();
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容