Mybatis 拦截器不做解释了,用过的基本都知道,这里用load data local主要是应对大批量数据的处理,提高性能,也支持事务回滚,且不影响其他的DML操作,当然这个操作不要涉及到当前所load的数据,其中在使用的时候一定要local , 这个命令使用是mysql规定的,否则不加则会认为是服务器本地的文件。这里主要是以流的方式来做处理,这样可以使用内存流,这样就可以避免在某些时候需要生成文件才能导入的多余操作,和IO性能消耗。也可以是应用本地的文件。

注:该做法只试用于存入数据的表,不试用于有频繁更新,查询操作的表。 因为load 命令的优先级比更新命令,及查询命令的优先级低。

mybatis 插件配置

<plugins><plugin interceptor="com.yunat.channel.process.util.LoadDataInterceptor"><property name="databaseType" value="mysql"/></plugin>
</plugins>

插入SQL

<select id="saveTest" parameterType="map">LOAD DATA LOCAL INFILE 'sql.csv' IGNORE INTO TABLE test (a,b,d)
</select>

插件代码

package com.yunat.channel.process.util;import java.io.InputStream;
import java.sql.Statement;
import java.util.Properties;import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;@Intercepts({ @Signature(method = "update", type = StatementHandler.class, args = { Statement.class }) })
public class LoadDataInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {RoutingStatementHandler handler = (RoutingStatementHandler) invocation.getTarget();BoundSql boundSql = handler.getBoundSql();if (boundSql.getSql().toLowerCase().contains("load data local infile")) {Object in = boundSql.getParameterObject();if (in != null && in instanceof InputStream) { // 如果不使用流的方式, 则会读取语句中对应在本地的文件Statement statement = (Statement) invocation.getArgs()[0];if (statement.isWrapperFor(com.mysql.jdbc.Statement.class)) {com.mysql.jdbc.PreparedStatement mysqlStatement = statement.unwrap(com.mysql.jdbc.PreparedStatement.class);// 将流设置到执行语句中,在后续执行过程中,会忽略load data 语句中的文件名,改用当前设置流
                    mysqlStatement.setLocalInfileInputStream((InputStream)in);invocation.getArgs()[0] = mysqlStatement; // 将当前语句执行代理,换成mysql的语句对象,方便下面执行。
                }}}return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}}

本文转自:http://www.oschina.net/code/snippet_144320_24440#66175

转载于:https://www.cnblogs.com/dreammyle/p/5533504.html

Mybatis拦截器 mysql load data local 内存流处理相关推荐

  1. java mysql 文本导入数据语句_Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL...

    Mysql load data的使用 数据库中,最常见的写入数据方式是通过SQL INSERT来写入,另外就是通过备份文件恢复数据库,这种备份文件在MySQL中是SQL脚本,实际上执行的还是在批量IN ...

  2. MySQL Load data local infile蜜罐

    ​MySQL Load data infile是有一个很有意思的功能,最早接触的时候,没有太过在意,后来在安全扫描中,被提示需要关闭local_infile选项(当然,默认该选项就是关闭的,只是安全扫 ...

  3. Mysql load data local命令详解

    1.load data local命令使用方法 不指定字段名 此写法数据文件内字段数必须跟数据库表一致 load data local infile "C:\\test.txt" ...

  4. MySQL的文本导入之load data local

    MySQL的文本导入load data local 数据文件格式: Aeschylus time as he grows old teaches many lessons Alexander Grah ...

  5. MySQL的文本导入load data local

    MySQL的文本导入load data local 数据文件格式: Aeschylus time as he grows old teaches many lessons Alexander Grah ...

  6. mysql load data infile 重写_mysql load data infile 命令的数据导入

    文章介绍了mysql load data infile 命令的数据导入,该方式比直接的insert的效率要高,按照官方的说法是要比insert语句快上20倍,有需要的朋友可参考. 使用方式如下: 代码 ...

  7. MySQL LOAD DATA INFILE 导入 CSV 格式数据

    主要介绍将 Neo4j 数据库中数据全部导入到 MySQL 数据库中,将 Neo4j 数据导出为 CSV 格式数据,然后再将 CSV 格式数据导入到 mysql 中. 前半部分,即 Neo4j 数据导 ...

  8. Mybatis拦截器安全加解密MySQL数据实战

    需求背景 公司为了通过一些金融安全指标(政策问题)和防止数据泄漏,需要对用户敏感数据进行加密,所以在公司项目中所有存储了用户信息的数据库都需要进行数据加密改造.包括Mysql.redis.mongod ...

  9. 万级数据秒级新增到数据库中---java mybatis中使用LOAD DATA LOCAL INFILE

    在linux上使用的Shell命令 [root@java-test ~]# mysql -u**** -p****** databaseName --local-infile=1 -e "L ...

最新文章

  1. 中国溶解浆市场深度调研及投资战略决策报告2022-2028年版
  2. python字典新的定义方式
  3. pycharm在401跑程序需要每个py文件加一句
  4. git个人使用总结 —— idea命令行、撤销commit (未完待续)
  5. centos7 安装mysql php_Centos7 安装mysql与php
  6. 右下角文字如何写_如何提取任意小程序的小程序路径
  7. 机器学习(十)Mean Shift 聚类算法
  8. [蓝桥杯历届试题] 国庆星期日
  9. easy connect无法连接到服务端_故障分析 | 一次因为超过最大连接数的登陆限制
  10. FMS集群的安装和配置
  11. 论保留地址与私有地址
  12. Null check operator used on a null value
  13. 在积分系统中可以设置哪些获取积分方式
  14. 朋友圈加粗字体数字_利用Stylus插件让Chrome有macOS的字体渲染效果
  15. 【樂理】中國古典音樂樂理
  16. 阿拉伯数字转为中文汉字写法
  17. IDEA添加Java类注释模版
  18. 关于 字号、PX像素、PT点数、em、CM厘米、MM毫米之间的换算
  19. CURSOR 的用法
  20. Spring学习笔记(一):初识IOC和DI

热门文章

  1. 伪mac android,Mac,android sdk,monkey压力测试,真机
  2. a=10a=0C语言,C语言基础练习题(含答案)
  3. 不合法的媒体文件 id_注意!伦敦男孩、DKNY、Coach、地素... 这些品牌的服装,抽检不合格...
  4. 太绝了,赠你34张网络知识架构思维导图
  5. 学计算机的要做文档吗,我是如何学习计算机编程的
  6. python写界面进度条程序_Python中如何写控制台进度条的整理
  7. 通过Kubernetes监控探索应用架构,发现预期外的流量
  8. adb安装软件_安卓手表ADB实用工具箱:给你的安卓手表来点不一样的
  9. mysql 查询临时表列名_为什么mysql会缓存被删除的临时表的列名?
  10. 第二章matlab数据及其运算,第2章 MATLAB数据及其运算_习题答案