在上一篇日志中将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.配置事务管理
<!-- spring事务管理 -->  
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">     
  <property name="dataSource" ref="dataSource" />     
  <property name="sessionFactory" ref="sessionFactory" />  
</bean>  
  <!-- 为增删改查的方法声明事务,我这里把事务放到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层的类  
<!-- 注入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层了
 

完整的sping配置文件applicationContext.xml

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 此对象用来读取数据库配置文件jdbc.properties
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>/WEB-INF/jdbc.properties</value>
</property>
</bean> --> <!-- 配置数据源(这里是使用spring默认的数据源,后面会换成c3p0) -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/ssh"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean> <!-- 配置hibernate的会话工厂sessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property> <!-- 数据源采用上面的 -->
<property name="mappingResources"> <!-- 自动扫描model包下的实体类 -->
<list>
<value>/com/scitc/ssh/model/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<!-- <prop key="hibernate.current_session_context_class">thread</prop>-->
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean> <!-- 配置hibernateTemplate 相当于jdbc -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property> <!-- 注入sessionFactory -->
</bean> <!-- spring事务管理 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="dataSource" ref="dataSource" />
<property name="sessionFactory" ref="sessionFactory" />
</bean> <!-- 开启spring的注解 -->
<context:annotation-config /> <!-- 可以不要这个,下面的扫描包可以自动开启注解 --> <!-- 自动扫描services层和dao层的注解 -->
<context:component-scan base-package="com.scitc.ssh.services" />
<context:component-scan base-package="com.scitc.ssh.services.impl" />
<context:component-scan base-package="com.scitc.ssh.dao" />
<context:component-scan base-package="com.scitc.ssh.dao.impl" /> <!-- 声明事务 -->
<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> <!-- 注入dao层需要用hibernateTemplate的类 -->
<bean id="BaseDao" class="com.scitc.ssh.dao.BaseDao">
<!-- 为此类注入一个属性,这样在类中就可以获取到这个对象 -->
<!-- 功能:HibernateTemplate hibernateTemplate = new HibernateTemplate() -->
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean> </beans>
 
 
//数据访问层通用类basedao.java
 package com.scitc.ssh.dao;

 import java.util.List;

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate4.HibernateTemplate; import com.scitc.ssh.model.User; //数据访问层通用类
public class BaseDao { //@Autowired可以自动获取spring创建的对象
@Autowired private HibernateTemplate hibernateTemplate; //这里的属性名一定要和配置中的属性名一致 //返回hibernateTemplate方法
public HibernateTemplate getHibernateTemplate(){
return this.hibernateTemplate;
} public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
} //添加
public boolean add(Object entity){
this.hibernateTemplate.save(entity); //hibernateTemplate.save(entity)保存
return true;
} //删除
public boolean delete(Object entity){
this.hibernateTemplate.delete(entity);
return true;
} //查询全部
@SuppressWarnings("unchecked")
public List<Object> findAll(String queryString){
return (List<Object>) this.hibernateTemplate.find(queryString); } //修改
public boolean update(Object entity){
this.hibernateTemplate.update(entity);
return true; } // //按参数查询
// public List<Object> findAll(String queryString, Object[] args){
// List<Object> list = new ArrayList<Object>();
// this.hibernateTemplate.find(queryString);
// return list;
// } public static void main(String[] args) {
User user = new User();
user.setU_id(1);
user.setU_name("社会你海哥");
//启动spring
ApplicationContext applicationContexts = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取Ioc容器中的对象
BaseDao baseDao = applicationContexts.getBean("BaseDao", BaseDao.class);
// baseDao.add(user);
baseDao.update(user);
// User user2 = (User) baseDao.findAll("from User").get(0);
// baseDao.delete(user);
// System.out.println(user2.getU_name()); } }

sping整合hibernate之二:dao层开发的更多相关文章

  1. 基于Mybatis的Dao层开发

    转自:https://www.cnblogs.com/rodge-run/p/6528398.html 基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建 Sq ...

  2. SSM框架之Mybatis(3)dao层开发

    Mybatis(3)dao层开发 以实现类完成CRUD操作 1.持久层dao层接口的书写 src\main\java\dao\IUserDao.java package dao; import dom ...

  3. mybatis dao 层开发简易版 非整合 spring

    同样老习惯,先上项目结构截图 首先 补充上篇文中缺失的 mysql demo 用的 小脚本 drop database if exists mybatis; CREATE DATABASE `myba ...

  4. (转)MyBatis框架的学习(三)——Dao层开发方法

    http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...

  5. MyBatis开发Dao层的两种方式(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...

  6. 02.MyBatis在DAO层开发使用的Mapper动态代理方式

    在实际开发中,Mybatis作用于DAO层,那么Service层该如何调用Mybatis Mybatis鼓励使用Mapper动态代理的方式 Mapper接口开发方法只需要程序员编写Mapper接口(相 ...

  7. 简单数据库开发之dao层开发

    数据库 dao层是用来与底层数据库连接的一系列代码,它因上层service层调用而调用底层数据库,因为一般的数据库不会只存在一到几张表格,所以必须定义出dao层的接口协议,方便各种表格的操作. dao ...

  8. Mybatis框架三:DAO层开发、Mapper动态代理开发

    这里是最基本的搭建:http://www.cnblogs.com/xuyiqing/p/8600888.html 接下来做到了简单的增删改查:http://www.cnblogs.com/xuyiqi ...

  9. 二 SSH整合:Spring整合Hibernate,无障碍整合&无核心配置整合,Hibernate模版常用方法,

    重建SSH项目 java项目可以直接复制,但是web项目除了改名字还要该配置,如下: 方式一:无障碍整合:带Hibernate配置文件 <?xml version="1.0" ...

随机推荐

  1. C++中string中的erase函数怎么使用

    erase函数的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator p ...

  2. webstorm 激活码

    WebStorm 2016 最新版激活(activation code方式) 注册时,在打开的License Activation窗口中选择“activation code”,在输入框输入下面的注册码 ...

  3. dom对象中的this和event.target区别

    1.this是事件冒泡,动态变化.先触发内部事件,由内到外的执行. <script> function testdiv(val){ console.log(val.id); } funct ...

  4. 计时器chronometer补充

    项目中要实现关于安卓控件chronometer这部分的功能需求: 1.计时器的功能对用户答题时间进行时间统计,用户答完该题,进入下一题,计时器接续上一题的结束时间继续计时: 2.用户可以跳出答题界面, ...

  5. 转化成maven dependencis

    右键工程--->configure--->convert to maven project

  6. UIViewController 之 边框类型

    self.edgesForExtendedLayout = UIRectEdgeNone; 该功能会导致下面的状态栏位置被白边占据一块. 复现如下: Navgation根视图--push -- 下个视 ...

  7. PHP导出MYSQL数据库并压缩

    PHP可以一键导出MYSQL备份文件,并压缩存放,尽管phpMyAdmin有这功能,不过若你自己开发网站或者是为别人写CMS,你不应该要求别人用你程序的时候再去另外用phpMyAdmin备份MYSQL ...

  8. Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误)

    Spring AOP代理时 ClassCastException: $Proxy0 cannot be cast to (类型转换错误) 问题: 今天在用AfterReturningAdvice时,a ...

  9. 【angularjs】【学习心得】路由实战篇

    今天还是来说一下angular中的路由模块.我们实际项目中,各个页面的切换是经常会与Auth相关的.比如我网站的后台,是需要登录过的用户才能进去,那么我们用angularJS做前端路由的时候应该怎么完 ...

  10. BNU Online Judge-34978-汉诺塔

    题目链接 http://www.bnuoj.com/bnuoj/problem_show.php?pid=34978 这题在比赛时AC了不过那时是根据测试数据  抱着来试一下的想法,没想就AC了,其实 ...