用hibernate和spring整合做小例子對數據庫增刪改查

用hibernate和spring整合做小例子對數據庫增刪改查  

注意:先添加hibernate能力,再添加spring能力,最後逆向數據庫

一.配置applicationContext.xml

1.

<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">


 2.管理sessionFactory:(創建SessionFactory 實例)

  <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="configLocation"
   value="classpath:hibernate.cfg.xml">
  </property>
  </bean>

SessionFactory接口

一個SessionFactory對應一個數據源,它是個重量級對象,不可隨意生成多個實例。對於一般的單數據庫應用來說,只需要一個SessionFactory就足夠了。當然如果有多個數據庫的話,還是需要爲每個數據庫生成對應的SessionFactory。它是線程安全的,同一個實例可以被應用中的多個線程共享。

理解:

(1)Hibernate的核心接口之一:
SessionFactory接口:SessionFactroy接口負責初始化Hibernate。它充當數據存儲源的代理,並負責創建Session對象。這裏用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因爲一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以爲每個數據庫指定一個SessionFactory
(2)Hibernate 的 SessionFactory,是單個數據庫映射關係編譯後的內存鏡像,是Hibernate執行持久化訪問的基礎部分。大部分情況下,一個 J2EE 應用對應一個數據庫。而Spring 通過ApplicationContext管理SessionFactory無須採用單獨Hiberate應用所必需的hibernate.cfg.xml文件Spring 配置管理SessionFactory 與數據庫的連接。而在實際的J2EE應用中,數據源會採用依賴注入的方式,傳給 Hibernate 的 SessionFactory。具體配置如下所示:

<?xml version="1.0" encoding="gb2312"?>
<!--Spring配置文件的DTD定義--〉
<!DOCTYPE beans PUBLIC"-//SPRiNG//DTDBEAN//EN"
''http://www.springframework.org/dtd/spring-beans.dtd">
<!--Spring配置文件的根元素是beans-->
<beans>
<!--定義數據源,該bean的 ID 爲 dataSource-->
<bean id="dataSource" class="org.springframework.jdbc.
datasource.DriverManagerDataSource"><!…指定數據庫驅動--〉
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<!--指定連接數據庫的URL--〉
<property name="url"><value>jdbc:mysql://wonder:3306/
j2ee</ value></property><!--root 爲數據庫的用戶名…〉
<property name="username"><value>root</value></property><!--pass 爲數據庫密碼--〉
<property name="password"><value>pass</value></property></bean>
<!--定義Hibernate的 SessionFactory-->
<beanid="sessionFactory"class="org.springframework.
orm.hibernate3.LocalSessionFactoryBean">
<!-- 依賴注入數據源,注入正是上文定義的dataSource>
<property name="dataSource"><ref local="dataSource"/>
</property><! --mappingResouces屬性用來列出全部映射文件〉
<property name="mappingResources"><list>
<!--以下用來列出所有的PO 映射文件-->
<value>lee/MyTest.hbm.xml</value></list></property>
<!--定義Hibernate的 SessionFactory的屬性一〉
<property name="hibernateProperties"><props>
<!--指定Hibernate的連接方法一〉
<propkey="hibernate.dialect">org.hibernate.dialect.
MySQLDialect</prop>
<!-- 不同數據庫連接,啓動時選擇create,update, create-drop-->
<prop key="hibernate.hbm2ddl.auto">update</prop></props></property></bean></beans>

(3)SessionFactory由ApplicationContext管理,並隨着應用啓動時自動加載,可以被處於ApplicaionContext管理的任意一個bean引用,比如DAOHibernate的數據庫訪問需要在Session管理下,而SessionFactory是 Session的工廠。 Spring採用依賴注入爲DAO對象注入SessionFactory的引用。

Spring也提供了Hibernate的簡化訪問方式,Spring採用模板設計模式,提供Hibernate訪問與其他持久層訪問的一致性。如果需要使用容器管理的數據源,則無須提供數據驅動等信息,只需要提供數據源的JNDI 即可。對上文的SessionFactory只需將dataSource的配置替換成 JNDI 數據源,並將原有的 dataSource Bean 替換成如下所示:

<!--此處配置 JNDI 數據源--〉
<bean id="myDataSource" class="org.springframework.
jndi.JndiObjectFactoryBean"><property name="jndiName">
<!--指定數據源的JNDI-->
<value>java:comp/env/jdbc/myds</value></property></bean>

 3. 創建 Configuration 實例:
   <bean id="TUserDAO" class="userHib.TUserDAO">//數據庫中的用戶表逆向回來
   <property name="sessionFactory">
   <ref bean="sessionFactory" />
   </property>
   </bean>

創建 Configuration 實例:Configuration用於配置並啓動Hibernate。Hibernate應用通過Configuration的實例來指定對象-關係映射文件,或通過Configuration動態配置Hibernate的屬性,然後通過Configuration來創建相應的SessionFactory實例。

4.創建 Session 實例
 <bean id="wj" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
 <property name="sessionFactory">
 <ref bean="sessionFactory"/>
 </property>
 </bean>

從SessionFactory中可以獲得Session實例。

Session接口是Hibernate應用中使用最廣泛的接口了,它是持久化管理器,提供添加、更新、刪除、加載、查詢對象。Session不是線程安全的,所以應避免多個線程共享同一個Session實例。Session是輕量級對象,它的創建和銷燬不需要太多資源,這意味着在應用中可以經常創建和銷燬Session對象。

Session有一個緩存,稱之爲Hibernate的一級緩存,它存放當前工作單元加載的持久化對象,每個Session都有自己的緩存,緩存中的對象只能被當前工作單元訪問。

5.TUserDAO的代理類
 <bean id="TUserDAOProxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 <property name="proxyTargetClass"><value>true</value></property>

6.Transaction接口(打開事務;開始持久化訪問;提交事務;如果遇到異常,回滾事務; 關閉Session)

Transaction是Hibernate的數據庫事務接口,它對底層道德事務接口進行了封裝,底層事務接口包括:

    JDBC API

    JTA(Java Transaction API)

    CORBA(Common Object Requet Broker Architecture) API

Hibernate應用可以通過一致Transaction接口來聲明事務邊界,這有助於應用可以在不同的環境或容器中移植。具體的事務實現使用在Hibernate.properties中進行指定。


 <property name="transactionManager">
 <ref bean="wj"/>//session實例
 </property>
 <property name="target">//聯繫DAO和代理類
 <ref local="TUserDAO"/></property>
 <property name="transactionAttributes">//使具有什麼功能
 <props>
 <prop key="*">PROPAGATION_REQUIRED</prop>//需要事務支持

<!--    

<prop key="attach*">PROPAGATION_REQUIRED</prop>

<prop key="insert*">PROPAGATION_REQUIRED</prop>   插入

<prop key="save">PROPAGATION_REQUIRED</prop>   保存

<prop key="update*">PROPAGATION_REQUIRED</prop>  更新 

<prop key="merge.*">PROPAGATION_REQUIRED</prop>更新

<prop key="edit*">PROPAGATION_REQUIRED</prop>   

 <prop key="del*">PROPAGATION_REQUIRED</prop>  刪除 

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>   

<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>   

<prop key="disPlay*">PROPAGATION_REQUIRES_NEW</prop>  

<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>

 

  --> 
 </props>
 </property>
 </bean>
 </beans>

7.Query和Criteria接口

這兩個是Hibernate的查詢接口,用於向數據庫查詢對象,以及控制執行查詢的過程。Query實例包裝了一個HQL(Hibernate Query Language)來查詢。Criteria接口完全封裝了基於字符串形式的查詢語句,比Query更面向對象,Criteria更擅長執行動態查詢

二.測試類

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import userHib.TUser;
import userHib.TUserDAO;


public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  ApplicationContext ac=new ClassPathXmlApplicationContext("ApplicationContext.xml");
  TUserDAO td=(TUserDAO)ac.getBean("TUserDAOProxy");
  TUser user=td.findById("2");//查詢
  System.out.print(user.getPassword());
  TUser user1=new TUser();
  user1.setUserId("11");
  user1.setUserName("11");
  user1.setPassword("11");
  td.save(user1);//增加
  TUser user2=td.findById("3");
  td.delete(user2);//刪除
  TUser user3=td.findById("4");
  user3.setUserName("5");
  user3.setPassword("5");
  td.merge(user3);//更改
 }

}


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