• 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

  • 相关阅读:
    Qt简介以及如何配置Qt使用VS2010进行开发
    QT里重定向另外一个控制台程序的输出
    windows下制作PHP扩展
    20款Notepad++插件下载和介绍
    音频编码协议介绍
    用 PHP 读取文件的正确方法
    QT进程间通信
    关于YUV色彩空间
    解析xml 四种
    System.getProperty
  • 原文地址:https://www.cnblogs.com/a757956132/p/4609499.html
Copyright © 2020-2023  润新知