MyBatis+Spring 事务管理

fmms 8年前

在网上查了MyBatis+Spring的结合,真的是太多太多了,可是没有几个代码是完整的..这两项整合花了我两天时间,终于被我整合完成...其实也很简单,原因:JAR包的问题... 由于Ibatis被改名为MyBatis,所以,网上很多都是有关Ibatis而MyBatis却很少很少... 本文以MyBatis3.0.6 + Spring3.0.6为例结合(一定要这个版本才行):
出处:http://kinglixing.blog.51cto.com/3421535/723870

实体类: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);    }  }