1. 程式人生 > >hibernate學習筆記(一)

hibernate學習筆記(一)

Hibernate

1.hibnate是什麼

1.Hibernate是一個開發原始碼的物件關係對映框架(ORM);

2.對JDBC進行了輕量級的封裝,可以將實體類和資料庫中的表產生對映關係;

3.是一個全自動的ORM框架;hibernate能自動生成sql語句;

2.hibnate的概念

hibernate簡要結構圖,中間的hibernate.properties,可以讓資料持久化,這裡面我們換成***.cfg.xml,表與屬性名對應

全面解決”的體系結構方案

3.Hibernate提供了5種檢索物件的方式

     1.導航物件圖檢索方式:根據已經載入的物件導航到其他物件          from  Emp e group by e.dept.deptName     2.OID檢索方式:按照物件的OID來檢索物件  get/load     3.HQL檢索方式:使用面向物件的HQL查詢語言  from Student     4.QBC檢索方式:使用QBC(Query By Criteria)API來檢索物件,這種API封裝了基於字串形式的查詢語句,\         提供了更加面向物件的查詢介面     5.本地SQL檢索方式:使用本地資料庫的SQL查詢語句          createSqlQuery();

 1.2核心配置檔案hibernate.cfg.xml

<?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">

標頭檔案

配置檔案中的需要我們配置的重要內容:

01.連線資料庫的四要素

02.管理各種hbm.xml對映檔案

03.快取的設定

04.是否顯示sql語句

05.是否格式化sql語句

06.hbm2ddl的配置

3.1.關於核心API

1.  Configuration

 載入hibernate的核心配置檔案,以及負責啟動hibernate,建立SessionFactory物件

2.  SessionFactory 介面

初始化Hibernate,是資料儲存源的代理,負責建立Session物件!

一個專案中我們使用一個SessionFactory就足夠了!

如果我們需要操作多個數據庫時,建立每個資料庫指定一個SessionFactory!

3.  Session介面

 負責執行持久化物件的CRUD操作!是執行緒不安全的!可以開啟事務!建立Transaction物件!

 Session         ===>會話session

 HttpSession      ===>使用者session

4.  Transaction介面

 針對於事務的操作!

5.  Query介面

方便我們對資料庫資料的查詢,有兩種方式來實現查詢:

 01.sql

 02.hql

6.  Criteria介面

 和query介面非常相似!完全面向物件的思想去操作資料庫!

2.Hibnate入門例子

讓表中的屬性名和資料庫中的欄位名一致,

2.1.建立hibernate,hbm.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">
<!--
package: 需要對映的實體類所在包
class節點
    name:對應的是實體類的類名,如果沒有書寫package,則必須是完整限定類名
    table:資料庫中的表名,如果表名和實體類名一致,可以省略
id節點:  表中的主鍵
 generator:主鍵生成策略 ,主鍵由誰去建立?程式猿?Hibernate?資料庫
   name:  必須和實體類中的屬性名一致
   column : 必須和資料庫中的列名一致,如果列名和屬性名一致,可以省略
-->

<hibernate-mapping package="com.xdf.bean">
    <class name="Teacher" table="teacher">
        <id name="id" column="tid">
           <generator class="assigned"/><!--主鍵生成策略-->
        </id>
        <property name="name"/><!--資料庫中的也是name-->
    </class>
</hibernate-mapping>

2.2.建立實體類

public  class teacher(){ 
private Intger Id;
private String name;
}

2.3建立hibnate.cfg.xml

<?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-factory>
        <!--配置連線資料庫的四要素-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/t17</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>

        <!--是否顯示底層生成的sql語句-->
        <property name="hibernate.show_sql">true</property>
        <!--是否格式化sql語句-->
        <property name="hibernate.format_sql">true</property>
        <!--hbm2ddl   就是把xx.hbm.xml檔案中的配置生成資料庫中DDL(資料定義語言)
        create:  每次執行都會刪除 上次生成的表,還會建立新的!
        update: 沒有表會自動建立,有表就增加資料!
        validate: 如果hbm檔案和資料庫中的欄位對應 就會新增,
                  否則丟擲異常!
       create-drop:  每次執行都會刪除 上次生成的表,前提是sessionFactory關閉
        -->
        <property name="hbm2ddl.auto">update</property>

        <!--載入需要的hbm.xml對映檔案 現階段還沒有 -->
         <mapping resource="com/xdf/bean/Teacher.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

注意要:

***.Hbm.xml一定要被**.cfg.xml管理!

建text測試類

public class TeacherTest {


    Transaction transaction=null;  // 定義在這裡  是為了 後續每個方法中使用
    Session session=null;
    @Before
    public  void before(){
        //01.讀取核心配置檔案 configure()底層就是載入了/hibernate.cfg.xml
        Configuration configuration=new Configuration().configure();
        //02.建立會話工廠 sessionFactory
        SessionFactory factory= configuration.buildSessionFactory();
        //03.建立會話  session
         session=factory.openSession();
        //04.開啟事務
        transaction = session.beginTransaction();
    }


    @After
    public  void after(){
        //07.提交事務
        transaction.commit();  //  assigned 產生sql語句
        //08.關閉會話
        session.close();
    }

    /**
     * 新增教師資訊
     */
    @Test
    public  void addTeacher(){

        //05.建立新增的物件
        Teacher teacher=new Teacher();
        teacher.setId(1);
        teacher.setName("教師1");
        //06.持久化操作
        System.out.println("******************************");
        session.save(teacher);   //identity產生sql語句
        System.out.println("******************************");
       // factory.close();
    }
/**
 *  資料庫有對應的資料產生2條sql
 *
 *  01.先根據物件的id 去資料庫中查詢 看有沒有資料
 *  02.如果存在根據id刪除指定的資訊
 *     如果不存在 只做查詢操作
 */
@Test
public void  deleteTeacher(){
      //建立需要刪除的物件
    Teacher teacher=new Teacher();
    teacher.setId(2); 
    System.out.println("***********************");
    //刪除
    session.delete(teacher);
    System.out.println("***********************");
}
@Test
public void  updateTeacher(){
    //建立需要修改的物件
    Teacher teacher=new Teacher();
    teacher.setId(1);
    teacher.setName("小黑111");
    System.out.println("***********************");
    //修改
    session.update(teacher);
    System.out.println("***********************");
}

還有生成策略等,