hibernate學習(一)

javaWeb學習已經(jīng)有一段時間了,最開始接觸的mvc框架是struts2,不過也并沒有系統(tǒng)化的學過這個框架,只是跟著老師過了一遍流程,會簡單的使用?,F(xiàn)在已經(jīng)使用struts2配合DBUtils寫了兩個小小的項目。ssh既然放在一起肯定還是一起用的比較方便,現(xiàn)在開始學習hibernate。額,可能是有點老了,但還是要學學,聽說要簡單基礎點、、、

hibernate入門

  • 建立工程,導入jar包。
    在hibernate包中的lib文件夾里都是jar包,很多還沒接觸,不過required文件夾下的是必須的,我用的最新5.2的版本,直接將這些jar和jdbc那個連接數(shù)據(jù)庫的包導入就能用了。還有些包log4j-api-*.jar slf4j-api-*.jar slf4j-log4j12-*.jar這幾個是用來提供日志輸出的。導入完畢開始寫配置敲代碼。我滴個,一共十幾個包,實話真麻煩。
  • 核心配置
    就是設置各種各樣的參數(shù)啥的也是麻煩的很。以下是份基礎的配置,必須放在src下面,文件名必須是hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/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/hiber</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <!-- hibernate信息 可選屬性 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <!-- 兼容不同數(shù)據(jù)庫的特殊語句 -->
        <property name="hibernate.hbm2ddl.auto">update</property> <!-- 自動創(chuàng)建數(shù)據(jù)表 常用update -->
        <property name="hibernate.show_sql">true</property> <!-- 顯示sql語句日志 -->
        <property name="hibernate.format_sql">true</property> <!-- 格式化sql語句日志 -->
        <!-- 映射文件所在的位置 -->
        <!-- mapping class="cn.lkangle.entity.User"/--> <!-- 使用注釋配置 -->
        <mapping resource="cn/lkangle/entity/user.hbm.xml"/>
    </session-factory>

</hibernate-configuration>
  • 映射配置
  1. 第一種
    將創(chuàng)建的數(shù)據(jù)類逐一的和數(shù)據(jù)庫映射起來
    先是數(shù)據(jù)類
package cn.lkangle.entity;

public class User {
    private int uid;
    private String name;
    private String pass;
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

hibernate的映射配置文件,這個位置沒要求,但一般和類放在一起

<?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>
    <class name="cn.lkangle.entity.User" table="user">
        <id name="uid" column="id"> <!-- 唯一的id鍵 -->
            <generator class="native"></generator>  <!-- 常用屬性 設置自動增長 -->
        </id>
        <property name="name" column="name"></property>  <!-- name是類中變量名 column是要建立的字段名 一般和變量名一樣 -->
        <property name="pass" column="pass"></property>
    </class>
</hibernate-mapping>
  1. 使用注釋進行映射配置
package cn.lkangle.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="user")  // 與數(shù)據(jù)庫表名映射
public class User {
    @Id@GeneratedValue  // 規(guī)定主鍵 設置主鍵規(guī)則為默認規(guī)則 自動增長
    int uid;
    @Column  // 設置字段與屬性映射 默認字段與屬性名相同
    String name;
    @Column(name="upass") // 自定義設置字段名
    String pass;
    
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

注解配置中主鍵設置為自動增長規(guī)則并非真的自增,而是通過添加新字段記錄下一個值實現(xiàn)自增。別的規(guī)則沒試過...

  • 寫代碼測試
    終于可以寫代碼了,配置了一圈的xml文件真是麻煩,沒辦法想學還就是要一點點配置,還要弄懂才好。以下是一份簡單的測試代碼,七步走~~
package cn.lkangle.dao;

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

import cn.lkangle.entity.User;

public class HbmDao {
    @Test
    public void hbmTest() {
        // 1、 加載hibernate.cfg.xml配置文件
        Configuration cfg = new Configuration();
        cfg.configure();
        // 2、 創(chuàng)建SessionFactory對象 在這里會根據(jù)配置文件映射關系自動創(chuàng)建數(shù)據(jù)表
        SessionFactory sf = cfg.buildSessionFactory();
        // 3、 使用SessionFactory創(chuàng)建Session對象
        Session session = sf.openSession();
        // 4、 手動開啟事務
        Transaction ts = session.beginTransaction();
        // 5、 具體邏輯 crud操作
        User user = new User();
        user.setName("lee");
        user.setPass("123456");
        session.save(user);
        // 6、 提交事務
        ts.commit();
        // 7、 關閉資源
        session.close();
        sf.close();
    }
}
  • 單元測試
    運行,這是控制臺輸出這樣一串信息就說明成功了~~~
Hibernate: 
    
    create table user (
       id integer not null auto_increment,
        name varchar(255),
        pass varchar(255),
        primary key (id)
    ) engine=InnoDB
Hibernate: 
    insert 
    into
        user
        (name, pass) 
    values
        (?, ?)

先創(chuàng)建了表,又插入了值,方便。

  • 所遇問題
    第一次用并沒有真的成功,不能自動創(chuàng)建表,百度一圈后找到原因。核心配置里的數(shù)據(jù)庫方言選擇錯誤。
    我使用的是mysql5.3的版本,而mysql 5.0之前和之后是不一樣的。

    5.0以前的Hibernate 方言是: org.hibernate.dialect.HSQLDialect
    5.0以后的Hibernate 方言是: org.hibernate.dialect.MySQL5InnoDBDialect
    還可以根據(jù)版本自動設置:<property name="hibernate.dialect">${dialect}</property>

    5.0之前的我沒有測試,后兩個是了確實沒問題

剛剛接觸hibernate 簡單記錄下

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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