var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" +
"Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10";
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, connstr)
.UseAutoSyncStructure(true) //自动同步实体结构到数据库
.Build();
[Table(Name = "tb_topic")]
class Topic {
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
批量插入
var items = new List();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
fsql.Insert(items).ExecuteAffrows();
执行SQL如下:
INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`)
VALUES(?Clicks0, ?Title0, ?CreateTime0),
(?Clicks1, ?Title1, ?CreateTime1),
(?Clicks2, ?Title2, ?CreateTime2),
(?Clicks3, ?Title3, ?CreateTime3),
(?Clicks4, ?Title4, ?CreateTime4),
(?Clicks5, ?Title5, ?CreateTime5),
(?Clicks6, ?Title6, ?CreateTime6),
(?Clicks7, ?Title7, ?CreateTime7),
(?Clicks8, ?Title8, ?CreateTime8),
(?Clicks9, ?Title9, ?CreateTime9)
内部设计
当插入大批量数据时,内部采用分割分批执行的逻辑进行。分割规则如下:
数量 | 参数量 | |
---|---|---|
MySql | 5000 | 3000 |
PostgreSQL | 5000 | 3000 |
SqlServer | 1000 | 2100 |
Oracle | 500 | 999 |
Sqlite | 5000 | 999 |
数据:为每批分割的大小,如批量插入 10000 条数据,在 mysql 执行时会分割为两批。
参数量:为每批分割的参数量大小,如批量插入 10000 条数据,每行需要使用 5 个参数化,在 mysql 执行时会分割为每批 3000 / 5。
分割执行后,当外部未提供事务时,内部自开事务,实现插入完整性。
FreeSql 适配了每一种数据类型参数化,和不参数化的使用。批量插入建议关闭参数化功能,使用 .NonoParameter() 进行执行(有关 NoneParameter 在后续文章介绍)。
性能参考
API
方法 | 返回值 | 参数 | 描述 |
---|---|---|---|
AppendData | T1 | IEnumerable | 追加准备插入的实体 | |
ToSql | string | 返回即将执行的SQL语句 | |
ExecuteAffrows | long | 执行SQL语句,返回影响的行数 | |
ExecuteIdentity | long | 执行SQL语句,返回自增值 | |
ExecuteInserted | List |
执行SQL语句,返回插入后的记录 |
系列文章导航
(一)入门
(二)自动迁移实体
(三)实体特性
(四)实体特性 Fluent Api
(五)插入数据
(六)批量插入数据
(七)插入数据时忽略列
(八)插入数据时指定列
(九)删除数据
(十)更新数据
(十一)更新数据 Where
(十二)更新数据时指定列
(十三)更新数据时忽略列
(十四)批量更新数据
(十五)查询数据
(十六)分页查询
(十七)联表查询
(十八)导航属性
(十九)多表查询
(二十)多表查询 WhereCascade
(二十一)查询返回数据
(二十二)Dto 映射查询
(二十三)分组、聚合
(二十四)Linq To Sql 语法使用介绍
(二十五)延时加载
(二十六)贪婪加载 Include、IncludeMany、Dto、ToList
(二十七)将已写好的 SQL 语句,与实体类映射进行二次查询
(二十八)事务
(二十九)Lambda 表达式
(三十)读写分离
(三十一)分区分表
(三十二)Aop
(三十三)CodeFirst 类型映射
(三十四)CodeFirst 迁移说明
(三十五)CodeFirst 自定义特性