MySql的LOAD DATA LOCAL INFILE大批量导入数据到MySQL的实现demo

1.表结构

CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` int(11) NOT NULL,
  `b` bigint(20) unsigned NOT NULL,
  `c` bigint(20) unsigned NOT NULL,
  `d` int(10) unsigned NOT NULL,
  `e` int(10) unsigned NOT NULL,
  `f` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `a_b` (`a`,`b`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.java代码demo

package com.jdbc;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.*;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * LOAD DATA
 * @author seven
 * @since 07.03.2013
 */
public class BulkLoadData2MySQL {

    public static InputStream getTestDataInputStream() {
        StringBuilder builder = new StringBuilder();
        for (int i = 1; i <= 10; i++) {
            for (int j = 0; j <= 10000; j++) {
                builder.append(4);
                builder.append("\t");
                builder.append(4 + 1);
                builder.append("\t");
                builder.append(4 + 2);
                builder.append("\t");
                builder.append(4 + 3);
                builder.append("\t");
                builder.append(4 + 4);
                builder.append("\t");
                builder.append(4 + 5);
                builder.append("\n");
            }
        }
        byte[] bytes = builder.toString().getBytes();
        InputStream is = new ByteArrayInputStream(bytes);
        return is;
    }

    /**
     * load bulk data from InputStream to MySQL
     */
    public int bulkLoadFromInputStream(String loadDataSql,
                                       InputStream dataStream) throws SQLException {
        if (dataStream == null) {
            System.out.println("InputStream is null ,No data is imported");
            return 0;
        }
        Connection conn = getConnection();
        com.mysql.jdbc.PreparedStatement mysqlStatement = null;
        try {
            PreparedStatement statement = conn.prepareStatement(loadDataSql);

            int result = 0;

            if (statement.isWrapperFor(com.mysql.jdbc.Statement.class)) {
                mysqlStatement = statement
                        .unwrap(com.mysql.jdbc.PreparedStatement.class);

                mysqlStatement.setLocalInfileInputStream(dataStream);
                result = mysqlStatement.executeUpdate();
            }
            return result;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return 0;
        } finally {
            release(null, mysqlStatement, conn);
        }
    }

    public static Connection getConnection() {
        //Q1-想想为什么先定义?
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            //1.加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2.获取与数据库的链接
            //端口号:3306  数据库名称:jsp_database
            String url = "jdbc:mysql://192.168.220.132:3306/tag_db_4?serverTimezone=UTC";//链接地址
            String username = "root";//用户名
            String password = "123456";//密码
            conn = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    public static void release(ResultSet rs, Statement st, Connection conn) {
        //6.关闭链接,释放资源
        if (rs != null) {
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (st != null) {
            try {
                st.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        String testSql = "LOAD DATA LOCAL INFILE 'sql.csv' IGNORE INTO TABLE test (a,b,c,d,e,f)";
        InputStream dataStream = getTestDataInputStream();
        BulkLoadData2MySQL dao = new BulkLoadData2MySQL();
        try {
            long beginTime = System.currentTimeMillis();
            int rows = dao.bulkLoadFromInputStream(testSql, dataStream);
            long endTime = System.currentTimeMillis();
            System.out.println("importing " + rows + " rows data into mysql and cost " + (endTime - beginTime) + " ms!");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.exit(1);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的`LOAD DATA LOCAL INFILE`命令中,当导入数据时,MySQL会根据数据文件中的内容来进行数据类型推断。如果数据文件中的某一列被解释为整数类型,而实际上该列包含了字符串数据(如VARCHAR类型),那么MySQL会尝试将该列转换为整数类型。 这种情况下,可能是由于数据文件中的某些行中的数据不符合该列定义的数据类型,导致了自动转换错误。MySQL会根据一些规则进行自动转换,例如将非数字字符转换为0或忽略该行数据。 为了避免这种情况,你可以在`LOAD DATA LOCAL INFILE`命令中明确指定每列的数据类型,而不依赖于自动推断。使用`FIELDS TERMINATED BY`和`LINES TERMINATED BY`来指定字段和行的分隔符,并使用`SET`关键字来指定每列的数据类型。 例如,假设你有一个包含字符串的CSV文件(以逗号分隔),其中一列应该是VARCHAR类型。你可以使用以下命令来导入数据并明确指定数据类型: ```sql LOAD DATA LOCAL INFILE 'data.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (column1, @var1, column3) SET column2 = CAST(@var1 AS VARCHAR(255)); ``` 在上面的命令中,我们使用了一个用户变量`@var1`来临时存储数据,并使用`CAST`函数将其转换为VARCHAR类型,并将其赋给目标列`column2`。 通过明确指定每列的数据类型,你可以确保导入数据时不会发生意外的类型转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值