您的位置:首页 > 编程语言 > Java开发

hibernate和spring整合总结

2013-08-16 23:10 295 查看
一、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、完成相应的操作

注解

书写比较简单,但是效率低
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: