一、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、完成相應的操作
注解
書寫比較簡單,但是效率低