hisql.net 官网(文档编写中)

HiSql 源码(github) https://github.com/tansar/HiSql

git clone https://github.com/tansar/HiSql.git

HiSql 查询语句教程

数据插入插入

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数据写入教程的更多相关文章

  1. hisql ORM 框架研究(国内第一个支持HANA的ORM框架)

    HiSql 操作说明文档 V1.0 下一代ORM框架 国内第一个支持HANA的ORM框架 hisql源码下载 git clone https://github.com/tansar/HiSql.git ...

  2. Django框架之数据库ORM框架

    首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮 ...

  3. c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比

    c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...

  4. c# sqlsugar,hisql,freesql orm框架全方位性能测试对比 sqlserver 性能测试

    在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行 ...

  5. .NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查)

    一.引言 上一篇.NET ORM框架HiSql实战-第一章-集成HiSql 已经完成了Hisql的引入,本节就把 项目中的菜单管理改成hisql的方式实现. 菜单管理界面如图: 二.修改增删改查相关代 ...

  6. 轻量级.NET CORE ORM框架Insql使用教程

    Insql 国人开发,是一款汲取 Mybatis 优点的.NET ORM 框架.追求简单直观,使用自由灵活等特点. 项目主页:https://rainrcn.github.io/insql 此 ORM ...

  7. Android轻量级ORM框架ActiveAndroid入门教程(转)

    注:没有找到出处,如有侵犯,请告知 开始ActiveAndroid神奇之旅: 在AndroidManifest.xml中我们需要添加这两个 AA_DB_NAME (数据库名称,这个name不能改,但是 ...

  8. Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...

  9. Spring笔记05(Spring JDBC三种数据源和ORM框架的映射)

    1.ORM框架的映射 01.JDBC连接数据库以前的方式代码,并给对象赋值 @Test /** * 以前的方式jdbc */ public void TestJdbc(){ /** * 连接数据库的四 ...

随机推荐

  1. [Java Web 王者归来]读书笔记1

    第一章 Java web 开发概述 1 WEB服务器运行时一直在TCP 80(默认端口)监听, 若使用其他端口在url中需要显示标注端口号(例如:8080) 2 WEB服务器:微软的IIS.Apach ...

  2. 修复 Edge 浏览器 1Password 插件 Ctrl+Shift+X 弹出快捷键失效

    解决方式 在 Edge 浏览器右上角 1Password插件图标上右键,选择设置: 在打开的 1Password 设置页面中,找到快捷键设置环节,默认使用快捷键打开后面为空,点击"在扩展也上 ...

  3. 解决Tensorflow ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray)

    问题描述 在将一个数组送入tensorflow训练时,报错如下: ValueError: Failed to convert a NumPy array to a Tensor (Unsupporte ...

  4. c++模板类的使用,编译的问题

    1,模板类编译的问题 前两天在写代码时,把模板类的声明和分开放在两个文件中了,类似于下面这样: stack.hpp: #ifndef _STACK_HPP #define _STACK_HPP tem ...

  5. Docker从入门到精通(八)——Docker Compose

    恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具. 1.为什么需要 Docker Compose? 官网镇楼:https://www.runoo ...

  6. java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏

    画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图. Graphics常用的画图方法如下: drawLine(): ...

  7. vim 默认配置

    vim ~/.vimrc 然后输入常用的需要用的命令,然后保存,这个每次启动VIM都会自动配置.当然你也可以在VIM里面按":"之后输入如下命令,但是下次启动之后设置就会丢失了. ...

  8. 磁盘分区级文件系统丢失找回 testdisk

    故障修复步骤: 1. 检查磁盘分区级文件系统确实不在: 2. 云主机内部下载testdisk工具修复 yum install testdisk -y 3. 执行命令testdisk /dev/vdc进 ...

  9. FlashFXP链接到服务器上,如果www目录下的文件隐藏

    FlashFXP链接到服务器上,如果www目录下的文件隐藏,那么请按照如下设置,就可以显示隐藏的文件了 [站点]->[站点管理器]->选项,然后按照如下设置:

  10. 🍃【Spring专题】「原理系列」SpringMVC的运行工作原理(补充修订)

    承接相关之前的SpringMVC的框架技术的流程分析 初始化流程(initStrategies) 执行流程 寻找相关HandlerMapping 请求到DispatcherServlet类进行执行相关 ...