MyBatis批处理工具类MyBatisBatchHelper.java

该工具类使用mybatis的会话来手动提交事务,从而对批量sql进行控制。事务提交,多条sql执行结果会被更新到数据库,出现异常则回滚。

测试采用的表为oracle数据库scott下的dept表和salgrade表

MyBatisBatchHelper.java

package com.alphajuns.util;

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

/**
 * @ClassName MyBatisBatchHelper
 * @Description MyBatis批处理帮助类
 * @Author AlphaJunS
 * @Date 2020/4/1 19:42
 * @Version 1.0
 */
public class MyBatisBatchHelper {

    private static Logger logger = Logger.getLogger(MyBatisBatchHelper.class);

    /**
     * open session
     * @param sqlSessionFactoryBiz
     * @return
     */
    static public SqlSession openSession(SqlSessionFactory sqlSessionFactoryBiz){
        SqlSession sqlSession = null;
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        String targetEnv = wac.getServletContext().getInitParameter("spring.profiles.default");
        if("dev".equals(targetEnv)){
            sqlSession = sqlSessionFactoryBiz.openSession(ExecutorType.BATCH, false);
        }else{
            sqlSession = sqlSessionFactoryBiz.openSession(ExecutorType.BATCH, true);
        }
        return sqlSession;
    }

    /**
     * commit
     * @param sqlSession
     */
    public static void  commit(SqlSession sqlSession){
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        String targetEnv = wac.getServletContext().getInitParameter("spring.profiles.default");
        try{
            if("dev".equals(targetEnv)){
                sqlSession.commit();
                sqlSession.clearCache();
            }else{
                sqlSession.commit();
            }
        }catch(Exception e){
            if(e.getMessage().contains("自动提交")){
                logger.warn(e.getMessage().substring(0,20));
            }else{
                logger.error("commits error",e);
            }
        }
    }

    /**
     * rollback
     * @param sqlSession
     */
    public static void rollback(SqlSession sqlSession){
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        String targetEnv = wac.getServletContext().getInitParameter("spring.profiles.default");
        try{
            if("dev".equals(targetEnv)){
                sqlSession.rollback();
            }
        }catch(Exception e){
            if(e.getMessage().contains("自动提交")){
                logger.warn(e.getMessage().substring(0,20));
            }else{
                logger.error("rollback error",e);
            }
        }
    }

    /**
     * close
     * @param sqlSession
     */
    public static void close(SqlSession sqlSession){
        WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
        String targetEnv = wac.getServletContext().getInitParameter("spring.profiles.default");
        try{
            if("dev".equals(targetEnv)){
                sqlSession.close();
            }else{
                sqlSession.close();
            }
        }catch(Exception e){
            if(e.getMessage().contains("自动提交")){
                logger.warn(e.getMessage().substring(0,20));
            }else{
                logger.error("close error",e);
            }
        }
    }

}

工具类中需要获取数据源,通过指定Spring Profile来加载数据源。在web.xml中配置服务器初始化参数

web.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:applicationContext-profile.xml</param-value>
    </context-param>
    <!-- 指定服务器启动时加载的Profile -->
    <context-param>
        <param-name>spring.profiles.default</param-name>
        <param-value>dev</param-value>
    </context-param>

spring核心配置文件

applicationContext-profile.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.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 开启注解扫描,管理service和dao -->
    <context:component-scan base-package="com.alphajuns.service.*">
    </context:component-scan>
    <context:component-scan base-package="com.alphajuns.dao">
    </context:component-scan>

    <beans profile="dev">
        <!-- properties file -->
        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:oracle.properties</value>
                </list>
            </property>
        </bean>
        <!-- 配置连接池 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${oracle.driver}"/>
            <property name="jdbcUrl" value="${oracle.url}"/>
            <property name="user" value="${oracle.username}"/>
            <property name="password" value="${oracle.password}"/>
        </bean>
    </beans>

    <beans profile="mysql">
        <!-- properties file -->
        <!--<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <list>
                    <value>classpath:mysql.properties</value>
                </list>
            </property>
        </bean>-->
        <context:property-placeholder location="classpath:mysql.properties"/>
        <!-- 配置连接池 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="${mysql.driver}"/>
            <property name="jdbcUrl" value="${mysql.url}"/>
            <property name="user" value="${mysql.username}"/>
            <property name="password" value="${mysql.password}"/>
        </bean>
    </beans>

    <beans>
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>

        <!-- 把交给IOC管理 SqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
        </bean>

        <!-- 扫描dao接口 -->
        <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.alphajuns.dao"/>
        </bean>

        <!-- 配置Spring的声明式事务管理 -->
        <!-- 配置事务管理器 -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>

        <tx:annotation-driven transaction-manager="transactionManager"/>
    </beans>

</beans>

测试用的service

    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    @Override
    public void mybatisBatch() {
        // 开启会话
        SqlSession sqlSession = MyBatisBatchHelper.openSession(sqlSessionFactory);
        // 获取接口代理对象
        EmpMapper batchEmpMapper = sqlSession.getMapper(EmpMapper.class);
        // 批量操作数据库数据
        try {
            Map<String, String> paramMap = new HashMap<>();
            paramMap.put("DEPTNO", "50");
            paramMap.put("DNAME", "DOCTOR");
            paramMap.put("LOC", "BEIJING");
            // 插入Scott下DEPT表
            batchEmpMapper.insertDept(paramMap);

            // 无异常时,事务提交,数据被更新到数据库
            // 用于模拟异常,捕获异常时,回滚事务,注释打开时,可测试异常,发现前面操作数据库的数据没有被更新到数据库中
            // int i = 1/0;

            Map<String, Integer> map = new HashMap<>();
            map.put("GRADE", 6);
            map.put("LOSAL", 4001);
            map.put("HISAL", 10000);
            // 更新Scott下SALGRADE
            batchEmpMapper.insertSalGrade(map);

            // 提交事务
            MyBatisBatchHelper.commit(sqlSession);
        } catch (Exception e) {
            e.printStackTrace();
            // 回滚事务
            MyBatisBatchHelper.rollback(sqlSession);
        } finally {
            // 关闭会话
            MyBatisBatchHelper.close(sqlSession);
        }
    }

mapper接口

  void insertDept(@Param("paramMap") Map<String, String> paramMap);

  void insertSalGrade(@Param("paramMap") Map<String, Integer> map);

mapper.xml

  <insert id="insertDept" parameterType="map">
        insert into dept (DEPTNO, DNAME, LOC)
        VALUES
        (
            #{paramMap.DEPTNO, jdbcType=INTEGER},
            #{paramMap.DNAME, jdbcType=VARCHAR},
            #{paramMap.LOC, jdbcType=VARCHAR}
        )
    </insert>

    <insert id="insertSalGrade" parameterType="map">
        insert into salgrade (GRADE, LOSAL, HISAL)
        VALUES
        (
            #{paramMap.GRADE, jdbcType=INTEGER},
            #{paramMap.LOSAL, jdbcType=INTEGER},
            #{paramMap.HISAL, jdbcType=INTEGER}
        )
    </insert>

原文地址:https://www.cnblogs.com/alphajuns/p/12630745.html

时间: 2024-11-06 15:18:00

MyBatis批处理工具类MyBatisBatchHelper.java的相关文章

Java字符串转16 进制工具类Hex.java

原文:Java字符串转16 进制工具类Hex.java 源代码下载地址:http://www.zuidaima.com/share/1550463378410496.htm Java 字符串转 16 进制工具类 Hex.java 实现 16进制 0xfecd .. 和 java 字符串之间的互转换! 如果做开发,通常用户登陆密码都会 mad5(salt + pwd) 然后再将 md 之后的数据 hex 一下. 这个工具类,就是实现此效果的. /* * */ package com.zuidaim

java常用工具类(java技术交流群57388149)

package com.itjh.javaUtil; import java.util.ArrayList; import java.util.List; /** * * String工具类. <br> * * @author 宋立君 * @date 2014年06月24日 */ public class StringUtil { private static final int INDEX_NOT_FOUND = -1; private static final String EMPTY =

【工具类】JAVA 以行为单位读取文件并比对

package test20140709; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 以行为单位读取文件并比对,显示不同行 * @author fushihua-wb * @date 2014-7-11 */ pu

UrlUtils工具类,Java URL工具类,Java URL链接工具类

UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年7月15日 http://www.cnblogs.com/fanshuyao/ Java代码   import java.util.Ha

Java日期工具类,Java时间工具类,Java时间格式化

Java日期工具类,Java时间工具类,Java时间格式化 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright  蕃薯耀 2017年2月4日 15:03:27 星期六 http://www.cnblogs.co

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ?Copyright 蕃薯耀 2017年9月13日 http://www.cnblogs.com/fanshuyao/ 直接上代码: import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.ref

Java常用正则表达式验证工具类RegexUtils.java

原文:Java常用正则表达式验证工具类RegexUtils.java 源代码下载地址:http://www.zuidaima.com/share/1550463379442688.htm Java 表单注册常用正则表达式验证工具类,常用正则表达式大集合. 1. 电话号码 2. 邮编 3. QQ 4. E-mail 5. 手机号码 6. URL 7. 是否为数字 8. 是否为中文 9. 身份证 10. 域名 11. IP .... 常用验证应有尽有! 这的确是您从事 web 开发,服务器端表单验证

个人常用工具类:JAVA树形结构工具类01

JAVA树形结构工具类 BaseTreeObj.java /** * 基层树形结构实体类 * 必备属性:id,parentId,childsList */ @Data public class BaseTreeObj implements Serializable { private static final long serialVersionUID = 1L; private String id; private String parentId; private String name; p

验证工具类 - ValidateUtils.java

验证工具类,提供验证email格式.是否ipv4.是否ipv6.是否中文.是否数字.正则表达式验证的方法. 源码如下:(点击下载 - ValidateUtils.java .commons-lang-2.6.jar.httpclient-4.3.3.jar) import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.a