MyBatis+Spring 事务管理

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://kinglixing.blog.51cto.com/3421535/723870

在网上查了MyBatis+Spring的结合,真的是太多太多了,可是没有几个代码是完整的..这两项整合花了我两天时间,终于被我整合完成...其实也很简单,原因:JAR包的问题...

由于Ibatis被改名为MyBatis,所以,网上很多都是有关Ibatis而MyBatis却很少很少...

本文以MyBatis3.0.6 + Spring3.0.6为例结合(一定要这个版本才行):

定义一个实体类:Emp.java

package com.lixing.scm.entity;

public class Emp {
  private String id;
  private String name;
  private String sex;
  private int age;
  private String phone;
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getPhone() {
    return phone;
  }
  public void setPhone(String phone) {
    this.phone = phone;
  }
}

  定义实体内操作接口:EmpMapper.java

package com.lixing.scm.test.mapper;

import java.util.List;
import java.util.Map;

import com.lixing.scm.entity.Emp;

public interface EmpMapper {
  void insertEmp(Emp emp);
  List<Emp> getAllEmp();
  Emp getById(String id);
  void deleteEmp(String id);
  void updateEmp(Map<String,Object> map);
}

  定义实体类操作接口的映射文件:EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lixing.scm.test.mapper.EmpMapper">
  <parameterMap type="com.lixing.scm.entity.Emp" id="parameterMapEmp">
    <parameter property="id"/>
    <parameter property="name"/>
    <parameter property="sex"/>
    <parameter property="age"/>
    <parameter property="phone"/>
  </parameterMap>

  <resultMap type="com.lixing.scm.entity.Emp" id="resultMapEmp">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="sex" column="sex"/>
    <result property="age" column="age"/>
    <result property="phone" column="phone"/>
  </resultMap>

  <insert id="insertEmp" parameterMap="parameterMapEmp">
    INSERT INTO emp(id,name,sex,age,phone)
    VALUES(?,?,?,?,?)
  </insert>
  <select id="getAllEmp"    resultMap="resultMapEmp">
    SELECT * FROM emp
  </select>
  <select id="getById" parameterType="String" resultMap="resultMapEmp">
    SELECT * FROM emp
    WHERE id=#{value}
  </select>
  <delete id="deleteEmp" parameterType="String">
    DELETE FROM emp
    WHERE id=#{value}
  </delete>
  <update id="updateEmp" parameterType="java.util.Map">
    UPDATE emp
    SET name=#{name},sex=#{sex},age=#{age},phone=#{phone}
    WHERE id=#{id}
  </update>
</mapper>

  

Spring3.0.6定义: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:context="http://www.springframework.org/schema/context"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

  <!--    -->
  <context:annotation-config />
  <context:component-scan base-package="com.lixing.scm.test.*" />

  <!-- jdbc.propertis Directory -->
  <bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:jdbc.properties" />
  </bean>

  <bean id="MyDataSource" 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>

  <!-- SqlSessionFactory -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="MyDataSource" />
  </bean>
  <!-- ScanMapperFiles -->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.lixing.scm.test.mapper" />
  </bean>

  <!-- ================================事务相关控制=================================================    -->
  <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="MyDataSource"></property>
    </bean>    

  <tx:advice id="userTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="delete*" propagation="REQUIRED" read-only="false"
                            rollback-for="java.lang.Exception" no-rollback-for="java.lang.RuntimeException"/>
      <tx:method name="insert*" propagation="REQUIRED" read-only="false"
                            rollback-for="java.lang.RuntimeException" />
      <tx:method name="update*" propagation="REQUIRED" read-only="false"
                            rollback-for="java.lang.Exception" />

      <tx:method name="find*" propagation="SUPPORTS"/>
      <tx:method name="get*" propagation="SUPPORTS"/>
      <tx:method name="select*" propagation="SUPPORTS"/>
    </tx:attributes>
  </tx:advice>

  <aop:config>
    <aop:pointcut id="pc" expression="execution(public * com.lixing.scm.test.service.*.*(..))" /> <!--把事务控制在Service层-->
    <aop:advisor pointcut-ref="pc" advice-ref="userTxAdvice" />
  </aop:config>

  <!-- 以下为自定义Bean-->
  <bean id="empDao" class="com.lixing.scm.test.dao.impl.EmpDaoImpl"
    autowire="byName" />
  <bean id="empService" class="com.lixing.scm.test.service.impl.EmpServiceImpl"    autowire="byName"/>
</beans>

  DAO接口:EmpDAO.java

package com.lixing.scm.test.dao;

import java.util.List;
import java.util.Map;

import com.lixing.scm.entity.Emp;

public interface EmpDao {
  void insertEmp(Emp emp);
  List<Emp> getAllEmp();
  Emp getById(String id);
  void deleteEmp(String id);
  void updateEmp(Map<String, Object> map);
}

  DAO接口实现类:EmpDaoImpl.java

package com.lixing.scm.test.dao.impl;

import java.util.List;
import java.util.Map;

import com.lixing.scm.entity.Emp;
import com.lixing.scm.test.dao.EmpDao;
import com.lixing.scm.test.mapper.EmpMapper;

public class EmpDaoImpl implements EmpDao {
  private EmpMapper empMapper;   //在此处注入一个empMapper
						//这个empMapper由 Spring自动生成						//不需要我们自己手工去定义
  @Override
  public void insertEmp(Emp emp) {
    this.empMapper.insertEmp(emp);
    throw new RuntimeException("Error");   //测试抛出RuntimeException							//异常查看数据库是否存在记录
  }

  @Override
  public void deleteEmp(String id) {
    this.empMapper.deleteEmp(id);
  }

  @Override
  public List<Emp> getAllEmp() {
    return this.empMapper.getAllEmp();
  }

  @Override
  public Emp getById(String id) {
    return this.empMapper.getById(id);
  }

  @Override
  public void updateEmp(Map<String, Object> map) {
    this.empMapper.updateEmp(map);
  }

  public EmpMapper getEmpMapper() {
    return empMapper;
  }

  public void setEmpMapper(EmpMapper empMapper) {
    this.empMapper = empMapper;
  }
}

  Service层接口:EmpService.java

package com.lixing.scm.test.service;

import com.lixing.scm.entity.Emp;

public interface EmpService {
  void insertEmp(Emp emp);
}

  Service层接口实现类:EmpServiceImpl.java

package com.lixing.scm.test.service.impl;

import com.lixing.scm.entity.Emp;
import com.lixing.scm.test.dao.EmpDao;
import com.lixing.scm.test.service.EmpService;

public class EmpServiceImpl implements EmpService {
  private EmpDao empDao;

  @Override
  public void insertEmp(Emp emp) {
    empDao.insertEmp(emp);

  }

  public EmpDao getEmpDao() {
    return empDao;
  }

  public void setEmpDao(EmpDao empDao) {
    this.empDao = empDao;
  }
}

  测试类:TestEmpService.java

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lixing.scm.entity.Emp;
import com.lixing.scm.test.service.EmpService;

public class TestEmpService {
  @Test
  public void testTrasaction(){
    Emp emp=new Emp();
    emp.setId("00000003");
    emp.setName("某某某");
    emp.setAge(50);
    emp.setSex("男");
    emp.setPhone("566666");

    ApplicationContext ctx=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    EmpService service=ctx.getBean(EmpService.class);
    service.insertEmp(emp);
  }
}

  本文出自 “李新博客” 博客,请务必保留此出处http://kinglixing.blog.51cto.com/3421535/723870

时间: 2024-12-11 03:31:29

MyBatis+Spring 事务管理的相关文章

spring事务管理学习

spring事务管理学习 spring的事务管理和mysql自己的事务之间的区别 参考很好介绍事务异常回滚的文章 MyBatis+Spring 事务管理 spring中的事务回滚例子 这篇文章讲解了@Transaction注解事务和<tx:tags>方式的声明式事务的优缺点 Spring3核心技术之事务管理机制 这篇文章介绍了spring 事务管理的源码 spring源码分析之——spring 事务管理实现方式 揭开Spring事务处理 一般而言dao层是对单张表进行的操作,而service层

Spring Transaction + MyBatis SqlSession事务管理机制研究学习

线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是涉及Mysql的一些重要参数的配置学习,以及Spring事务管理机制的学习,因为通过观察服务器日志,发现在这两部分的时候耗时比较严重,特别是进行mysql事务提交的时候,项目源码中使用了Spring的声明式事务,即通过@Transactional注解来控制事务的开启与提交,这两天看了一些关于Spring Transaction事务的一些文章,也debug了源码,总算有点

Spring+mybatis中事务管理

spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spring推荐使用TransactionTemplate. 显然声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式.声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持.和编程式事务相比,声明式事务唯一不足地方是,后者的最

spring boot配置mybatis和事务管理

spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spring Boot 启动父依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>

mybatis源码分析(四) mybatis与spring事务管理分析

mybatis源码分析(四) mybatis与spring事务管理分析 一丶从jdbc的角度理解什么是事务 从mysql获取一个连接之后, 默认是自动提交, 即执行完sql之后, 就会提交事务. 这种事务的范围是一条sql语句. 将该连接设置非自动提交, 可以执行多条sql语句, 然后由程序决定是提交事务, 还是回滚事务. 这也是我们常说的事务. Connection connection = dataSource.getConnection(); // connection.setTransa

Spring事务管理--多个ORM框架在使用时的情况分析

公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在这个过程中不断融入了新的东西,比如就项目的持久化这块来说,就用了ibatis.mybatis.hibernate.spring JDBC四种混合的框架.究其原因只能说是历史遗留问题,就不做过多的解释了.但是这么多持久化的框架如何协同工作的,尤其是事务的控制,一个系统中使用如此多的持久化框架是,他们是

mybatis+spring事务

http://www.mybatis.org/spring/zh/transactions.html 第四章 事务 一个使用 MyBatis-Spring 的主要原因是它允许 MyBatis 参与到 Spring 的事务管理中.而 不是给 MyBatis 创建一个新的特定的事务管理器,MyBatis-Spring 利用了存在于 Spring 中的 DataSourceTransactionManager. 一旦 Spring 的 PlatformTransactionManager 配置好了,你

Spring 事务管理详情介绍

一.事务管理介绍 事务是现代数据库理论中的核心概念之一,是逻辑上的一组操作,这组操作要么全都成功,要么全都失败.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交.由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态.分别是:提交事务(调用commit()方法).回滚事务(失败提交-调用rollBack()方法).有如下优点: 1.为不同的事务API提供一致的编程模型,如JTA,JD

SpringMVC+MyBatis整合——事务管理

项目一直没有做事务管理,这几天一直在想着解决这事,今天早上终于解决了.接下来直接上配置步骤. 我们项目采用的基本搭建环境:SpringMVC.MyBatis.Oracle11g.WebLogic10.      Spring事务管理分解了传统的全局事务管理和本地事务管理的劣势,使得在任何环境中都可以使用统一的事务管理模型,你可以写一次代码,然后在不同的环 境从你的代码里面配置不同的事务管理策略,Spring提供两种事务管理策略:一种是声明式事务管理策略,另一种是编程式事务管理策略,这里主要介绍声