快速传送

手撸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. Java变量命名前俩个字母仅含有一个大写字母的坑

    背景 前几周在做项目fetch切换,即将HttpUtils调用改成使用Feign调用.大概代码如下: // 原代码 String resultJson = HttpUtil.get(url + &qu ...

  2. 一键同步,紧跟潮流——CODING 现已支持导入 GitHub 仓库

    为方便用户从 GitHub 快速迁移到 CODING 并开始使用,CODING 现已支持导入 GitHub 仓库.免去繁琐步骤,只需简单两步操作即可完成导入,让仓库静默同步,无缝衔接,平滑过渡:同时还 ...

  3. navicat 生成注册码( 仅供学习使用 )

    前言,由于navicat使用比较顺手,刚好前段时间试用期到,又看看了怎么生成注册码,特地记录下使用 . 1.运行 找到 navicat 文件(exe) 2.生成注册文件(报错好,后续会用到) 3.断网 ...

  4. springboot1.5和jpa利用HikariCP实现多数据源的使用

    背景 现在已有一个完整的项目,需要引入一个新的数据源,其实也就是分一些请求到从库上去 技术栈 springboot1.5 (哎,升不动啊) 思路 两个数据源,其中一个设置为主数据源 两个事物管理器,其 ...

  5. HTML常用标签(上)

    HTML常用标签 1. web标准 1.1 web标准的构成 主要包括结构.表现和行为三个方面. 标准 说明 结构 用于对网页元素进行整理和分类(HTML) 表现 用于设置网页元素的外观样式(CSS) ...

  6. c语言版去除源代码注释

    去除代码中注释需要注意下面几点 首先注释有"/*"开始到"*/"结束的多行或单行注释 其次还有"//"这种单行注释 另外还需要注意双引号和单 ...

  7. Jmeter请求之接口串联自动化测试(未完)

    方案一:添加Cookie管理器,把用户的登录状态存在cookie管理器中,类似于浏览器 存储测试结果: 监听器->保存响应到文件,对结果进行存储 文件名前缀:保存到哪个地方前缀是什么D:\tes ...

  8. PO模式学习笔记

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

  9. python面试题-django相关

    1.中间件 中间件一般做认证或批量请求处理,django中的中间件,其实是一个类,在请求和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法, 如请求过来 执行process_re ...

  10. 50种编程语言,一句 “Hello, World”!展现编程语言七十年发展!

    mod confinment { use std::os::raw::{c_char}; extern "C" { pub fn puts(txt: *const c_char); ...