注意:先添加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);//更改
}
}