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

Spring 入門(十一):Spring 整合 Hibernate 實現 CRUD 完整實戰教程

     編輯:Java 相關知識

課程定位

Spring 系列最後一課:首次真正實現 Spring + Hibernate + 數據庫端到端整合,完成增刪改查全流程。

環境準備

  • 數據庫:Oracle (Scott 用戶)
  • 建表:USERS 表(ID、NAME、REGTIME)
  • 序列:USERS_SEQ 提供主鍵
  • JAR 包:Spring、Hibernate、Oracle 驅動、DBCP、JTA 等

建表 表結構 JAR 包

完整代碼結構

1. 實體與映射

// Users.java
@Entity @Table(name="USERS", schema="SCOTT")
public class Users implements Serializable {
    @Id @GeneratedValue(generator="seq") @GenericGenerator(name="seq", strategy="sequence", parameters=@Parameter(name="sequence", value="USERS_SEQ"))
    private Integer id;
    private String name;
    private Date regTime;
    // getter/setter/toString
}

// Users.hbm.xml
<hibernate-mapping package="www.csdn.spring.hibernate.domain">
    <class name="Users" table="USERS" schema="SCOTT">
        <id name="id" column="ID">
            <generator class="sequence"><param name="sequence">USERS_SEQ</param></generator>
        </id>
        <property name="name" column="NAME"/>
        <property name="regTime" column="REGTIME" type="timestamp"/>
    </class>
</hibernate-mapping>

2. DAO 接口與實現(手動注入 HibernateTemplate)

// UsersDao.java
public interface UsersDao {
    void save(Users entity);
    void deleteById(Class clazz, Integer id);
    List getObjects(Class clazz);
    void update(Users entity);
}

// UsersDaoImpl.java
public class UsersDaoImpl implements UsersDao {
    private HibernateTemplate hibernateTemplate;
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; }

    @Override public void save(Users entity) { hibernateTemplate.save(entity); }
    @Override public List getObjects(Class clazz) { return hibernateTemplate.find("from " + clazz.getName()); }
    @Override public void deleteById(Class clazz, Integer id) { hibernateTemplate.bulkUpdate("delete from " + clazz.getName() + " where id=" + id); }
    @Override public void update(Users entity) { hibernateTemplate.update(entity); }
}

3. 測試類

public class UserTest {
    @Test public void save() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("app*.xml");
        UsersDao dao = ac.getBean("usersDaoImpl", UsersDao.class);
        dao.save(new Users(null, "chrp999999999", new Date()));
    }
    @Test public void getObjects() { ... }
    @Test public void delete() { ... }
    @Test public void update() { ... }
}

4. 配置文件體系

// jdbc.properties
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.username=scott
jdbc.password=tiger
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl

// applicationContext.xml
<context:property-placeholder location="jdbc.properties"/>
<import resource="spring.xml"/>
<import resource="spring-dao.xml"/>

// spring.xml (核心:DataSource + SessionFactory + HibernateTemplate + 事務)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="url" value="${jdbc.url}"/>
</bean>

<bean id="localSessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources"><value>www/csdn/spring/hibernate/domain/Users.hbm.xml</value></property>
    <property name="hibernateProperties">
        <props><prop key="show_sql">true</prop><prop key="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</prop></props>
    </property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>

<bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="hibernateTransactionManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
    </tx:attributes>
</tx:advice>
<!-- AOP 切面配置註釋掉,僅演示事務定義 -->

// spring-dao.xml
<bean id="usersDaoImpl" class="www.csdn.spring.hibernate.dao.UsersDaoImpl">
    <property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>

運行結果驗證

測試輸出

架構關鍵點總結

  1. 分層配置:屬性文件 → 數據源 → SessionFactory → Template → 事務管理器 → 事務通知 → DAO 注入
  2. 聲明式事務:tx:advice + 方法名模式匹配,業務代碼零事務侵入
  3. HibernateTemplate:封裝 Session 獲取/關閉、異常轉換、事務綁定
  4. 映射靈活:支持 XML 與註解雙模式

此配置模式為經典 Spring 2.5/3.x + Hibernate 3.x 黃金組合,現代項目建議升級至 Spring Boot + Spring Data JPA / Hibernate 5+,簡化配置達 80% 以上。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved