导航

hibernate和spring整合总结

Posted on 2013-08-16 23:10  酷鱼影子  阅读(205)  评论(0编辑  收藏  举报
一、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、完成相应的操作
   注解
      书写比较简单,但是效率低