返回顶部
首页 > 资讯 > 数据库 >如何利用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://lsjlt.com/news/342128.html(转载时请注明来源链接)

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

猜你喜欢
  • 如何利用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 后端
  • Java如何实现JDBC批量插入
    本篇内容主要讲解“Java如何实现JDBC批量插入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java如何实现JDBC批量插入”吧!一、说明在JDBC中,executeBatch这个方法可以将...
    99+
    2023-07-05
  • mysql批量插入BulkCopy如何实现
    这篇文章主要介绍了mysql批量插入BulkCopy如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql批量插入BulkCopy如何实现文章都会有所收获,下面我们一起来看看吧。一、新建项目:SqlS...
    99+
    2023-07-05
  • Elasticsearch批量插入数据
    Elasticsearch批量插入数据 使用bulk批量操作数据库 1. 创建批量操作文件 格式: {"index":{"_index":"home","_type":"home",""_id":"2"}}...
    99+
    2024-04-02
  • 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
  • 如何批量向表中插入数据?
    我相信对于oracle初学者来说,当遇到领导说将成千上万条的数据插入到表中的时候会很抓狂。当时我是将几十条数据插入到表中,我是insert into一句句插入进去了,执行了几十遍我就已经疯了,后来发现可以批...
    99+
    2024-04-02
  • python数据库批量插入数据的实现(executemany的使用)
    正常情况下往数据库多张表中批量插入1000条数据,若一条一条insert插入,则调用sql语句查询插入需要执行几千次,花费时间长 现使用cursor.executemany(sql,args) ,可对数据进行批量插...
    99+
    2022-06-02
    python数据库批量插入 python 批量插入
  • 如何用Python将数据批量的插入到数据库
    这篇文章给大家介绍如何用Python将数据批量的插入到数据库,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我是一名挣扎在编程链底端的pythoner,工作中既要和数据打交道,也要保持和erp系统,web网站友好的&qu...
    99+
    2023-06-16
  • Django框架如何利用ajax实现批量导入数据功能
    这篇文章给大家分享的是有关Django框架如何利用ajax实现批量导入数据功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下url.py代码:url(r'^workimport/$',...
    99+
    2023-06-08
  • Java实现百万级数据量向MySQL批量插入
    业务背景: 大数据向mysql表同步百万级数量,我们需要将大数据表里同步过来的数据分别向三张业务表做数据同步,最终将业务表的数据展示给前台进行相关业务操作。 数据量级 大数据表:700w数据量 三张业务表分别需要同步:23w、80w、680...
    99+
    2023-08-25
    mysql java mybatis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作