hibernate第一天

首先介紹一下javaEE開發的三層架構java

  Web層    也被稱爲表現層    它是表現層的一個設計模型:也就是你們經常使用的MVC開發模式mysql

  Service層   它是和需求相關的web

  DAO層   它只和數據庫打交道,對數據庫進行增刪改查(CURD)、sql

  Hibernate是持久層的框架   只能對數據庫進行增刪改查數據庫

 

  框架的底層其實就是webapi

  框架其實就是一個骨架,準備了大量代碼:框架的目的就是抽取一些重複性結構的代碼,減小程序的開發量 session

       而hibernate主要就是替換DAO層的框架,hibernate操做簡單,經過保存一個實體對象,自動將數據保存到數據庫,形  兩個步驟:描述一個實體對象,對應數據庫的表架構

         描述實體的屬性,對應數據庫表中的字段oracle

  Hibernate的環境搭建app

   一、 建立一個項目,導入相關jar包,hibernate的必須包  mysql的jar包  日誌包(非必須的包,日誌包就是在控制檯上打印執行的sql語句)

    二、建立實體類和對應的數據庫

    三、建立一個映射文件  名稱爲(實體類.hbm.xml)

      描述實體類和數據庫的關係

      描述實體類中字段和數據庫表中字段的關係

      配置核心文件   文件須要在src下建立hibernate.cfg.xml

        配置文件中 基本配置   

                基本四項(數據庫驅動  鏈接串  用戶名 和密碼)、

        ·        其餘配置

                加載映射文件

        下面是一個示例配置

              

<?xml version="1.0" encoding="UTF-8"?>
<!-- 約束 :規定xml的寫法-->
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.itheima.domain" >
    <!--
        記憶性知識 
        1.配置 實體和數據庫表的關係 
            <class> 描述實體和數據庫表的關係 
                name="" 實體的全限定類名  由於用到反射
                table="" 對應的數據表名稱
                lazy 最後一節課
    
        非記憶性知識:
            catalog="" 數據庫名稱
            package="" 包的名稱 若是有了此配置  之後在該包下的全部類 不須要寫全限定類名 只須要類的名稱
                可是若是不是該包下的內容  須要配置全限定名
            length="" 表示字段的長度
            type=""  表示字段的類型
                1.hibernate的類型  string 
                2.java的類型 java.lang.String
                3.數據庫類型 varchar()
                    <column name="cust_name" sql-type="數據庫類型"></column> 
                但若是沒寫 默認使用實體類類的類型
        
    -->
    <class name="Customer" table="cst_customer" >
        <!-- 
            2.配置 實體字段和數據庫表字段的關係 
                2.1 特殊字段 id 
                    <id></id>
                        name="" 實體的屬性名稱 get/set方法 去掉get首字母小寫
                        column="" 數據庫表字段的名稱
                        column="" 配置能夠省略 前提是實體的字段名稱 和數據庫的字段名稱必須保持一致
                        但開發中 實體字段使用駝峯式命名規則 cust_name ==>> custName
                        今天省略
                        
                        <generator class="native"></generator>
                        主鍵生成策略 class="native" 策略名稱
                            native 表示使用數據庫默認的本地策略
                                oracle和mysql的主鍵生成策略不同 
                                mysql auto_increament 自動增加
                                oralce sequence 序列
                                native 自動根據數據庫 自動匹配
                2.2 普通字段
        -->
        <id name="cust_id" column="cust_id">
            <generator class="native"></generator>
        </id>
        
        <!-- 普通字段  -->
        <property name="cust_name" >
            <!-- <column name="cust_name" sql-type="數據庫類型"></column> -->
        </property>
        <property name="cust_source" column="cust_source"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" ></property>
        <property name="cust_phone" ></property>
        <property name="cust_mobile" ></property>
    </class>
</hibernate-mapping>
  

核心配置文件中的其餘配置
    

<?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 session的工廠  建立session對象

此處的session 指的是java和 數據庫的會話 

session做用 : session內部封裝了操做數據的api 等效之前的connction

 -->

<session-factory>

<!-- 1.基本四項 -->

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql:///ee291_hibernate_day01</property>

<property name="hibernate.connection.username">root</property>

<property name="hibernate.connection.password">root</property>

 

<!-- 2.其餘配置 從配置文件中找  都是優化內容-->

<!-- 配置方言

不一樣數據庫的基本語法一致 但不一樣的數據庫有本身的特點

爲了方便hibernate生成不一樣sql使用

 -->

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 在控制檯上是否打印sql -->

<property name="hibernate.show_sql">true</property>

<!-- 格式化sql -->

<property name="hibernate.format_sql">true</property>

<!-- ddl : 數據庫定義語言 怎麼建立表 怎麼刪除表 怎麼給表加字段 

沒用(測試使用 測試表結構)

create-drop :

先判斷數據庫存不存在表 若是存在刪除 建立新表(根據xml來) 操做數據 操做完之後刪除表

數據庫沒有表 建立表的時候 xml沒有指定長度 默認採用該字段的最大長度

create

先判斷數據庫存不存在表 若是存在刪除 建立新表(根據xml來) 操做數據

數據庫有表且只有一條記錄

重要(上線使用)

update   : 以xml爲主 修改數據庫(仍是以數據庫爲主 先建立數據庫 再寫實體類)

validate : 以數據庫爲主 若是不一致的狀況數據庫報錯

-->

<property name="hibernate.hbm2ddl.auto">update</property>

 

<!-- c3p0鏈接池 

配置後報錯

org.hibernate.service.spi.ServiceException: Unable to create requested service

[org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]

緣由是 沒有導入c3p0的鏈接池包

 

org.hibernate.connection.C3P0ConnectionProvider 不是一個類 而是一個字符串

org.hibernate.c3p0.internal.C3P0ConnectionProvider 這是一個類

爲何倆個均可以? 字符串是之前hibernate的早期版本 處理版本兼容問題

-->

<!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->

<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>

 

 

 

<!-- 3.加載映射 -->

<mapping resource="com/itheima/domain/Customer.hbm.xml" />

</session-factory>

 

 

</hibernate-configuration>

 

 

一個簡單的demo

    

public void demo2(){

     詳解: 

  Configuration 加載配置文件

 *  new Configuration() 表示加載hibernate.properties文件

 *   .configure() 加載hibernate.cfg.xml

 *   .configure(路徑) 加載hibernate.cfg.xml

 *   buildSessionFactory() 構建session工廠

 *   configuration.addResource(resourceName) 加載映射文件 在覈心配置文件中加載過了

 *  configuration.addClass(Class)   加載實體類.class  要求 映射文件的名稱必須是 實體類名.hbm.xml

 

 

  *SessionFactory 由Configuration加載核心配置文件建立(基本四項)

 * SessionFactory 做用 建立session對象

 * SessionFactory 加載須要浪費大量資源 工廠通常不關閉

    

    

    Configuration configuration = new Configuration().configure();

    SessionFactory sessionFactory = configuration.buildSessionFactory();

    Transaction transaction = session.beginTransaction();//開啓事務

 

    Customer customer = new Customer();

    customer.setCust_name("門三三石22");

    session.save(customer);

 

    transaction.commit(); //事務提交

    session.close();

    sessionFactory.close();

    

  session對象內部封裝了一套對數據庫的增刪改查的方法

 

  

  1.查詢 get(Object)

 *  2.增長 save(Object)

 * 3.修改 update(Object)

 * 4.刪除 delete(Object)

  只須要將須要操做的對象傳入便可

  詳細的操做能夠在hibernate的doc文件中查找其具體操做方法

  

 

}

相關文章
相關標籤/搜索