首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Spring + Hibernate + JDBC 3.0:構建 DB2 持久化應用的最佳實踐指南

     編輯:DB2 教學

教學目標

本教學將引導您完成一個企業級示範應用的構建,整合 Spring AOP 宣告式事務 與 Spring-Hibernate 持久化主幹,針對 DB2 資料庫實現部門/員工領域模型的 CRUD 操作。涵蓋三大持久化技術對比、環境搭建、ORM 映射、DAO 編織、事務攔截與部署驗證全流程。

三大持久化框架快速對比

框架定位核心優勢適用場景
JDO標準化 Java 持久化抽象 (JSR)可移植、資料庫無關、專注領域模型、高性能優化需跨多種資料存儲(關係/對象/文件)的應用
JDBC 3.0Java 標準資料庫連接 API直接控制、成熟穩定、支援自動生成鍵/多結果集/連接池增強需要精細控制 SQL、存儲過程、批次操作的場景
Hibernate開源 ORM 事實標準豐富映射(關聯/繼承/多態)、HQL/原生 SQL/準則查詢、Spring 深度整合、社區活躍複雜領域模型、快速開發、需保留 SQL 能力的企業應用

JDBC 3.0 亮點示例 —— 自動生成鍵獲取:

Statement stmt = conn.createStatement();
stmt.executeUpdate(
  "INSERT INTO Accounts (account_name, balance) VALUES ('Smith Savings', 500.00)",
  Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) { int accountId = rs.getInt(1); }

示範應用架構

  • 資料庫:DB2 orgdb,表 TBL_DEPARTMENT (1) ↔ (N) TBL_EMPLOYEE
  • 領域模型:Department (id, name, Set<Employee>) / Employee
  • 持久化層:Hibernate XML 映射 (.hbm.xml) + Spring LocalSessionFactoryBean
  • DAO 層:DepartmentDAOImpl extends HibernateDaoSupport 使用 HibernateTemplate
  • 事務層:TransactionProxyFactoryBean 攔截 addDepartment,屬性 PROPAGATION_REQUIRED

核心 Spring 配置解析

1. JDBC DataSource + Hibernate SessionFactory

<bean id="exampleDataSource" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName"><value>com.ibm.db2.jcc.DB2Driver</value></property>  <!-- Type 4 驅動 -->
  <property name="url"><value>jdbc:db2://localhost:50000/orgdb</value></property>
  <property name="username"><value>db2admin</value></property>
  <property name="password"><value>db2admin</value></property>
</bean>

<bean id="exampleHibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="properties">
    <props>
      <prop key="hibernate.dialect">net.sf.hibernate.dialect.DB2Dialect</prop>  <!-- 關鍵:告知 Hibernate 使用 DB2 方言 -->
      <prop key="hibernate.hbm2ddl.auto">update</prop>
      <prop key="hibernate.show_sql">true</prop>
      <prop key="hibernate.c3p0.minPoolSize">5</prop>
      <prop key="hibernate.c3p0.maxPoolSize">20</prop>
    </props>
  </property>
</bean>

<bean id="exampleSessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource"><ref local="exampleDataSource"/></property>
  <property name="hibernateProperties"><ref bean="exampleHibernateProperties"/></property>
  <property name="mappingResources">
    <list><value>Department.hbm.xml</value><value>Employee.hbm.xml</value></list>
  </property>
</bean>

2. Department 映射檔 (Department.hbm.xml) 關鍵片段

<class name="springexample.db2persist.hibernate.Department" table="TBL_DEPARTMENT">
  <id name="id" column="DEPARTMENT_ID" type="java.lang.Long">
    <generator class="native"/>  <!-- 使用 DB2 IDENTITY 序列 -->
  </id>

  <set name="employees" inverse="true" cascade="all-delete-orphan">
    <key column="EMPLOYEE_ID"/>
    <one-to-many class="springexample.db2persist.hibernate.Employee"/>
  </set>

  <property name="name" column="DEPARTMENT_NAME" length="60" not-null="true"/>
</class>

3. DAO 實現與事務攔截編織

public class DepartmentDAOImpl extends HibernateDaoSupport implements DepartmentDAO {
  public void addDepartment(Department dept) {
    getHibernateTemplate().save(dept);  // 模板簡化 Session 管理
  }
  public Department getDepartmentEmployees(Department dept) {
    List list = getHibernateTemplate().find(
      "from Department d where d.id = ?", dept.getId(), Hibernate.LONG);
    return (list.size() > 0) ? (Department) list.get(0) : null;
  }
}

<!-- 事務代理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
  <property name="sessionFactory"><ref bean="exampleSessionFactory"/></property>
</bean>

<bean id="departmentDAOTarget" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager"><ref local="transactionManager"/></property>
  <property name="target"><ref local="departmentDAO"/></property>
  <property name="transactionAttributes">
    <props><prop key="addDepartment">PROPAGATION_REQUIRED</prop></props>
  </property>
</bean>

PROPAGATION_REQUIRED 等同 EJB TX_REQUIRED:有事務則加入,無則新建。若需強制新事務可用 PROPAGATION_REQUIRES_NEW。

構建與運行步驟

  1. 安裝 Spring Framework、Apache Ant、DB2 Type 4 驅動 (db2jcc.jar)
  2. 解壓源碼至 C:\DB2SpringHB
  3. 修改 build.xml 中 Spring 安裝路徑與 DB2 驅動路徑
  4. 命令列執行 build → 編譯、打包、運行 CreateDepartmentEmployeeClient
  5. 驗證:db2 connect to orgdb → select * from tbl_department / select * from tbl_employee

遷移與擴展建議

  • 方言切換:更換資料庫只需改 hibernate.dialect (如 Derby 用 DerbyDialect) 與 DataSource URL
  • 連接池升級:生產環境建議替換 DBCP 為 HikariCP 或 Tomcat JDBC Pool
  • 註解映射:新專案可改用 JPA 註解 (@Entity, @OneToMany) 取代 .hbm.xml
  • 聲明式事務現代化:Spring 2.0+ 推薦 @Transactional 註解 + <tx:annotation-driven/> 替代 TransactionProxyFactoryBean
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved