hisql orm 框架insert数据写入教程
HiSql 源码(github) https://github.com/tansar/HiSql
git clone https://github.com/tansar/HiSql.git
数据插入插入
HiSql 提供了丰富多样的数据插入方式,通过极致的性能优化目前在常用的ORM中名列前茅
单表数据插入
性能测试结果
| 插入记录数 | hisql(耗时) | sqlsugar(耗时) | freesql(耗时) |
|---|---|---|---|
| 5条 | 0.0107秒 |
0.0312秒 |
0.02675秒 |
| 10条 | 0.0111秒 |
0.0307秒 |
0.0271秒 |
| 50条 | 0.0174秒 |
0.0364秒 |
0.0430秒 |
| 100条 | 0.0281秒 |
0.0472秒 |
0.0922秒 |
| 200条 | 0.0310秒 |
0.0584秒 |
0.2319秒 |
| 500条 | 0.0712秒 |
0.1127秒 |
0.5996秒 |
| 1000条 | 0.1112秒 |
0.1871秒 |
0.8145秒 |
| 10000条 | 1.0440秒 |
1.6415秒 |
5.3671秒 |
| 100000条 | 10.3279秒 |
15.8685秒 |
46.0261秒 |
通过匿名类插入
匿名类的最大优点就是可以不依赖于实体类,不需要为表单独创建一个类,对于需要快速方便快捷的插入数据还是很有用的,插入后如果返回值大于0表示成功,
::: tip
匿句类的字段列名称要与数据库中对应至少要一个字段要对应不然HiSql将会抛出异常
HiSql允许插入的对象列集合大于数据库中的列集合
字段名称忽略大小写
:::
示例HiSql匿名类向表数据写入
int _effect= sqlClient.Insert("HTest01", new { SID =123456, UName ="tansar", Age =25, Salary =1999.9, Descript ="hello world"}).ExecCommand();
如果插入的数据集合大于数据中的列 也可以插入成功,如下所示
//TestColumn 这个列在表HTest01 不存在,如果不存在HiSql底层对数据校验时将会自动忽略它
int _effect= sqlClient.Insert("HTest01", new { SID =123456, UName ="tansar", Age =25, Salary =1999.9, Descript ="hello world",TestColumn="测试"}).ExecCommand();
列的大小写不一致也可以自动识别进行写入
int _effect= sqlClient.Insert("HTest01", new { sid =123456, uname ="tansar", age =25, Salary =1999.9, descript ="hello world" }).ExecCommand();
批量插入匿名类
如果需要向表在插入多条数据请用以下方式
批量写入多少数据没有限制,在HiSql底层是会通过数据大小,列大小自动计算不同的数据库执行数据包大小的最优化方案
List<object> lstdata = new List<object>()
{
new{ sid =123456, UName ="tansar", Age =25, Salary =1999.9, Descript ="hello world"},
new{ sid =123457, UName ="tansar", Age =25, Salary =1999.9, Descript ="hello world"}
};
// 返回大于0表示成功
int _effect4 = sqlClient.Insert("HTest01", lstdata).ExecCommand();
通过字典对象写入
::: tip
字段对象的字段列名称要与数据库中对应至少要一个字段要对应不然HiSql将会抛出异常
HiSql允许插入的对象列集合大于数据库中的列集合
字段名称忽略大小写
当是Dictionary<string, string> 需要加上new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) 才可以忽略大小写
:::
//Dictionary<string, object> 对象写入
int _effect = sqlClient.Insert("HTest01",
new Dictionary<string, object> { { "SID", 123456 },{ "UName","tansar" },{ "Age",25 },{ "Salary",1999.9 },{ "descript","hello world" } }
).ExecCommand();
//Dictionary<string, string> 对象写入
int _effect2 = sqlClient.Insert("HTest01",
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) { { "SID", "123456" }, { "UName", "tansar" }, { "Age", "25" }, { "Salary", "1999.9" }, { "descript", "hello world" } }
).ExecCommand();
如果由前端传入的JSON对象怎样写入?下面就演示一下
通过这个方式就可以将前端传入的JSON数据直接写入到数据表中
string jsondata= "{\"SID\":123456,\"UName\":\"tansar\",\"Age\":25,\"Salary\":1999.9,\"descript\":\"hello world\"}";
var _dicobj = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsondata);
int _effect3 = sqlClient.Insert("HTest01", _dicobj).ExecCommand();
批量字典对象写入
批量通过字典对象数据写入
批量写入多少数据没有限制,在HiSql底层是会通过数据大小,列大小自动计算不同的数据库执行数据包大小的最优化方案
List<Dictionary<string, object>> lstdata = new List<Dictionary<string, object>> {
new Dictionary<string, object> { { "SID", 123456 }, { "UName", "tansar" }, { "Age", 25 }, { "Salary", 1999.9 }, { "descript", "hello world" } },
new Dictionary<string, object> { { "SID", 123457 }, { "UName", "tansar" }, { "Age", 25 }, { "Salary", 1999.9 }, { "descript", "hello world" } }
};
int _effect4 = sqlClient.Insert("HTest01", lstdata).ExecCommand();
通过实体类写入
实体类写入
::: tip
实体类的字段列名称要与数据库中对应至少要一个字段要对应不然HiSql将会抛出异常
HiSql允许插入的对象列集合大于数据库中的列集合
字段名称忽略大小写
:::
int _effect1 = sqlClient.Insert("HTest01", new HTest01 { SID = 123456, UName = "tansar", Age = 25, Salary = 1999, Descript = "hello world" }).ExecCommand();
批量实体数据写入
如以下代码所示
List<HTest01> lstdata = new List<HTest01>()
{
new HTest01 { SID = 123456, UName = "tansar", Age = 25, Salary = 1999, Descript = "hello world" },
new HTest01 { SID = 123457, UName = "tansar", Age = 25, Salary = 1999, Descript = "hello world" }
};
int _effect4 = sqlClient.Insert("HTest01", lstdata).ExecCommand();
多表同时插入
不带事务插入多表
平台我们的业务开发过程中经常一个业务需要同时写入两个表,加上事务控制一个表失败则同时一起滚回,HiSql提供可以同时写两个表的简便操作方法,如下表所示
//同时向表 Hi_Domain 和 Hi_DataElement 插入数据
sqlClient.Insert("Hi_Domain", new { Domain = "TST", DomainDesc = "测试数据类型" })
.Insert("Hi_DataElement", new List<object> {
new { Domain = "TST", ElementValue = "A" } ,
new { Domain = "TST", ElementValue = "B" }
}).ExecCommand();
带事务插入
插入多表张时只要有一张表失败则事务滚回,如下所示
sqlClient.BeginTran();
try
{
sqlClient.Insert("Hi_Domain", new { Domain = "TST", DomainDesc = "测试数据类型" })
.Insert("Hi_DataElement", new List<object> {
new { Domain = "TST", ElementValue = "A" } ,
new { Domain = "TST", ElementValue = "B" }
}).ExecCommand();
sqlClient.CommitTran();
}
catch (Exception E)
{
sqlClient.RollBackTran();
}
插入校验
表检测数据校验
在设计第二范式数据库时经常会把可能重复的数据单独做一种表关联,但是在写入表时为了数据的严谨需要校验一下值在另外一张表中存不存在
如 用一张用户表(HTest01) 该表表结构如下

其中字段UTYP 的值在另外一张表H_UType中做了维护表结构如下

为了演示使用我们向H_UType 中写入三条数据如下所示
//在表中添加用户类型 Modi方法的意思是 如果存在则更新没有则插入
sqlClient.Modi("H_UType", new List<object> {
new { UTYP = "U1", UTypeName = "普通用户" },
new { UTYP = "U2", UTypeName = "中级用户" },
new { UTYP = "U3", UTypeName = "高级用户" }
}).ExecCommand();
正常我们向表HTest01 写入数据时字段UTYP 的值必须要存在于表H_UType中 不然这条数据就是一条不符合逻辑的数据,也可以认为这是条脏数据,在写代码时如果没有做一些校验就有可有把这种数据成功保存到数据库中
HiSql 作者在日常开发过种也经常碰到这种问题,特别是在多业务场景多人团队开发时尤为明显有些开发考虑的全一点就做了校验有些就忽略了,带来系统的Bug的隐患 ,那有没有一种方式可以杜绝这种基本的逻辑错误呢?
Hisql 提供了这个功能,使用过HiSql的用户肯定知道 在初化始了HiSql后会产生四张标准表如下所示
Hi_TabModel
Hi_FieldModel
Hi_Domain
Hi_DataElement
但这里不重点把每张表的作用一一介绍,我们需要实现本篇讲的数据检测只需要修改一下配置表Hi_FieldModel 代码如下
sqlClient.Update("Hi_FieldModel", new { TabName = "HTest01", FieldName = "UTYP", IsRefTab=true,RefTab= "H_UType",RefField="UTYP", RefFields = "UTYP,UTypeName",RefFieldDesc= "类型编码,类型名称",RefWhere="UTYP<>''" }).ExecCommand();
执行以上更新代码就是将表HTest01 的字段UTYP 配置了向该表插入数据时 字段UTYP 的值必须要是在表H_UType 中的字段UTYP 中,那么在向表HTest01 写入数据时HiSql底层将会自动进行校验
可能大家会担心是不是每条数据都会查表校验会不会有性能问题,其实不用担心 HiSql对这些已经做了特殊处理基本上不用担心如果大家感兴趣可以查看一下HiSql的源码
那么我们就试一试向表HTest01插入数据测试一下看
sqlClient.Insert("HTest01", new { SID = "0", UTYP = "U4", UName = "hisql", Age = 36, Salary = 11, Descript = "hisql" }).ExecCommand();
执行以上代码会出现什么情况呢? 是的会抛出异常如下所示

这是HiSql 底层检测完后抛出的异常,以上代码插入的字段UTYP 值U4 不在刚才配置的表H_UType 中,所以这是一种不符合正常业务逻辑的非法数据
修改一下代码
sqlClient.Insert("HTest01", new { SID = "0", UTYP = "U3", UName = "hisql", Age = 36, Salary = 11, Descript = "hisql" }).ExecCommand();
这样就可以正常执行了可以通过HiSql 校验
hisql orm 框架insert数据写入教程的更多相关文章
- hisql ORM 框架研究(国内第一个支持HANA的ORM框架)
HiSql 操作说明文档 V1.0 下一代ORM框架 国内第一个支持HANA的ORM框架 hisql源码下载 git clone https://github.com/tansar/HiSql.git ...
- Django框架之数据库ORM框架
首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮 ...
- c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...
- c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试
在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行 ...
- .NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查)
一.引言 上一篇.NET ORM框架HiSql实战-第一章-集成HiSql 已经完成了Hisql的引入,本节就把 项目中的菜单管理改成hisql的方式实现. 菜单管理界面如图: 二.修改增删改查相关代 ...
- 轻量级.NET CORE ORM框架Insql使用教程
Insql 国人开发,是一款汲取 Mybatis 优点的.NET ORM 框架.追求简单直观,使用自由灵活等特点. 项目主页:https://rainrcn.github.io/insql 此 ORM ...
- Android轻量级ORM框架ActiveAndroid入门教程(转)
注:没有找到出处,如有侵犯,请告知 开始ActiveAndroid神奇之旅: 在AndroidManifest.xml中我们需要添加这两个 AA_DB_NAME (数据库名称,这个name不能改,但是 ...
- Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...
- Spring笔记05(Spring JDBC三种数据源和ORM框架的映射)
1.ORM框架的映射 01.JDBC连接数据库以前的方式代码,并给对象赋值 @Test /** * 以前的方式jdbc */ public void TestJdbc(){ /** * 连接数据库的四 ...
随机推荐
- [BUUCTF]PWN——level4
level4 附件 步骤: 例行检查,32位程序,开启了NX保护 运行一下程序,看看大概的情况 32位ida载入,首先检索程序里的字符串,根据上一步运行看到的字符串进行跳转 输入点在function里 ...
- UVA10976 分数拆分 Fractions Again?! 题解
Content 给定正整数 \(k\),找到所有的正整数 \(x \geqslant y\),使得 \(\frac{1}{k}=\frac{1}{x}+\frac{1}{y}\). 数据范围:\(0& ...
- mysql 连接数过多内存增长过快
mysql连接允许长连接和短链接,但是本身建立连接会有很大开销所以一般连接mysql会使用长连接.但是全部是使用长连接后,可能会出现mysql有时占用内存涨的特别快,这是因为mysql在执行过程中临时 ...
- HTML行内级元素之间的空格问题
HTML行内级元素之间的空格问题 1.为什么元素之间会产生空格? 在编写行内级元素(包括inline-block元素)的代码之间如果有空格(换行),在浏览器上就会显示元素之间有空格. 示例代码如下: ...
- 选课系统V1.0
tree . . ├── bin │ ├── __init__.py │ └── start.py #启动文件 ├── conf │ ├── __init__.py │ └── set ...
- webservice注意事项
1.private static final QName PORT_NAME = new QName("http://server.helloworld.cxf.demo/",&q ...
- 三、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-配置项目并实现IM登录
项目文章索引 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展面板的 ...
- byte数组(byte[])与MultipartFile相互转化
MultipartFile转化为byte数组 byte[] bytes= file.getBytes(); byte数组转化为MultipartFile <dependency> < ...
- 【LeetCode】503. Next Greater Element II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解法 单调递减栈 日期 题目地址:https:/ ...
- 【LeetCode】853. Car Fleet 解题报告(Python)
[LeetCode]853. Car Fleet 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxu ...