一、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、完成相应的操作
注解
书写比较简单,但是效率低