MyBatis+Spring 事务管理

在网上查了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);
  }
}

你可能感兴趣的:(事务管理,职场,休闲,MyBatis+Spring)