在上一篇日志中将hibernate的会话工厂sessionFactory注入到了spring的容器中,但这样还不够,因为hibernate的增删改查是要使用事务机制的, 所以还要在spring中配置事务管理,将hibernate管理事物的权利交给spring,这样,在代码中就无需手动管理事务了。
1.首先在spring中配置一个hibernate的jdbc
//applicationContext.xml(spring配置文件) 当然,在此之前要将实体类映射文件配置在sessionFactory
<!-- 配置hibernateTemplate 相当于jdbc -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
<!-- 注入sessionFactory --> </bean>
2.配置事务管理
2.配置事务管理
<!-- spring事务管理 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="dataSource" ref="dataSource" />
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 为增删改查的方法声明事务,我这里把事务放到dao上的,应该放在service比较好 -->
<!-- 为增删改查的方法声明事务,我这里把事务放到dao上的,应该放在service比较好 -->
<aop:config>
<aop:pointcut id="txServices" expression="execution(* com.scitc.ssh.dao..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txServices"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="create*" propagation="REQUIRED"/> <tx:method name="find*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
3.注入dao层的类
<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="insert*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="create*" propagation="REQUIRED"/> <tx:method name="find*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
3.注入dao层的类
<!-- 注入dao层需要用hibernateTemplate的类 -->
<bean id="BaseDao" class="com.scitc.ssh.dao.BaseDao">
<!-- 为此类注入一个属性,这样在类中就可以获取到这个对象 -->
<!-- 功能:HibernateTemplate hibernateTemplate = new HibernateTemplate() -->
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
4.将事务和数据源,sessionFactory,jdbc,dao层注入这些弄好了之后,就可以写dao层了
4.将事务和数据源,sessionFactory,jdbc,dao层注入这些弄好了之后,就可以写dao层了
完整的sping配置文件applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 7 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 8 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 9 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 11 12 13 <!-- 此对象用来读取数据库配置文件jdbc.properties 14 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 15 <property name="location"> 16 <value>/WEB-INF/jdbc.properties</value> 17 </property> 18 </bean> --> 19 20 <!-- 配置数据源(这里是使用spring默认的数据源,后面会换成c3p0) --> 21 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 22 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 23 <property name="url" value="jdbc:mysql://localhost:3306/ssh"></property> 24 <property name="username" value="root"></property> 25 <property name="password" value="123456"></property> 26 </bean> 27 28 <!-- 配置hibernate的会话工厂sessionFactory--> 29 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 30 <property name="dataSource" ref="dataSource"></property> <!-- 数据源采用上面的 --> 31 <property name="mappingResources"> <!-- 自动扫描model包下的实体类 --> 32 <list> 33 <value>/com/scitc/ssh/model/User.hbm.xml</value> 34 </list> 35 </property> 36 <property name="hibernateProperties"> 37 <props> 38 <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop> 39 <!-- <prop key="hibernate.current_session_context_class">thread</prop>--> 40 <prop key="hibernate.show_sql">true</prop> 41 <prop key="hibernate.format_sql">true</prop> 42 <prop key="hibernate.hbm2ddl.auto">update</prop> 43 </props> 44 </property> 45 </bean> 46 47 <!-- 配置hibernateTemplate 相当于jdbc --> 48 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"> 49 <property name="sessionFactory" ref="sessionFactory"></property> <!-- 注入sessionFactory --> 50 </bean> 51 52 <!-- spring事务管理 --> 53 <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 54 <property name="dataSource" ref="dataSource" /> 55 <property name="sessionFactory" ref="sessionFactory" /> 56 </bean> 57 58 <!-- 开启spring的注解 --> 59 <context:annotation-config /> <!-- 可以不要这个,下面的扫描包可以自动开启注解 --> 60 61 <!-- 自动扫描services层和dao层的注解 --> 62 <context:component-scan base-package="com.scitc.ssh.services" /> 63 <context:component-scan base-package="com.scitc.ssh.services.impl" /> 64 <context:component-scan base-package="com.scitc.ssh.dao" /> 65 <context:component-scan base-package="com.scitc.ssh.dao.impl" /> 66 67 <!-- 声明事务 --> 68 <aop:config> 69 <aop:pointcut id="txServices" expression="execution(* com.scitc.ssh.dao..*.*(..))"/> 70 <aop:advisor advice-ref="txAdvice" pointcut-ref="txServices"/> 71 </aop:config> 72 73 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 74 <tx:attributes> 75 <tx:method name="add*" propagation="REQUIRED"/> 76 <tx:method name="insert*" propagation="REQUIRED"/> 77 <tx:method name="update*" propagation="REQUIRED"/> 78 <tx:method name="delete*" propagation="REQUIRED"/> 79 <tx:method name="create*" propagation="REQUIRED"/> 80 <tx:method name="find*" propagation="REQUIRED"/> 81 </tx:attributes> 82 </tx:advice> 83 84 <!-- 注入dao层需要用hibernateTemplate的类 --> 85 <bean id="BaseDao" class="com.scitc.ssh.dao.BaseDao"> 86 <!-- 为此类注入一个属性,这样在类中就可以获取到这个对象 --> 87 <!-- 功能:HibernateTemplate hibernateTemplate = new HibernateTemplate() --> 88 <property name="hibernateTemplate" ref="hibernateTemplate"></property> 89 </bean> 90 91 </beans>
//数据访问层通用类basedao.java
1 package com.scitc.ssh.dao; 2 3 4 import java.util.List; 5 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.context.ApplicationContext; 8 import org.springframework.context.support.ClassPathXmlApplicationContext; 9 import org.springframework.orm.hibernate4.HibernateTemplate; 10 11 12 import com.scitc.ssh.model.User; 13 14 //数据访问层通用类 15 public class BaseDao { 16 17 //@Autowired可以自动获取spring创建的对象 18 @Autowired private HibernateTemplate hibernateTemplate; //这里的属性名一定要和配置中的属性名一致 19 20 //返回hibernateTemplate方法 21 public HibernateTemplate getHibernateTemplate(){ 22 return this.hibernateTemplate; 23 } 24 25 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { 26 this.hibernateTemplate = hibernateTemplate; 27 } 28 29 //添加 30 public boolean add(Object entity){ 31 this.hibernateTemplate.save(entity); //hibernateTemplate.save(entity)保存 32 return true; 33 } 34 35 //删除 36 public boolean delete(Object entity){ 37 this.hibernateTemplate.delete(entity); 38 return true; 39 } 40 41 //查询全部 42 @SuppressWarnings("unchecked") 43 public List<Object> findAll(String queryString){ 44 return (List<Object>) this.hibernateTemplate.find(queryString); 45 46 } 47 48 //修改 49 public boolean update(Object entity){ 50 this.hibernateTemplate.update(entity); 51 return true; 52 53 } 54 55 // //按参数查询 56 // public List<Object> findAll(String queryString, Object[] args){ 57 // List<Object> list = new ArrayList<Object>(); 58 // this.hibernateTemplate.find(queryString); 59 // return list; 60 // } 61 62 public static void main(String[] args) { 63 User user = new User(); 64 user.setU_id(1); 65 user.setU_name("社会你海哥"); 66 //启动spring 67 ApplicationContext applicationContexts = new ClassPathXmlApplicationContext("applicationContext.xml"); 68 //获取Ioc容器中的对象 69 BaseDao baseDao = applicationContexts.getBean("BaseDao", BaseDao.class); 70 // baseDao.add(user); 71 baseDao.update(user); 72 // User user2 = (User) baseDao.findAll("from User").get(0); 73 // baseDao.delete(user); 74 // System.out.println(user2.getU_name()); 75 76 } 77 78 }