Hibernate4.2.4入門(一)——環境搭建和簡單例子

1、前言

發下牢騷,這段時間要作項目,又要學框架,搞得都沒時間寫筆記,可是以爲這知識學過仍是要記錄下。進入主題了java

1.一、Hibernate簡介mysql

什麼是Hibernate?Hibernate有什麼用?算法

Hibernate是開放源代碼的對象關係映射框架,用來把java的對象映射到數據庫中的關係數據中,以便永久保存數據。sql

(簡單說來,咱們都知道Java語言是面向對象的語言,數據庫是面向關係的,咱們每次要往數據庫中添加數據的時候,是否是每次都須要寫SQL語句,進行CRUD,而優秀的開發人員數據庫

他們想出了一個很是好的映射框架,對象關係映射,也就是Hibernate,再透徹點說,就是你往對象添加數據的時候,數據庫中的表就自動添加了數據了。是否是很神奇!)網絡

Hibernate的做用:session

一、管理Java類的對象到數據庫的映射app

二、提供數據查詢框架

三、提升效率,減小開發人員使用SQL和jdbc處理數據的時間ide

四、Hibernate能實現數據持久化和對象關係的映射

1.二、理解Hibernate

筆者在前面有說過,學一個東西,首先要理解它是什麼?有什麼用?爲什麼存在?

咱們要了解Hibernate,首先要先去了解三層結構,三層結構咱們都聽過,可是,它和Hibernate有什麼關係呢?

這裏簡要說明下三層結構

三層結構分爲: 表示層,業務邏輯層,數據庫層

表示層:         提供與用戶進行交互的界面

業務邏輯層:   負責各類業務邏輯,提供對業務數據的保存,更新,刪除和查詢操做等

數據庫層:      存放管理應用的持久化業務數據

而Hibernate,其實就是在業務邏輯層和數據庫層中間,添加一個持久化層,這個持久化層是業務邏輯中分離出來的;這樣,業務邏輯層經過持久化層,持久化層經過數據庫層。

 

這裏說了持久化,那麼什麼是持久化呢?

將數據(如內存中的對象)永久的保存到存儲設備中,就是持久化,持久化的做用是將內存中的數據存儲到關係型的數據庫中。

說到底其實數據存放分爲兩種,一種是短時間存放,就是存放在內存中,當你從新運行項目的時候,內存中的數據就消失,而另一種就是永久存放。

理論就到這裏。

1.二、簡單例子——增刪改查

1.2.一、搭建環境

新建java property,這裏筆者的環境是Eclipse+Tomcat8.0,下載所須要的jar包,打包在這裏,注意還得添加mysql的jar包,將包導入到項目中,具體操做

右鍵項目名——Properties——Java Build Path——Libraries——Add Library——User Library——User Libraryies——New,接下來就添加jar,而後起個名字,以後將導入到你的項目就能夠了。

效果圖:

1.2.二、新建配置文件

 這裏須要注意一點就是:在Hibernate中,默認配置文件的命名爲hibernate.cfg.xml,因此咱們配置文件命名通常就是這個,若是說你想要從新命名的話,那麼在讀取配置文件的時候就要指定相對路徑。

在src下新建hibernate.cfg.xml

內容有鏈接數據庫,指定讀取實體類的配置信息,還有在控制檯輸出SQL語句等數據;配置文件中的dtd文件,在hibernate-core-4.2.4.Final.jar中的org.hibernate中的最後就能看到hibernate-configuration-3.0.dtd,打開該文件,而後將下面的dtd文件限制加到xml配置文件中便可。注意:筆者這裏使用的是hibernate 4.2的版本。可是通常都在覈心包裏面的。

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

 

 

新建實體類:Student.java

package com.hibernate.hellos;

public class Student {
    private int sid;
    private String sname;
    private int sage;
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public int getSage() {
        return sage;
    }
    public void setSage(int sage) {
        this.sage = sage;
    }
}
Student

重點來了:當咱們新建實體類時,須要在該實體類的基礎上新建映射文件,dtd限制一樣在覈心包中裏面查找

新建配置文件:Student.hbn.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- name:表示的是該類的相對路徑
     table:表示的是數據庫的表名
-->
    <class name="com.hibernate.hellos.Student" table="Student">
        <!--
         type:表示該屬性是int類型
         column:映射的是數據庫中的列名
         native:根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個,就是根據數據庫生成
         -->
        <id name="sid" type="int">
            <column name="ID" />
            <generator class="native" />
        </id>
         <property name="sname" type="java.lang.String">
            <column name="SNAME" />
        </property>
        <property name="sage" type="int">
            <column name="SAGE" />
        </property>
    </class>
</hibernate-mapping>

注意:

其中generator的class有:
increment(遞增)
用於爲long, short或者int類型生成惟一標識。只有在沒有其餘進程往同一張表中插入數據時才能使用。

identity (標識)
對DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的內置標識字段提供支持。返回的標識符是long, short 或者int類型的。

sequence (序列) 

在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用序列(sequence),而在Interbase中使用生成器(generator)。返回的標識符是long, short或者 int類型的

uuid
用一個128位的UUID算法生成字符串類型的標識符。在一個網絡中惟一(使用了IP地址)。UUID被編碼爲一個32位16進制數字的字符串。

native(本地)
根據底層數據庫的能力選擇identity, sequence 或者hilo中的一個。

新建配置文件:hiberate.cfg.xml,該文件放在src下

<?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="show_sql">true</property>          <!-- 顯示sql語句 -->
           <property name="format_sql">true</property>      <!-- 格式化sql語句 -->
          <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
          <property name="hibernate.connection.url">
              <![CDATA[jdbc:mysql://localhost:3306/myhibernate?useUnicode=true&characterEncoding=utf8]]>
          </property>
          <property name="connection.username">root</property>
          <property name="connection.password">root</property>
          <!-- 建立表 使用create,查詢或者更新的時候使用update-->
          <property name="hibernate.hbm2ddl.auto">create</property>
          <!-- hibernate的第一個測試例子 -->
          <mapping resource="com/hibernate/hellos/Student.hbm.xml" />
          
          
    </session-factory>
</hibernate-configuration>

 注意:使用hibernate.hbm2ddl.auto的時候,當爲create的時候,表示若是你數據庫中沒建立表也不要緊,hibernate會自動幫你建立,當使用update的時候,表示在表的基礎上使用

接下來新建一個測試類:Test.java

package com.hibernate.hellos;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class Test {
    private static SessionFactory sessionfactory;
    private static Session session;
    public static void main(String[] args){
        //讀取默認配置文件名 hibernate.cfg.xml
        //若是要指定文件名,只須要在new Configuration().configure("指定文件的路徑");
        Configuration config = new Configuration().configure();
        //註冊服務
        ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties())
                .buildServiceRegistry();
        //實例化一個session工廠
        SessionFactory sessionfactory = config.buildSessionFactory(service);
        //打開hibernate的session,執行操做
        session = sessionfactory.openSession();
        
        //添加 
        add();
        
        //查詢
        sel();
        
        //修改    
        update();
        
        //刪除
        delete();
    }
    //添加
    public static void add(){
        Transaction transaction = session.beginTransaction();
        Student s = new Student();
        s.setSname("張三");
        s.setSage(20);
        session.save(s);
        transaction.commit();
    
        //注意:若是session關閉的話,須要指定打開
    }
    //查詢
    public static void sel(){
        Student s = (Student) session.get(Student.class, 1);
        System.out.println(s.getSname());
        
    }
    //修改數據
    public static  void update(){
        Student s = new Student();
        s.setSname("李四");
        s.setSage(30);
        
        Transaction transaction = session.beginTransaction();
        //獲取數據庫中的表
        Student s1 = (Student) session.get(Student.class,1);
        transaction.commit();
        s1.setSname("李思思");
        transaction = session.beginTransaction();
        session.update(s1);
        transaction.commit();
    }
    public static void delete(){
        
        Transaction transaction = session.beginTransaction();
        Student s = (Student) session.get(Student.class, 1);
        session.delete(s);
        transaction.commit();
        
    }
}

若是你直接複製我代碼的話,你就會看到數據庫中除了一張表數據什麼都沒有,把delete()方法註釋掉。恩,別犯傻。

當咱們使用格式化的時候,就能夠看到

添加和修改的效果圖:

數據庫中的表的數據:

 

總結:

 一、新建實體類的時候,記得要寫映射文件,固然可使用註解的方式,後期筆者會慢慢記錄

 二、table表名不能夠是mysql中的關鍵字

 三、hibernate.hbm2ddl.auto的使用須要注意

相關文章
相關標籤/搜索