天天看點

hibernate和spring整合總結

一、DataSource基礎

1、JdbcTemplate包裝了增删改查方法

Dao類繼承JdbcDaoSupport,可以通過getJdbcTemplate()方法獲得JdbcTemplate,配置的時候需要引入DataSource

Dao類繼承JdbcTemplate,則可以直接使用增删改查,配置的時候需要引入DataSource

2、applicationContext.xml的配置:

<!-- 

引入properties檔案(固定寫法)

-->

<bean

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<value>classpath:jdbc.properties</value>

</property>

</bean>

<bean id="dataSource" destroy-method="close"

class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="${jdbc.driverClassName}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

</bean>

3.1、如果Dao類繼承JdbcDaoSupport,則加重Dao的時候

<bean id="classesDao" class="cn.itheima02.jdbc.dao.ClassesDao">

<property name="dataSource">

<ref bean="dataSource"/>

</property>

</bean>

3.2、Dao類繼承JdbcTemplate

<bean id="classesDao3" class="cn.itheima02.jdbc.dao.ClassesDao3">

<property name="jdbcTemplate">

<ref bean="jdbcTemplate"/>

</property>

</bean>

3.3、進行查詢語句的格式:問題new ClassesRawMapper()不通用

1、獲得對象queryForObject("select * from classes where cid=?", new Object[]{1L}, new ClassesRawMapper());

2、獲得基本類型queryForObject("select cname from classes where cid=?", new Object[]{1L}, new ColumnRawMapper());

2、獲得集合query("select * from classes", new ClassesRawMapper())

二、事務管理器 transaction-manager 

1、導包:

xmlns:tx="http://www.springframework.org/schema/tx"

http://www.springframework.org/schema/tx 

http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

2、詳細:引入DataSource(粘貼)、事務管理器(粘貼)、通知(粘貼)

    dao和service需配、aop的配置(表達式需配,其他固定)

<!-- 

引入DataSource(粘貼)

-->

<bean

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<value>classpath:jdbc.properties</value>

</property>

</bean>

<bean id="dataSource" destroy-method="close"

class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="${jdbc.driverClassName}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

</bean>

<!-- dao和service需配 -->

<bean id="classesDao" class="cn.itheima02.jdbc.transaction.ClassesDaoImpl">

<property name="dataSource">

<ref bean="dataSource"/>

</property>

</bean>

<bean id="classesService" class="cn.itheima02.jdbc.transaction.ClassesServiceImpl">

<property name="classesDao">

<ref bean="classesDao"/>

</property>

</bean>

<!-- 

事務管理器(粘貼)

-->

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource">

<ref bean="dataSource"/>

</property>

</bean>

<!-- 

通知(粘貼)

 transaction-manager 事務管理器  告訴spring容器用什麼技術來啟動事務的

-->

<tx:advice transaction-manager="transactionManager" id="tx">

<tx:attributes>

<!-- 

name

方法的名稱  save*  以save開頭的方法 

propagation

在一個方法中,調用了好幾個方法,而這幾個方法中還存在事務,怎麼樣保證所有的方法在一個事務下運作

read-only

true 隻讀事務

false 讀寫事務

-->

<tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED"

read-only="false"/>

</tx:attributes>

</tx:advice>

<!-- 

aop的配置(表達式需配,其他固定)

 -->

<aop:config>

<aop:pointcut expression="execution(* cn.itheima02.jdbc.transaction.ClassesServiceImpl.*(..))" id="perform"/>

<aop:advisor advice-ref="tx" pointcut-ref="perform"/>

</aop:config>

三、 spring和hibernate結合後的application配置:

<!-- 

1、引入dataSource

-->

<bean

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

<property name="locations">

<value>classpath:jdbc.properties</value>

</property>

</bean>

<bean id="dataSource" destroy-method="close"

class="org.apache.commons.dbcp.BasicDataSource">

<property name="driverClassName" value="${jdbc.driverClassName}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

</bean>

<!-- 2、sessionFactory配置(粘貼,如果hibernate.cfg.xml路徑有變,需改-->

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="configLocation">

<value>classpath:hibernate.cfg.xml</value>

</property>

</bean>

<!-- 

3、程式員寫的東西(配置dao和service)

-->

<bean id="classesDao" class="cn.itheima02.spring.hibernate.dao.ClassesDaoImpl">

<property name="sessionFactory">

<ref bean="sessionFactory"/>

</property>

</bean>

<bean id="classesService" class="cn.itheima02.spring.hibernate.service.ClassesServiceImpl">

<property name="classesDao">

<ref bean="classesDao"/>

</property>

</bean>

<!-- 

4、spring容器做的事情和配置(隻需修改表達式)

-->

<aop:config>

<aop:pointcut expression="execution(* cn.itheima02.spring.hibernate.service.*.*(..))" id="perform"/>

<aop:advisor advice-ref="tx" pointcut-ref="perform"/>

</aop:config> 

<!-- 

5、通知(粘貼)

-->

<tx:advice id="tx" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="save*" read-only="false"/>

</tx:attributes>

</tx:advice>

<!-- 

6、事務管理器(粘貼)

-->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref bean="sessionFactory"/>

</property>

</bean>

四、利用注解實作spring和hibernate結合applicationContext.xml的配置

公共的:事務管理器、sessionFactory,

dao和service,切面和通知都在源碼中實作

<!-- 1、類的掃描器 -->

<context:component-scan base-package="cn.itheima02.spring.hibernate"></context:component-scan>

<!-- 

2、事務的注解解析器

-->

<tx:annotation-driven transaction-manager="transactionManager"/>

<!-- 

3、事務管理器

-->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref bean="sessionFactory"/>

</property>

</bean>

<!-- 

4、sessionFactory

-->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="configLocation">

<value>classpath:hibernate.cfg.xml</value>

</property>

</bean> 

<!-- 

5、hibernateTemplate

-->

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">

<property name="sessionFactory">

<ref bean="sessionFactory"/>

</property>

</bean>

有大改動的:

1、使用注解Dao不能繼承了,應該改為

public class ClassesDaoImpl extends HibernateDaoSupport implements ClassesDao{

public void saveClasses(Classes classes) {

// TODO Auto-generated method stub

this.getHibernateTemplate().save(classes);

}

}

修改後:

@Service(value="classesService")

@Transactional(readOnly=true)

public class ClassesServiceImpl implements ClassesService{

@Resource(name="classesDao")

private ClassesDao classesDao;

@Transactional(readOnly=false)//覆寫類上的事務注解

public void saveClasses(Classes classes) {

// TODO Auto-generated method stub

this.classesDao.saveClasses(classes);

}

}

五、spring與hibernate的xml和注解比較

   xml

      書寫形式比較複雜,但是效率高

      在配置檔案中:

         關于dataSource:

             如果在配置檔案中,引入hibernate.cfg.xml檔案,這個時候,不需要引入dataSource

             如果在配置檔案中,不引入hibernate.cfg.xml檔案,這個時候,引入dataSource

         寫法:

            1、在配置檔案中引入sessionFactory

            2、測試

            3、寫程式員做的事情

                1、寫dao

                2、測試dao

                3、寫service

                4、測試service

                5、aop:config的配置

                     1、切入點表達式

                     2、通知

                          1、事務管理器

                          2、聲明哪些屬性應該采用什麼樣的方式進行處理

                                 隔離機制(預設)  方法的名稱  傳播機制(預設)   事務機制

                6、寫用戶端進行測試:看生成的service對象是否為代理對象

                7、完成相應的操作

   注解

      書寫比較簡單,但是效率低

繼續閱讀