手撸ORM浅谈ORM框架之Query篇
快速传送
后续待定。。。。。。
姗姗来迟结尾
最近琐事缠身本应该上周就更新的文章,硬生生的拖到今天。实在抱歉,实在抱歉,实在抱歉!!!近期也不断为自己的职业生涯思考,两条路选择:技术路线?还是管理路线?不仅对自己目前状态进行深刻思考,还计划后面一段时间学习阅读优秀开源项目源码。
从前的少年
在<手撸ORM浅谈ORM框架之Add篇>提过微软提供了 基本原生 SQL 查询可使用 FromSqlRaw 扩展方法基于原始 SQL 查询开始 LINQ 查询, FromSqlRaw 只能在直接位于 DbSet<> 上的查询根上使用;Query基类方法封装时,传入 SELECT COLUMN NAME FROM TABLENAME WHERE id=@id, parameters 或 string.Format("SELECT COLUMN NAME FROM TABLENAME WHERE id=[0]",id) 就遇到了 "Input string was not in a correct format." ,尝试多种参数均以失败告终;被迫最后转战ADO.NET原汁原味实现泛型查询。
ADO.NET食用
(NET程序员必备法器)
- Connection (连接数据库)
- Command (执行T-SQL语句)
- DataAdapter (用户填充DataSet,断开模式)
- DataReader (读取数据库,一种只读模式,只向前的)
- DataSet (数据集,好比电脑的内存)
.NET本质连接数据库,就是ADO.NET连接数据库、读取、删除、修改数据。(ADO.NET详细使用就不在本文赘述,博客园有很多相关优秀的文章)
吃老婆本
BaseRepository-》GetCurrentTableName已经在《手撸ORM浅谈ORM框架之Add篇》BaseRepository里面的方法,不重复搬砖了。
自食其力
封装SqlQuery方法的基础工作是我们需要什么的样的Sql SELECT查询语句,我们先来看看SELECT语句结构: SELECT COLUMN NAME FROM TABLENAME ,以单个简单实体查询的Sql SELECT语句实操;
BaseRepository-》GetQuerySql;
1 /// <summary>
2 /// get query sql
3 /// </summary>
4 /// <returns></returns>
5 private string GetQuerySql()
6 {
7 string tableName = GetCurrentTableName();
8 PropertyInfo[] propertyInfos = typeof(T).GetProperties();
9 StringBuilder stringBuilder = new StringBuilder();
10 foreach (var item in propertyInfos)
11 {
12 stringBuilder.AppendFormat("{0},", item.Name);
13 }
14 return string.Format("SELECT {0} FROM {1} ", stringBuilder.Remove(stringBuilder.Length - 1, 1), tableName);
15 }
ADO.NET xxxSql用来执行查询数据Sql;
1 /// <summary>
2 /// query sql return datatable
3 /// </summary>
4 /// <param name="sql">sql</param>
5 /// <returns></returns>
6 public DataTable ExecuteDataTable(string sql)
7 {
8 using (MySqlConnection connection = new MySqlConnection(connectionString))
9 {
10 DataTable dt = new DataTable();
11 try
12 {
13 connection.Open();
14 MySqlDataAdapter command = new MySqlDataAdapter(sql, connection);
15 command.Fill(dt);
16 }
17 catch (SqlException ex)
18 {
19 throw new Exception(ex.Message);
20 }
21 return dt;
22 }
23 }
BaseRepository-》DataTableToT,DataTable转换当前实体需要的类型(泛型方法);
1 /// <summary>
2 /// datatable to t
3 /// </summary>
4 /// <param name="dataTable">dataTable</param>
5 /// <returns>return t</returns>
6 private T DataTableToT(DataTable dataTable)
7 {
8 var propertyInfos = typeof(T).GetProperties();
9 foreach (DataRow row in dataTable.Rows)
10 {
11 T t = new T();
12 foreach (PropertyInfo p in propertyInfos)
13 {
14 //类型需要做转换bool char
15 if (p.PropertyType.Name == nameof(Boolean))
16 {
17 p.SetValue(t, Convert.ToBoolean(row[p.Name]));
18 }
19 else
20 {
21 p.SetValue(t, row[p.Name] is DBNull ? null : row[p.Name]);
22 }
23 }
24 return t;
25 }
26 return default(T);
27 }
实操BaseRepository-》Get根据id获取实体,主键暂时使用bigint类型id;查询条件使用lambda条件可以增加查询的灵活性(推荐使用这种方法);
1 /// <summary>
2 /// get entity
3 /// </summary>
4 /// <param name="id">id</param>
5 /// <returns>return entity</returns>
6 public T Get(long id)
7 {
8 string sql = string.Format("{0} WHERE {1}={2} LIMIT 1", GetQuerySql(), nameof(id), id);
9 return SqlQuery(sql);
10 //string sql = string.Format("{0} WHERE {1}=@{1}", GetQuerySql(), id);
11 //return SqlQuery(sql, new[] { new MySqlParameter(string.Format("@{0}",id), id) });
12 }
尾声
手撸ORM浅谈ORM框架系列项目简易版ORM并不建议直接放在项目中使用,仅推荐除学习ORM原理需求者。项目中并没有很好地满足常规业务需要,例如:实体导航属性、主子表先后顺序等复杂实体,增删查改均未实现;并且还有很多待优化的地方,例如:缓存的使用、Sql语句的查询优化等等。
获奖感言Finish
自从决定写手撸ORM浅谈ORM框架系列,每一篇都反复的检查和修改,内容尽量提炼通俗易懂,把自己理解的完整的表述出来实属不易。文章中或许还存在不足,词不达意的地方请阅读者多多包涵。注册博客快三年了,毕业转眼间也三年多了,自从2018年1月8号到北京工作已有1039天了,一个普普通的本科毕业未经过培训结构的洗礼,偶尔蹭蹭公开课(最爱大B站: https://www.bilibili.com、博客园: https://www.cnblogs.com、Github: https://github.com),技术是一点一滴的积攒出来的,对有些定义的理解、表达可能有些词不达意,请阅读者多多包涵!
注:learn-orm-net目前只是作为学习ORM框架原理的Demo,项目会做出一定的优化处理,但不能直接拿来在项目中使用,毕竟现在NET Framework、NET Core已经有很多优秀的ORM框架,NET下一次发布就是只有一个版本了,我们没有必要重复造轮子,造轮子是因为没有现成的优秀的轮子可用。
代码下载地址: SourceCode 作者水平有限欢迎园友纠正错误及不恰当之处,予以及时修正以免误导他人!
手撸ORM浅谈ORM框架之Query篇的更多相关文章
- 手撸ORM浅谈ORM框架之基础篇
好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...
- 手撸ORM浅谈ORM框架之Add篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Update篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Delete篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸基于swoole 的分布式框架 实现分布式调用(20)讲
最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...
- 【SSH学习笔记】浅谈SSH框架
说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...
- 浅谈chainer框架
一 chainer基础 Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.The ...
- 浅谈ORM操作
2. ORM(对象关系映射) 1. 映射的关系 DB ORM 数据表 <--> 类 数据行 <--> 对象 字段 <--> 属性 2. Django项目使用MySQ ...
- 【带你手撸Spring】没有哪个框架开发,能离开 Spring 的 FactoryBean!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老司机,你的砖怎么搬的那么快? 是有劲?是技巧?是后门?总之,那个老司机的代码总是可 ...
随机推荐
- Python之路——变量
什么是变量 #变量即变化的量,核心是"变"与"量"二字,变即变化,量即衡量状态. 为什么要有变量 #程序执行的本质就是一系列状态的变化,变是程序执行的直接体现, ...
- 2. 在TCGA中找到并下载意向数据
听说过别人用生信分析"空手套白狼"的故事吧想做吗好想学哦~ 或多或少都知道GEO和TCGA这些公共数据库吧!那么你知道怎么在数据库上找到意向数据,并且成功下载呢?这第一步要难倒一大 ...
- Python+Appium自动化测试(6)-元素等待方法与重新封装元素定位方法
在appium自动化测试脚本运行的过程中,因为网络不稳定.测试机或模拟器卡顿等原因,有时候会出现页面元素加载超时元素定位失败的情况,但实际这又不是bug,只是元素加载较慢,这个时候我们就会使用元素等待 ...
- GIT 保存日志并建立自己的分支
以下是我个人在工作中对git的愚见全是大白话说明.也是我踩坑记录吧,防止下次再次踩坑. 再已有的dev(开发分支)新建自己的分支 (featuer)在更新到gitlab 仓库中的过程. 首先要有大致的 ...
- 【自学编程】C语言编程简单的小程序,计算长方体体积!
计算长方体体积 有朋友会说长方体体积还不好算吗?长X宽X高.没错用计算器一下就可以出结果,编程反而麻烦些,但是我们说的是这种思维,如果复杂的重复运算的话写好程序就非常简单了. 简单运算下一个固定高度的 ...
- docker-阿里云加速
系统版本 centos7 阿里云登录 ->容器镜像服务->镜像加速器 复制下面的直接执行即可 sudo mkdir -p /etc/docker sudo tee /etc/doc ...
- Codeforces Round 665 赛后解题报告(暂A-D)
Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...
- 趣谈多线程(Python版)
温馨提示:本文篇幅较长,建议读者耐心阅读,本文中的代码经过笔者精心构思,可以复制过去运行一下,观察输出结果,所有代码在python3.5.0中测试通过. 文章目录 What is 多线程? Why w ...
- Codeforces Round #427 (Div. 2) E. The penguin's game (交互题,二进制分组)
E. The penguin's game time limit per test: 1 second memory limit per test: 256 megabytes input: stan ...
- Vue 路由模块入门
前端路由 路由是根据不同的 url 展示不同的内容或页面: 前端路由是客户端浏览器可以不依赖服务端,不需要重新请求,可根据不同的URL渲染不同的视图页面 单页面的路由方式有两种: 哈希模式(利用has ...