javaEE之Hibernate架構之數據庫連接工具模版製作

O/R Mapping
對象關係映射(ORM)技術,操縱數據庫 通過使用描述對象和數據庫之間映的射元數據將java程序中的對象自動持久化到數據庫
在對數據庫操縱時需要寫mapping文件

如<class User>
     <column >
  </class>

然後通過session.save(user)就能不用寫sql語句,自動把user存到數據庫
類似工具還有mybatis(更靈活)

Hibernate是一個開放源碼的、非常優秀、成熟的O/R Mapping框架。它提供了強大、高性能的Java對象和關係數據的持久化和查詢功能。
Hibernate 只是一個將持久化類與數據庫表相映射的工具,每個持久化類實例均對應於數據庫表中的一條數據行。可以使用面向對象的方法操作此持久化類實例,完成對數據庫表的插入、刪除、修改等操作。
利用Hibernate操作數據庫,我們通過應用程序經過Hibernate持久層來訪問數據庫,其實Hibernate完成了以前JDBC的功能,不過Hibernate使用面向對象的方法操作數據庫。
Hibernate體系結構:
這裏寫圖片描述

Hibernate入門示例。
第1步: 先建一個Java工程導入使用Hibernate最小必要包。可以到網站下載Hibernate最新的包,如果訪問數據庫,則需要導入數據庫驅動包。最小必要包:
這裏寫圖片描述
第2步:在src創建配置文件hibernate.cfg.xml,放置在src目錄中。
第3步:編寫一個會話工廠類。通過會話工廠類產生一個會話Session對象。Session對象是Hibernate的核心。任何對數據庫操作都在會話中進行的。
第4步:編寫POJO類以及映射文件。
第5步:編寫測試文件
一個完整示例,顯示了Hibernate編程基本思路。
我們需要建立值對象和它的配置文件:

package cn.hncu.demo.domain;

public class Student {
    private String studId;
    private String studName;
    private Integer age;
    private String deptId;

    public String getstudId() {
        return studId;
    }

    public void setstudId(String studId) {
        this.studId = studId;
    }

    public String getstudName() {
        return studName;
    }

    public void setstudName(String studName) {
        this.studName = studName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getDeptId() {
        return deptId;
    }

    public void setDeptId(String deptId) {
        this.deptId = deptId;
    }

}
<?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">
<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>
        <!-- 其他字段都用property 只有主鍵用id -->
        <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="deptId" type="java.lang.String">
            <column name="deptId" length="8"></column>
        </property>
    </class>
</hibernate-mapping>

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="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">1234</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>

我們採用線程池獲取方式包裝hibernate獲取服務器連接操作的sesssion對象
也就是我們以後可以直接拿來用的工具模版

package cn.hncu.demo.util;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

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

    static {
        try {
            Configuration config = new Configuration().configure();
            StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(config.getProperties()).build();
            sessionFactory = config.buildSessionFactory(serviceRegistry);
        } catch (Throwable e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public static Session getSession() throws HibernateException {
        Session session = t.get();
        // 如果連session都拿不到,則session爲null,則返回null
        // 如果拿到session沒有開啓,則將session開啓
        if (null == session || !session.isOpen()) {
            session = (sessionFactory != null) ? sessionFactory.openSession()
                    : null;
            t.set(session);
        }
        return session;
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    // 關閉與數據庫的會話
    public static void closeSession() throws HibernateException {
        t.set(null);
    }
}

然後就能進行操作了:

package cn.hncu.demo;

import org.hibernate.Session;

import cn.hncu.demo.domain.Student;
import cn.hncu.demo.util.HibernateUtil;

//Hibernate中session是不能關也關不了的
public class StudentManager {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSession();
        // 開啓事務
        session.beginTransaction();

        Student stu = new Student();
        stu.setstudId("S006");
        stu.setstudName("jack");
        stu.setAge(22);
        stu.setDeptId("p002");
        session.save(stu);
        session.getTransaction().commit();// 事務提交(如果出異常,hibernate會幫我們回滾的)

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