初入Hibernate框架

初入Hibernate框架<一>

需要的工具從官網下載: hibernate.org
Hibernate框架實際上就是:對象關係映射:通過描述對象和數據庫之間映射的元數據,操作數據庫,將Java程序中的對象自動持久化到數據庫(自己不用寫sql語句)。
是一個將持久化類與數據庫表相映射的工具。
入門示例:
第一步 先建一個Java工程導入使用hibernate最小必要包。 —-lib/required
第二步 在src目錄下創建配置文件hibernate.cfg.cml
第三步 編寫一個會話工廠
注意:
Hibernate中的session不能關也關不了,和sessionFactory也不能關

新建一個值對象,在domain包下面建立一個Student.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">
<!-- 該配置文件站的立場是Object, 去配置自己和 數據庫表之間的映射關係   -->
<!-- 根 hibernate-mapping-->
<hibernate-mapping package="cn.hncu.demo.domain">

    <class name="Student" table="students" catalog="hib">
        <!-- id標記是指Student類中的屬性變量,該屬性是表主鍵字段對應 -->
        <id name="studId" type="java.lang.String">
           <!-- column標記是指數據庫表中的哪一列(字段)  -->
           <column name="id" length="8"></column>
        </id>

        <!-- 只有主鍵字段對應的屬性變量才能用id,其它字段對應的屬性變量都用property -->
        <property name="studName" type="java.lang.String">
           <column name="name" length="40"></column>
        </property>

        <property name="age" type="java.lang.Integer">
           <column name="age"></column>
        </property>

        <property name="depId" type="java.lang.String">
           <column name="deptId" length="8"></column>
        </property>

    </class>


</hibernate-mapping>

然後寫一個在SRC下的配置文件 hibernate.cfg.xml:
告訴hibernate要怎樣鏈接數據庫,將你的連接信息給它,還有你對值對象的映射配置也要在此配置

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>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/hib</property>
        <property name="connection.username">root</property>
        <property name="connection.password"></property>

        <!-- SQL dialect方言:告訴它你是用的什麼數據庫語言-->
        <property name="dialect">
           org.hibernate.dialect.MySQLDialect
        </property>
        <!-- 其他在此用不上,就省略了-->

        <!-- 一定要把我們寫的對象映射文件配置進來(可以配置多個),否則沒法使用Hibernate的ORM功能 -->
        <mapping resource="cn/hncu/demo/domain/Student.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

鏈接完 之後,寫個類似於C3P0Ppool的Util,用來獲取他的SessionFactory

HibernateUtil:

public class HibernateUtil {
    //單例
    private static SessionFactory sessionFactory =null;
    private static ThreadLocal<Session> t = new ThreadLocal<Session>();

    static{
        //類似於C3P0連接池
        try {
            Configuration config = new Configuration().configure();
            StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings( config.getProperties() ).build();
            sessionFactory = config.buildSessionFactory(serviceRegistry);
        } catch (HibernateException e) {
             throw new ExceptionInInitializerError(e);
        }
    }       



    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public static Session getSession() throws HibernateException{
        Session session = t.get();
        if(session == null || !session.isOpen()){
            //沒有sessionFactory哪來的session
            session=(sessionFactory!=null) ?sessionFactory.openSession() : null;
            t.set(session);
        }
        return session ; 
    }
    //關閉與數據庫的會話
    public static void closeSession() {
        t.set(null);
    }
}

最後就是測試是否成功的操作數據庫:

public class StudentManager {

    public static void main(String[] args) {

        //來自手冊的方式---新測結果:不行
        Session session = HibernateSessionFactory.getSession();

        session.beginTransaction(); //開啓事務

        Student stud = new Student();
        stud.setStudId("S006");
        stud.setStudName("劉備");
        stud.setAge(23);
        stud.setDepId("D003");
        session.save(stud);

        Student stud2 = new Student();
        stud2.setStudId("S007");
        stud2.setStudName("張飛");
        stud2.setAge(23);
        stud2.setDepId("D003");
        session.save(stud2);//如存在主鍵重複則會進行事務回滾

        session.getTransaction().commit();//事務提交 (如果出異常,Hibernate會幫我們回滾的,我們不用寫rollback() )

        session.close();
    }
}

結果這裏寫圖片描述
日誌信息:
這裏寫圖片描述

我所使用的Hibernate版本鏈接:

http://pan.baidu.com/s/1dEOGVx3

我所用的SQL語句

create database hib character set utf8;
use hib;
create table students(
  id varchar(8) primary key,
  name varchar(40),
  age int,
  deptId varchar(8)
);

insert into students values('S001','Jack',20,'D001');
insert into students values('S002','Tom', 21,'D001');
insert into students values('S003','張三',23,'D002');
insert into students values('S004','李四',24,'D002');
insert into students values('S005','王五',22,'D002');

CREATE TABLE depts(
  id VARCHAR(8) PRIMARY KEY,
  NAME VARCHAR(40)
);
insert into depts values('D001','信息科學與工程學院');
insert into depts values('D002','數學與計算機學院');
insert into depts values('D003','土木工程學院');

DELETE FROM students;
ALTER TABLE students ADD(
   CONSTRAINT fk_stu_dept FOREIGN KEY(deptid) REFERENCES depts(id)
);

使用Hibernate必須要導入的包(最小必要包):
這裏寫圖片描述
最後一個爲連接數據庫的包

Hibernate最小必要包:路徑爲

hibernate-release-4.3.7.Final\lib\required

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章