1. 程式人生 > >【SSH框架】之Hibernate系列一

【SSH框架】之Hibernate系列一

路徑 應用 port setname domain 配置文件 學習 縮進 object

微信公眾號:compassblog

歡迎關註、轉發,互相學習,共同進步!

有任何問題,請後臺留言聯系!

1、Hibernate框架概述

(1)、什麽是Hibernate
Hibernate是一個開放源代碼的 ORM 框架,是主流的Java持久層框架之一,它對 JDBC進行了輕量級的對象封裝,使得Java開發人員可以使用面向對象的編程思想來操作數據庫。
(2)、Hibernate在三層架構中的位置
上篇文章所講的Struts2框架取代的是三層框架中的web層,而Hibernate框架取代的則是dao層,具體描述如下圖:

技術分享圖片
(3)、什麽是ORM
ORM(Object Relational Mapping),即對象關系映射,就是利用描述對象和數據庫表之間映射的元數據,自動把Java應用程序中的對象,持久化到關系型數據庫的表中。通過操作Java對象,就可以完成對數據庫表的操作。可以把 ORM 理解為關系型數據和對象的一個紐帶,開發人員只需要關註紐帶一端映射的對象即可。ORM 實現原理如下圖:
技術分享圖片


(4)、Hibernate框架的優勢與功能

  • Hlbernate對JDBC訪問數據庫的代碼做了輕量級封裝,大大簡化了數據訪問層繁瑣的重復性代碼,並且減少了內存消耗,加快了運行效率。
  • Hlbernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現,它很大程度的簡化了DAO (DataAccess Object,數據訪問對象)層編碼工作。操作數據庫的時候,可以以面向對象的方式來完成,不再需要書寫SQL語句。
  • Hlbernate的性能非常好,映射的靈活性很出色。它支持很多關系型數據庫,從一對一到多對多的各種復雜關系。
  • 可擴展性強,由於源代碼的開源以及API的開放,當本身功能不夠用時,可以自行編碼進行擴展。

2、搭建Hibernate框架,完成第一個應用實例

(1)、創建一個web項目,導入所需要的jar包,包括數據庫驅動包,如下圖所示:

技術分享圖片
(2)、創建數據庫demo_project和表user,建表語句如下:

創建數據庫demo_project語句:

create database demo_project;

常見表user語句:

CREATE TABLE `user` (
  `id` int(10) NOT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `height` int(11) DEFAULT NULL,
  `weight` double(10,0) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(3)、創建實體User.java,具體代碼如下:

User.java

package com.hibernate.demo;

public class User {
    //基本屬性
    private int id;
    private String name;
    private int age;
    private int height;
    private int weight;

    //setter和getter方法
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }

}

(4)、導入約束,在與實體同一個包下新建ORM配置文件User.hbm.xml,書寫ORM元數據,具體配置代碼如下:

User.hbm.xml

<?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 package="com.hibernate.domain" >

    <class name="User" table="user" >
        <id name="id"  >
            <generator class="native"></generator>
        </id>
        <property name="name" column="name" ></property>
        <property name="age" column="age" ></property>
        <property name="height" column="height" ></property>
        <property name="weight" column="weight" ></property>    
    </class>

</hibernate-mapping>

(5)、在src下新建hibernate.cfg.xml主配置文件,具體配置代碼如下:

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">
<hibernate-configuration>
    <session-factory>

         <!-- 數據庫驅動 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <!-- 數據庫url -->
        <property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
         <!-- 數據庫連接用戶名 -->
        <property name="hibernate.connection.username">root</property>
         <!-- 數據庫連接密碼 -->
        <property name="hibernate.connection.password">root</property>
        <!-- 數據庫方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

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

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

        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- 引入orm元數據  -->
        <mapping resource="com/hibernate/domain/User.hbm.xml" />

    </session-factory>
</hibernate-configuration>

(6)、新建測試類TestDemo.java,書寫測試代碼,具體如下:

TestDemo.java

package com.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.hibernate.domain.User;

//測試Hibernate框架
public class TestDemo {

    @Test
    //插入信息
    public void test(){
        Configuration conf = new Configuration().configure();

        SessionFactory sessionFactory = conf.buildSessionFactory();

        Session session = sessionFactory.openSession();

        Transaction tx = session.beginTransaction();

        //保存信息
        User u = new User();
        u.setName("孔乙己");
        u.setAge(22);
        u.setHeight(172);
        u.setWeight(120);

        session.save(u);

        tx.commit();
        session.close();
        sessionFactory.close();
    }
}

(7)、使用JUnit測試運行,信息插入成功,具體結果如下圖:

技術分享圖片
技術分享圖片
本項目運行環境:jdk1.7、Tomcat7.0

3、Hibernate配置文件詳解

(1)、orm元數據配置詳解:

package

   <!-- package屬性:填寫一個包名,在元素內部凡是需要書寫完整類名的屬性,就可以直接寫簡答類名 -->
   <hibernate-mapping package="com.hibernate.domain" >

class

<!-- 
        class元素: 配置實體與表的對應關系的
            name: 完整類名
            table:數據庫表名
     -->
    <class name="User" table="user" >

id

<!-- id元素:配置主鍵映射的屬性
                name: 填寫主鍵對應屬性名
                column(可選): 填寫表中的主鍵列名.默認值:列名會默認使用屬性名
                type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
                        每個類型有三種填法: java類型|hibernate類型|數據庫類型
                not-null(可選):配置該屬性(列)是否不能為空. 默認值:false
                length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
         -->
        <id name="id"  >
            <!-- generator:主鍵生成策略 -->
            <generator class="native"></generator>
        </id>

property

<!-- property元素:除id之外的普通屬性映射
                name: 填寫屬性名
                column(可選): 填寫列名
                type(可選):填寫列(屬性)的類型.hibernate會自動檢測實體的屬性類型.
                        每個類型有三種填法: java類型|hibernate類型|數據庫類型
                not-null(可選):配置該屬性(列)是否不能為空. 默認值:false
                length(可選):配置數據庫中列的長度. 默認值:使用數據庫類型的最大長度
         -->
        <property name="name" column="name" >
            <!--  <column name="cust_name" sql-type="varchar" ></column> -->
        </property>
        <property name="age" column="age" ></property>
        <property name="height" column="height" ></property>
        <property name="weight" column="weight" ></property>

(2)、Hibernate主配置文件詳解:

必選配置

<!-- 數據庫驅動 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <!-- 數據庫url -->
        <property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
         <!-- 數據庫連接用戶名 -->
        <property name="hibernate.connection.username">root</property>
         <!-- 數據庫連接密碼 -->
        <property name="hibernate.connection.password">root</property>
        <!-- 數據庫方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

可選配置

<!-- #hibernate.show_sql true 
             #hibernate.format_sql true
        -->
        <!-- 將hibernate生成的sql語句打印到控制臺 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 將hibernate生成的sql語句格式化(語法縮進) -->
        <property name="hibernate.format_sql">true</property>
        <!-- 
        ## auto schema export  自動導出表結構,自動建表
        #hibernate.hbm2ddl.auto create      自動建表,每次框架運行都會創建新的表,以前表將會被覆蓋,表數據會丟失。(開發環境中測試使用)
        #hibernate.hbm2ddl.auto create-drop 自動建表,每次框架運行結束都會將所有表刪除。(開發環境中測試使用)
        #hibernate.hbm2ddl.auto update(推薦使用) 自動生成表,如果已經存在不會再生成;如果表有變動,自動更新表(不會刪除任何數據)
        #hibernate.hbm2ddl.auto validate    校驗。不自動生成表,每次啟動會校驗數據庫中表是否正確,校驗失敗。
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>

引入orm元數據配置

<!-- 引入orm元數據
            路徑書寫: 填寫src下的路徑
-->
<mapping resource="com/hibernate/domain/User.hbm.xml" />

關註微信公眾號compassblog,後臺回復 “Hibernate系列一” 獲取本項目源碼

原文鏈接:https://mp.weixin.qq.com/s?__biz=MzU5MTE0ODcwNQ==&mid=2247483975&idx=1&sn=24f28cdc3399c0d295a5ceb209383e10&chksm=fe322189c945a89f0c2723de0c7c1ef48cbd218e14ed2c8ea0a9c7c4da241737011bc7cf66d7#rd

本系列後期仍會持續更新,歡迎關註!

如果你認為這篇文章有用,歡迎轉發分享給你的好友!

本號文章可以任意轉載,轉載請註明出處!

掃碼關註微信公眾號,了解更多

技術分享圖片

【SSH框架】之Hibernate系列一