首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Hibernate + MySQL 快速入門:純 Java SE 環境零配置實戰教學

     編輯:Java 相關知識

不依賴 Web 容器、Ant/Maven、IDE 插件,純 Eclipse + JDK + MySQL + Hibernate JARs 即可跑通第一個持久化程式。

環境準備

  • JDK 1.6+
  • Eclipse IDE
  • MySQL 5.1+ (建立資料庫 test)
  • Hibernate 3.2 核心 JAR + 依賴 (含 mysql-connector-java)

Step 1: 建立資料表

CREATE TABLE news (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(400),
    content TEXT,
    time DATETIME
);

Step 2: 實體類別 (POJO)

package cn.com.nick.hbm;
import java.util.Date;

public class News {
    private int id;
    private String title;
    private String content;
    private Date date;
    // 標準 getter/setter
}

Step 3: 映射檔

News.hbm.xml 放在同包目錄:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "https://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.com.nick.hbm.News" table="news">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <property name="title" column="title"/>
        <property name="content" column="content"/>
        <property name="date" column="time" type="timestamp"/>
    </class>
</hibernate-mapping>

Step 4: 核心配置

hibernate.cfg.xml 放在 src 根目錄:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "https://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <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">jdbc:mysql://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123</property>
        <property name="show_sql">true</property>
        <mapping resource="cn/com/nick/hbm/News.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Step 5: 統一 SessionFactory 工具類

public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() { return sessionFactory; }
}

Step 6: CRUD 測試類

public class Test {
    public static void main(String[] args) {
        Test t = new Test();
        // t.save(new News("測試標題", "測試內容", new Date()));
        t.select();
        // t.update();
        // t.delete();
    }

    public void save(News n) {
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        s.beginTransaction();
        s.save(n);
        s.getTransaction().commit();
    }

    public void select() {
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        s.beginTransaction();
        List<News> list = s.createQuery("FROM News").list(); // HQL 查物件非表
        for (News n : list) {
            System.out.println(n.getId() + " | " + n.getTitle() + " | " + n.getDate());
        }
        s.getTransaction().commit();
    }

    public void update() {
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        s.beginTransaction();
        News n = (News) s.load(News.class, 1);
        n.setTitle("更新後標題");
        s.update(n);
        s.getTransaction().commit();
    }

    public void delete() {
        Session s = HibernateUtil.getSessionFactory().getCurrentSession();
        s.beginTransaction();
        News n = (News) s.load(News.class, 6);
        s.delete(n);
        s.getTransaction().commit();
    }
}

關鍵提醒

  • HQL 查詢類別名、屬性名,區分大小寫 (FROM News 非 FROM news)
  • getCurrentSession() 需配置 hibernate.current_session_context_class=thread (Hibernate 3+ 預設)
  • load() 回傳 Proxy,不存在拋異常;get() 即時查庫,不存在回 null
  • 交易邊界務必包含完整業務單元
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved