首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
最近改造我之前写的DBHelper总结
返回列表
发新帖
最近改造我之前写的DBHelper总结
[复制链接]
发表于 2022-9-4 18:54:41
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
又是写ORM的博客,但是写其它的类库,我不会啊,只有这个我能写一写,希望大家轻喷
最近修改内容
以前只支持.NET Framework,现在修改为支持.NET Framework、.NET Standard、.NET Core多目标平台
以前工程依赖了具体的
数据库
操作类库,不方便实现支持多目标平台,为此,修改了架构,把Provider移到了工程外
这样改造之后,竟然可以支持任意关系
数据库
,需要编写的Provider,需要实现的
功能
很少,除了创建分页SQL,就没什么了,lambda可以不支持。
写完之后进行
性能
测试,对比EF、Dapper、FreeSql、SqlSugar,发现循环更新和查询,
性能
比较差,为此,我看了Dapper、FreeSql、SqlSugar,实体类赋值相关的源码,发现SqlSugar用的是Emit,Dapper用的是Emit和表达式树,而FreeSql用的是表达式树,而我用的是反射,
性能
自然差一些,不过反射赋值
代码
很简单。经过学习,我用Emit实现了相同的性能,但做更多测试的时候,发现了BUG,于是我去看它们的源码,发现
代码
量都不小,FreeSql的表达式树,居然有2000多行
代码
,SqlSugar也不简单,麻烦的主要是数据类型处理,居然还为SQLite做了单独处理。于是我放弃了,使用反射,性能也只能这样了。
突然想到,我可以把底层用的ADO.NET换成Dapper,一来性能好,二来大家更信任Dapper,这样的话,这个DBHelper实际做的工作就更少了,插入、更新则是把实体类翻译成SQL交给Dapper执行,查询则是把SQL直接交给Dapper执行,当然,分页查询Dapper本身是没有的,我想可能是因为分页SQL,不同的
数据库
写法差异很大,所以Dapper把它交给扩展去做了。看到NuGet上众多的Dapper扩展,我突然感觉,Dapper其实不是一个ORM,它是一个基础设施,就像JdbcTemplate一样。
说干就干,也就花了一天,把底层换成了Dapper,查询性能和FreeSql、SqlSugar一样了,分页查询慢一点,因为我在分页查询里,查了总数,看来这个方法后面需要再优化一下,可是更新还是慢,因为我在更新里,又查了一次数据,然后比对,只更新变化的字段。继续优化,参照FreeSql的Attach,实现了一个AttachOld方法,用到AutoMapper以保证性能,用于把更新前的旧数据存一下,这样修改之后,更新的性能也和FreeSql、SqlSugar一样了,至此,性能问题算是基本解决了。
复制代码
收获
学会了NuGet打包
发布
最近一共发了4个NuGet包
https://www.nuget.org/profiles/s0611163
学会了如何开发支持多目标平台的库
感想
平时工作渐渐以Java为主了,工作中写C#的机会越来越少。Java开源项目太多,加上自己初学,也没有水平写类库,写Java自己只是个调包侠,开源框架源码也看不懂。通过写C#、看C#的开源项目源码,可以练练技术。工作多年,以前从未看过别人写的源码,最近,因为想写好自己的类库,所以看了一点NLog、以及各ORM的源码,学了一点东西。还是很喜欢.NET的,最近把自己写的LogUtil放到Linux系统下跑了跑,算是初步学会了如何把.NET程序跑在Linux系统上。
我看好.NET,期待.NET 8,但愿以后有机会在工作中使用。
复制代码
NuGet地址
非Dapper版
可以支持更多的数据库,Provider需要自己写,不过代码量很小
https://www.nuget.org/packages/sux.DBHelper
Dapper版
.NET Framework 4.6.1及以上
https://www.nuget.org/packages/Dapper.DBHelper
源码地址
Gitee地址
https://gitee.com/s0611163/DBHelper
GitHub地址
https://github.com/0611163/DBHelper
.NET5 .NET6测试源码
https://gitee.com/s0611163/DBHelperCore/tree/dbhelper-test/
回复
使用道具
举报
返回列表
浏览过的版块
DevOps与敏捷开发
运维.售后
物联网
SAAS
SQL-Server
程序人生
数据仓库与分析
.Net
终端安全
雁过留声
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表