iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何利用MySqlBulkLoader实现批量插入数据
  • 551
分享到

如何利用MySqlBulkLoader实现批量插入数据

2023-07-02 13:07:23 551人浏览 独家记忆
摘要

这篇文章主要介绍“如何利用MySqlBulkLoader实现批量插入数据”,在日常操作中,相信很多人在如何利用MysqlBulkLoader实现批量插入数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利

这篇文章主要介绍“如何利用MySqlBulkLoader实现批量插入数据”,在日常操作中,相信很多人在如何利用MysqlBulkLoader实现批量插入数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利用mysqlBulkLoader实现批量插入数据”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

介绍

MysqlBulkLoader主要的实现方式:将需要插入的数据转成DataTable,DataTable转成一个CSV文件,将CSV文件使用批量导入的形式导入到数据库里面去。

注意:

1).数据库连接地址需要添加配置AllowLoadLocalInfile=true,允许本地文件导入;

Data Source = 数据库地址; Port = 端口; Initial Catalog = 数据库名; User Id = 用户名; PassWord = 密码;AllowLoadLocalInfile=true;

2).插入的时候会返回插入行数,但是检查所有的数据都正确,也没有报异常,却返回了插入数量为0,可以检查表是否有唯一索引插入的数据是否违反了唯一索引

1.将List转化为DataTable 

/// <summary>        /// 将List转化为DataTable        /// </summary>        /// <returns></returns>        public DataTable ListToDataTable<T>(List<T> data)        {            #region 创建一个DataTable,以实体名称作为DataTable名称            var tableName = typeof(T).Name;            tableName = tableName.ToSnakeCase();             DataTable dt = new DataTable            {                TableName = tableName            };            #endregion            #region 拿取列名,以实体的属性名作为列名                   var properties = typeof(T).GetProperties();            foreach (var item in properties)            {                var curFileName = item.Name;                curFileName = curFileName.ToSnakeCase();                dt.Columns.Add(curFileName);            }            #endregion            #region 列赋值            foreach (var item in data)            {                DataRow dr = dt.NewRow();                var columns = dt.Columns;                var curPropertyList = item.GetType().GetProperties();                foreach (var p in curPropertyList)                {                    var name = p.Name;                    name = name.ToSnakeCase();                    var curValue = p.GetValue(item);                    int i = columns.IndexOf(name);                    dr[i] = curValue;                }                dt.Rows.Add(dr);            }            #endregion              return dt;        }

2.将DataTable转换为标准的CSV文件 

/// <summary>    /// csv扩展    /// </summary>    public static class CSVEx    {        /// <summary>        ///将DataTable转换为标准的CSV文件        /// </summary>        /// <param name="table">数据表</param>        /// <param name="tmpPath">文件地址</param>        /// <returns>返回标准的CSV</returns>        public static void ToCsv(this DataTable table, string tmpPath)        {            //以半角逗号(即,)作分隔符,列为空也要表达其存在。            //列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。            //列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。            StringBuilder sb = new StringBuilder();            DataColumn colum;            foreach (DataRow row in table.Rows)            {                for (int i = 0; i < table.Columns.Count; i++)                {                    Type _datatype = typeof(DateTime);                    colum = table.Columns[i];                    if (i != 0) sb.Append("\t");                    //if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))                    //{                    //    sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");                    //}                    if (colum.DataType == _datatype)                    {                        sb.Append(((DateTime)row[colum]).ToString("yyyy/MM/dd HH:mm:ss"));                    }                    else sb.Append(row[colum].ToString());                }                sb.Append("\r\n");            }            StreamWriter sw = new StreamWriter(tmpPath, false, UTF8Encoding.UTF8);            sw.Write(sb.ToString());            sw.Close();        }    }

3.CSV文件导入数据到数据库

/// <summary>    /// 批量导入mysql帮助类    /// </summary>    public static class MySqlHelper    {        /// <summary>        /// MySqlBulkLoader批量导入        /// </summary>        /// <param name="_mySqlConnection">数据库连接地址</param>        /// <param name="table"></param>        /// <param name="csvName"></param>        /// <returns></returns>        public static int BulkLoad(MySqlConnection _mySqlConnection, DataTable table, string csvName)        {            var columns = table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList();            MySqlBulkLoader bulk = new MySqlBulkLoader(_mySqlConnection)            {                FieldTerminator = "\t",                FieldQuotationCharacter = '"',                EscapeCharacter = '"',                LineTerminator = "\r\n",                FileName = csvName,                NumberOfLinesToSkip = 0,                TableName = table.TableName,            };            bulk.Columns.AddRange(columns);            return bulk.Load();        }    }

4.使用MySqlBulkLoader批量插入数据

/// <summary>        /// 使用MySqlBulkLoader批量插入数据        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="data"></param>        /// <returns></returns>        /// <exception cref="Exception"></exception>        public int BulkLoaderData<T>(List<T> data)        {            if (data.Count <= 0) return 0;            var connectString = "数据库连接地址";            using (MySqlConnection connection = new MySqlConnection(connectString))            {                MySqlTransaction sqlTransaction = null;                try                {                    if (connection.State == ConnectionState.Closed)                    {                        connection.Open();                    }                    sqlTransaction = connection.BeginTransaction();                    var dt = ListToDataTable<T>(data); //将List转成dataTable                    string tmpPath = Path.GetTempFileName();                    dt.ToCsv(tmpPath); //将DataTable转成CSV文件                    var insertCount = MySqlHelper.BulkLoad(connection, dt, tmpPath); //使用MySqlBulkLoader插入数据                    sqlTransaction.Commit();                    try                    {                        if (File.Exists(tmpPath)) File.Delete(tmpPath);                    }                    catch (Exception)                    {                        //删除文件失败                    }                    return insertCount; //返回执行成功的条数                }                catch (Exception e)                {                    if (sqlTransaction != null)                    {                        sqlTransaction.Rollback();                    }                    //执行异常                     throw e;                }            }        }

5.完整的代码

namespace WEBApplication1.BrantchInsert{    /// <summary>    /// 批量插入    /// </summary>    public class BulkLoader    {        /// <summary>        /// 测试批量插入入口        /// </summary>        /// <returns></returns>        public int BrantchDataTest()        {            #region 模拟数据            var data = new List<CrmCouponTestDto>() {                 new CrmCouponTestDto {                     Id=1,                     CouponCode="test001",                     CouponId = 1,                     MemberId=100,                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),                     UsageShopId=0,                     UsageBillNo="",                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),                     Status=0                 },                 new CrmCouponTestDto {                     Id=2,                     CouponCode="test002",                     CouponId = 1,                       MemberId=101,                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),                     UsageTime=Convert.ToDateTime("2022-06-27 14:30:00"),                     UsageShopId=2,                     UsageBillNo="CS202206271430001",                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),                     Status=1                 },                  new CrmCouponTestDto {                     Id=3,                     CouponCode="test003",                     CouponId = 1,                     MemberId=102,                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),                     UsageShopId=0,                     UsageBillNo="",                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),                     Status=0                 },                    new CrmCouponTestDto {                     Id=4,                     CouponCode="test004",                     CouponId = 1,                     MemberId=103,                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),                     UsageShopId=0,                     UsageBillNo="",                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),                     Status=0                 }             };            #endregion            var result = BulkLoaderData<CrmCouponTestDto>(data);            return result;        }        /// <summary>        /// 使用MySqlBulkLoader批量插入数据        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="data"></param>        /// <returns></returns>        /// <exception cref="Exception"></exception>        public int BulkLoaderData<T>(List<T> data)        {            if (data.Count <= 0) return 0;            var connectString = "数据库连接地址";            using (MySqlConnection connection = new MySqlConnection(connectString))            {                MySqlTransaction sqlTransaction = null;                try                {                    if (connection.State == ConnectionState.Closed)                    {                        connection.Open();                    }                    sqlTransaction = connection.BeginTransaction();                    var dt = ListToDataTable<T>(data); //将List转成dataTable                    string tmpPath = Path.GetTempFileName();                    dt.ToCsv(tmpPath); //将DataTable转成CSV文件                    var insertCount = MySqlHelper.BulkLoad(connection, dt, tmpPath); //使用MySqlBulkLoader插入数据                    sqlTransaction.Commit();                    try                    {                        if (File.Exists(tmpPath)) File.Delete(tmpPath);                    }                    catch (Exception)                    {                        //删除文件失败                    }                    return insertCount; //返回执行成功的条数                }                catch (Exception e)                {                    if (sqlTransaction != null)                    {                        sqlTransaction.Rollback();                    }                    //执行异常                     throw e;                }            }        }        /// <summary>        /// 将List转化为DataTable核心方法        /// </summary>        /// <returns></returns>        public DataTable ListToDataTable<T>(List<T> data)        {            #region 创建一个DataTable,以实体名称作为DataTable名称            var tableName = typeof(T).Name;            tableName = tableName.ToSnakeCase();             DataTable dt = new DataTable            {                TableName = tableName            };            #endregion            #region 拿取列名,以实体的属性名作为列名                   var properties = typeof(T).GetProperties();            foreach (var item in properties)            {                var curFileName = item.Name;                curFileName = curFileName.ToSnakeCase();                dt.Columns.Add(curFileName);            }            #endregion            #region 列赋值            foreach (var item in data)            {                DataRow dr = dt.NewRow();                var columns = dt.Columns;                var curPropertyList = item.GetType().GetProperties();                foreach (var p in curPropertyList)                {                    var name = p.Name;                    name = name.ToSnakeCase();                    var curValue = p.GetValue(item);                    int i = columns.IndexOf(name);                    dr[i] = curValue;                }                dt.Rows.Add(dr);            }            #endregion              return dt;        }    }    /// <summary>    /// 批量导入mysql帮助类    /// </summary>    public static class MySqlHelper    {        /// <summary>        /// MySqlBulkLoader批量导入        /// </summary>        /// <param name="_mySqlConnection">数据库连接地址</param>        /// <param name="table"></param>        /// <param name="csvName"></param>        /// <returns></returns>        public static int BulkLoad(MySqlConnection _mySqlConnection, DataTable table, string csvName)        {            var columns = table.Columns.Cast<DataColumn>().Select(colum => colum.ColumnName).ToList();            MySqlBulkLoader bulk = new MySqlBulkLoader(_mySqlConnection)            {                FieldTerminator = "\t",                FieldQuotationCharacter = '"',                EscapeCharacter = '"',                LineTerminator = "\r\n",                FileName = csvName,                NumberOfLinesToSkip = 0,                TableName = table.TableName,            };            bulk.Columns.AddRange(columns);            return bulk.Load();        }    }    /// <summary>    /// csv扩展    /// </summary>    public static class CSVEx    {        /// <summary>        ///将DataTable转换为标准的CSV文件        /// </summary>        /// <param name="table">数据表</param>        /// <param name="tmpPath">文件地址</param>        /// <returns>返回标准的CSV</returns>        public static void ToCsv(this DataTable table, string tmpPath)        {            //以半角逗号(即,)作分隔符,列为空也要表达其存在。            //列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。            //列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。            StringBuilder sb = new StringBuilder();            DataColumn colum;            foreach (DataRow row in table.Rows)            {                for (int i = 0; i < table.Columns.Count; i++)                {                    Type _datatype = typeof(DateTime);                    colum = table.Columns[i];                    if (i != 0) sb.Append("\t");                    //if (colum.DataType == typeof(string) && row[colum].ToString().Contains(","))                    //{                    //    sb.Append("\"" + row[colum].ToString().Replace("\"", "\"\"") + "\"");                    //}                    if (colum.DataType == _datatype)                    {                        sb.Append(((DateTime)row[colum]).ToString("yyyy/MM/dd HH:mm:ss"));                    }                    else sb.Append(row[colum].ToString());                }                sb.Append("\r\n");            }            StreamWriter sw = new StreamWriter(tmpPath, false, UTF8Encoding.UTF8);            sw.Write(sb.ToString());            sw.Close();        }    }    /// <summary>    /// 字符串转化    /// </summary>    public static class StringExtensions    {        /// <summary>        /// 转换为 main_keys_id 这种形式的字符串方式        /// </summary>        public static string ToSnakeCase(this string input)        {            if (string.IsNullOrEmpty(input)) { return input; }            var startUnderscores = Regex.Match(input, @"^_+");            return startUnderscores + Regex.Replace(input, @"([a-z0-9])([A-Z])", "$1_$2").ToLower();        }    }    /// <summary>    /// 实体    /// </summary>    public class CrmCouponTestDto    {        /// <summary>        /// ID        /// </summary>        public long Id { get; set; }        /// <summary>        /// 卡券号        /// </summary>             public string CouponCode { get; set; }        /// <summary>        /// 卡券ID        /// </summary>        public int CouponId { get; set; }        /// <summary>        /// 会员ID        /// </summary>        public int MemberId { get; set; }        /// <summary>        /// 发放时间        /// </summary>           public DateTime IssueTime { get; set; }        /// <summary>        /// 使用时间        /// </summary>              public DateTime UsageTime { get; set; }        /// <summary>        /// 使用店铺ID        /// </summary>              public int UsageShopId { get; set; }        /// <summary>        /// 使用单号        /// </summary>              public string UsageBillNo { get; set; }        /// <summary>        /// 有效开始时间        /// </summary>              public DateTime EffectiveStart { get; set; }        /// <summary>        /// 有效结束时间        /// </summary>              public DateTime EffectiveEnd { get; set; }        /// <summary>        /// 状态        /// CouponStatus 卡券状态:        /// -1:未领用        /// 0:未使用        /// 1:已使用        /// 2:已过期        ///3:已作废        ///4:转赠中        /// </summary>        public Int16 Status { get; set; }    }}

到此,关于“如何利用MySqlBulkLoader实现批量插入数据”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何利用MySqlBulkLoader实现批量插入数据

本文链接: https://www.lsjlt.com/news/342128.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何利用MySqlBulkLoader实现批量插入数据
    这篇文章主要介绍“如何利用MySqlBulkLoader实现批量插入数据”,在日常操作中,相信很多人在如何利用MySqlBulkLoader实现批量插入数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何利...
    99+
    2023-07-02
  • 利用MySqlBulkLoader实现批量插入数据的示例详解
    目录介绍1.将List转化为DataTable 2.将DataTable转换为标准的CSV文件 3.CSV文件导入数据到数据库4.使用MySqlBulkLoade...
    99+
    2024-04-02
  • MyBatis如何实现批量插入数据
    本文小编为大家详细介绍“MyBatis如何实现批量插入数据”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis如何实现批量插入数据”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、SQL实现示例假设我们...
    99+
    2023-07-04
  • java实现批量插入数据
    日常工作或者学习中,可能会遇到批量插入数据的需求,一般情况下数据量少的时候,我们会直接调用批量接口插入数据即可,当数据量特别大时,可能由于数据库限制,插入的数据最多不能超过100条(假如限制100条)...
    99+
    2023-09-03
    java 数据库 oracle
  • 【JDBC】PreparedStatement实现批量插入数据
    题目:【JDBC】PreparedStatement实现批量插入数据 前言: PreparedStatement除了解决Statement的拼串、sql注入问题之外,还可以实现以下操作 Prepare...
    99+
    2023-09-09
    数据库 java mysql
  • sqlite如何批量插入数据
    在SQLite中,可以使用INSERT INTO语句以及UNION ALL语法来批量插入数据。以下是一个示例代码: INSE...
    99+
    2024-04-10
    sqlite
  • MyBatis如何批量插入大量数据
    这篇文章将为大家详细讲解有关MyBatis如何批量插入大量数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题背景:只用MyBatis中foreach进行批量插入数据,一次性插入超过一千条的时候MyBa...
    99+
    2023-06-22
  • SQLServer批量插入数据怎么实现
    在SQL Server中,可以使用以下方法来实现批量插入数据: 使用INSERT INTO VALUES语句来一次性插入多条数据,...
    99+
    2024-04-09
    SQLServer
  • 使用saveOrUpdateBatch实现批量插入更新数据
    saveOrUpdateBatch 是 Hibernate 中的一个方法,可以用来批量插入或更新数据。这个方法的参数是一个 List,里面可以存储多个实体对象。当 Hibernate 执行这个方法时,会检查每个实体对象是否存在主键,如果存在...
    99+
    2023-08-31
    hibernate spring java 后端
  • mysql批量插入BulkCopy如何实现
    这篇文章主要介绍了mysql批量插入BulkCopy如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql批量插入BulkCopy如何实现文章都会有所收获,下面我们一起来看看吧。一、新建项目:SqlS...
    99+
    2023-07-05
  • Java如何实现JDBC批量插入
    本篇内容主要讲解“Java如何实现JDBC批量插入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现JDBC批量插入”吧!一、说明在JDBC中,executeBatch这个方法可以将...
    99+
    2023-07-05
  • SQL批量插入数据
    MS SQL Server数据库批量插入数据的sql语句总结:第一种:insert into tb_NameList(Name,InsertDate,UpdateDate)values('aa',GETDA...
    99+
    2024-04-02
  • java 批量插入数据
    批量插入数据,常见的使用mybatis foreach 插入的方式,原始的方式和批处理 1,常见的mybatis foreach xml insert into CODEINFO (CODE_TYPE, CODE, MEAN, STAT...
    99+
    2023-09-03
    mybatis mysql 批量插入
  • MySql批量插入时如何不重复插入数据
    目录前言一、insert ignore into二、on duplicate key update三、replace into总结前言 Mysql插入不重复的数据,当大数据量的数据需...
    99+
    2024-04-02
  • 如何用Python将数据批量的插入到数据库
    这篇文章给大家介绍如何用Python将数据批量的插入到数据库,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我是一名挣扎在编程链底端的pythoner,工作中既要和数据打交道,也要保持和erp系统,web网站友好的&qu...
    99+
    2023-06-16
  • Java实现百万级数据量向MySQL批量插入
    业务背景: 大数据向mysql表同步百万级数量,我们需要将大数据表里同步过来的数据分别向三张业务表做数据同步,最终将业务表的数据展示给前台进行相关业务操作。 数据量级 大数据表:700w数据量 三张业务表分别需要同步:23w、80w、680...
    99+
    2023-08-25
    mysql java mybatis
  • Django框架如何利用ajax实现批量导入数据功能
    这篇文章给大家分享的是有关Django框架如何利用ajax实现批量导入数据功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下url.py代码:url(r'^workimport/$',...
    99+
    2023-06-08
  • springboot 注解方式批量插入数据的实现
    目录一.使用场景二.实现方法1.mysql表结构2.domain3.mapper4.测试类5.测试结果三.插入效率对比1.批量插入2.一条一条插入一.使用场景 一次请求需要往数据库插...
    99+
    2024-04-02
  • MyBatis实现批量插入数据,多重forEach循环
    目录批量插入数据,多重forEach循环下面是一个实际应用mybatis insert foreach项目场景批量插入数据,多重forEach循环 在业务开发过程中,遇到批量插入时,...
    99+
    2024-04-02
  • gorm 执行原生sql实现批量插入数据
    可以使用 GORM 的 DB 对象来执行原生 SQL 操作,然后结合 SQL 的 INSERT INTO 语句来实现批量插入数据。 以下是一个示例代码,假设我们有一个 users 表,包含 id、na...
    99+
    2023-09-20
    sql 数据库 mysql golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作