快速传送

手撸ORM浅谈ORM框架之基础篇

手撸ORM浅谈ORM框架之Add篇

手撸ORM浅谈ORM框架之Update篇

手撸ORM浅谈ORM框架之Delete篇

手撸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程序员必备法器)

ADO.NET通过ADO.NET DataSet接口提供,包括一些与提供者层进行交互的组件,五大对象分别是:
  • 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篇的更多相关文章

  1. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  2. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  3. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  4. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  5. 手撸基于swoole 的分布式框架 实现分布式调用(20)讲

    最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...

  6. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

  7. 浅谈chainer框架

    一 chainer基础 Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.The ...

  8. 浅谈ORM操作

    2. ORM(对象关系映射) 1. 映射的关系 DB ORM 数据表 <--> 类 数据行 <--> 对象 字段 <--> 属性 2. Django项目使用MySQ ...

  9. 【带你手撸Spring】没有哪个框架开发,能离开 Spring 的 FactoryBean!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老司机,你的砖怎么搬的那么快? 是有劲?是技巧?是后门?总之,那个老司机的代码总是可 ...

随机推荐

  1. Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多

    在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...

  2. PO模式学习笔记

    框架: 1.PO模式应用(测试对象和测试用例分离)(写到简历中) 2.引入ddt 3.深入分层:测试数据分离 4.遵循原则:测试用例的独立性 5.深入分层:元素定位分离 6.框架优化:提取basepa ...

  3. hugo官方相关文档地址

    +++ date="2020-10-17" title="hugo官方相关文档地址" tags=["hugo"] categories=[& ...

  4. golang 爬取百度贴吧绝地求生页面

    package main import ( "github.com/antchfx/htmlquery" "io" "net/http" & ...

  5. C#番外篇-SpinWait

    SpinWait封装常见旋转逻辑.在单处理器计算机上,始终使用 "生成" 而不是 "繁忙等待",在装有超线程技术的 Intel 处理器的计算机上,这有助于防止硬 ...

  6. EF 表中中多次指定了列名解决办法

    这个问题是我们实际开发中遇到过的问题. 可能的原因:数据库在执行数据表迁移的时候,数据表执行成功,最后插入EF数据迁移表__MigrationHistory的时候,没有把所有的命令行完整插入,缺失了一 ...

  7. 前端-jstree 一些常用功能

    最近使用到了jstree(v3.3.4)这个插件(官网:https://www.jstree.com/),在这里记录下我的使用过程的一些技巧和问题. 1. 获取数据 一般实际项目中用到的数据都是aja ...

  8. WinSocket01

    启动windows平台下的Socket 1 #define WIN32_LEAN_AND_MEAN 2 #include<windows.h> 3 #include<WinSock2 ...

  9. vue-cli2.0创建项目步骤

    Vue是近两年来比较火的一个前端框架(渐进式框架吧),与reactjs和angularjs三国鼎立,我不是职业前端,做过Vue,了解了一下React,听说过Angluar.我只能这么说,我来晚了,没经 ...

  10. B. Petya and Divisors 解析(思維)

    Codeforce 111 B. Petya and Divisors 解析(思維) 今天我們來看看CF111B 題目連結 題目 略,請看原題 前言 看了別人的解答就豁然開朗 @copyright p ...