一个简易的ORM框架的实现

ORM

ORM---操作数据库---对象关系映射

ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节。只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。

早期数据库操作---ADO.NET

ADO.NET的名称起源于ADO(Active Data Objects),是COM组件库,用于在以往的Mircrosoft技术中访问数据。之所以使用ADO.NET名称,是因为Microsoft希望表明,这是在NET编程环境中优先使用的数据访问接口。

ADO.NET的操作过程

1 连接数据库

2 传递SQL语句

3 数据库执行Sql语句

4 返回执行结果

ADO.NET与ORM的比较

ADO:

  1. 大量的sql语句---业务不同,sql语句不同
  2. 需要根据不同的场景编写不同的代码--- 灵活去编写sql语句 --- 提前优化sql语句 --- 提供高性能的sql语句
  3. 不适合快速开发
  4. 可编程性--- 更加灵活(对于高级开发,全方位发展的)
  5. 高性能---原生---接近于底层

    ORM:
  6. 上手快
  7. 不用关注数据库,不关注sql语句,降低了开发的成本
  8. 关注对象,以对象为核心
  9. 适合快速开发构建
  10. 性能有争议
  11. 生成的sql语句---相对僵化---代码生成器

ORM性能争议

  1. 二次封装---业务的执行,步骤多一些

    2。 映射的过程---必然从类到sql语句变化---类---sql语句---必然会有大量的反射
  2. sql语句僵化---数据库执行有性能损耗

ADO.NET 的增删改查操作

引入我们所需要的nuget包 System.Data.SqlClient

如果我们记不住我们的链接字符串的时候,我们可以通过

连接到我们的数据库,然后通过数据连接中,找到我们所需要的连接字符串

   const string connectString = "Data Source=10.10.33.197;Persist Security Info=True;User ID=sa;Password=********";
using (SqlConnection connection = new SqlConnection(connectString))
{
Console.WriteLine($"状态 {connection.State}");
connection.Open();
Console.WriteLine($"状态 {connection.State}");
connection.Close();
}

增删改查我们主要分为2类

增删改----受影响行数

查询 ----结果集

增加

 SqlCommand sqlCommand = connection.CreateCommand();
string sql = @"INSERT INTO
beauty(id,NAME,sex,borndate,phone,photo,boyfriend_id)
VALUES(13,'唐艺昕','女','1990-4-23','18988888888',NULL,2);
";
sqlCommand.CommandText = sql;
int iret=sqlCommand.ExecuteNonQuery();

查询

使用SqlDataReader来获取结果集

SqlCommand sqlCommand = connection.CreateCommand();
string sql = @" SELECT TOP (1000) [Id]
,[ProductId]
,[CategoryId]
,[Title]
,[Price]
,[Url]
,[ImageUrl]
FROM [AdvancedCustomerDB].[dbo].[Commodity]";
sqlCommand.CommandText = sql;
SqlDataReader sqlDataReader=sqlCommand.ExecuteReader();
while (sqlDataReader.Read())
{
Console.WriteLine(sqlDataReader["Id"]);
Console.WriteLine(sqlDataReader["ProductId"]);
Console.WriteLine(sqlDataReader["CategoryId"]);
Console.WriteLine(sqlDataReader["Title"]);
Console.WriteLine("=======================================");
}

使用SqlDataAdapter获取结果集

       SqlCommand sqlCommand = connection.CreateCommand();
string sql = @" SELECT TOP (1000) [Id]
,[ProductId]
,[CategoryId]
,[Title]
,[Price]
,[Url]
,[ImageUrl]
FROM [AdvancedCustomerDB].[dbo].[Commodity]";
SqlCommand cmd = connection.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.Text;
SqlDataAdapter adptr = new SqlDataAdapter(cmd);
System.Data.DataSet ds = new DataSet();
adptr.Fill(ds, "myds"); DataTable dt = new DataTable();
adptr.Fill(dt);

我们在使用上面的语句的时候就遇到了一个问题,什么问题?

就是sql注入的问题,我们没有防备别人使用SQL语句的情况,那我们如何避免这个问题那?

就是SQL语句的参数化。

SqlCommand sqlCommand = connection.CreateCommand();
string sql = @"INSERT INTO [dbo].[Commodity]
([ProductId]
,[CategoryId]
,[Title]
,[Price]
,[Url]
,[ImageUrl])
VALUES
(@ProductId
,@CategoryId
,@Title
,@Price
,@Url
,@ImageUrl)";
SqlCommand cmd = connection.CreateCommand();
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@ProductId", "12345798"));
cmd.Parameters.Add(new SqlParameter("@CategoryId", "234"));
cmd.Parameters.Add(new SqlParameter("@Title", "高级进阶课程高级进阶课");
cmd.Parameters.Add(new SqlParameter("@Price", "4799.00"));
cmd.Parameters.Add(new SqlParameter("@Url", "zhaoxiedu.net"));
cmd.Parameters.Add(new SqlParameter("@ImageUrl", "zhaoxiedu.net"));
object insertResult = cmd.ExecuteNonQuery();

事务的问题

 using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
//对于业务上来说,可能同时去操作多次数据库表
//要成功--必须要都得成功
//ACID
//原子性
//一致性 --- 要么都成功 只要有一个失败了,都失败了
//隔离性
//持久性
#region 第一个操作
{
string sql = @"Delete [AdvancedCustomerDB].[dbo].[Commodity] where id >@id";
SqlCommand cmd = connection.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@id", 31010));
object deleteResult = cmd.ExecuteNonQuery();
}
#endregion
#region 第二个操作
{
string sql = @"INSERT INTO [dbo].[Commodity]
([ProductId]
,[CategoryId]
,[Title]
,[Price]
,[Url]
,[ImageUrl])
VALUES
(@ProductId
,@CategoryId
,@Title
,@Price
,@Url
,@ImageUrl)";
SqlCommand cmd = connection.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = sql;
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@ProductId", "12345798"));
cmd.Parameters.Add(new SqlParameter("@CategoryId", "234"));
cmd.Parameters.Add(new SqlParameter("@Title", "高级进阶课程高级进阶课");
cmd.Parameters.Add(new SqlParameter("@Price", "4799.00"));
cmd.Parameters.Add(new SqlParameter("@Url", "zhaoxiedu.net"));
cmd.Parameters.Add(new SqlParameter("@ImageUrl", "zhaoxiedu.net"));
object insertResult = cmd.ExecuteNonQuery();
}
#endregion
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback(); //回滚 可以把之前的操作 全部作废
Console.WriteLine(ex.Message);
}
};
}

一个简易的ORM框架的实现(一)的更多相关文章

  1. JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架

    1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...

  2. Summer——从头开始写一个简易的Spring框架

    Summer--从头开始写一个简易的Spring框架                ​ 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...

  3. 从零实现一个简易的jQuery框架之二—核心思路详解

    如何读源码 jQuery整体框架甚是复杂,也不易读懂.但是若想要在前端的路上走得更远.更好,研究分析前端的框架无疑是进阶路上必经之路.但是庞大的源码往往让我们不知道从何处开始下手.在很长的时间里我也被 ...

  4. 用Metaclass实现一个精简的ORM框架

    存档: # -*- coding: utf-8 -*- class Field(object): def __init__(self, name, column_type): self.name = ...

  5. 一个简易的服务框架lsf

    项目地址:https://github.com/jianliu/lsf 主体思路是利用javaassist实现一个代理类,代理java的接口,实现每一个方法,实现的代码是对每个方法的名称.参数构建一个 ...

  6. C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架

    C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...

  7. ORM框架的前世今生

    目录 一.ORM简介二.ORM的工作原理三.ORM的优缺点四.常见的ORM框架 一.ORM简介 ORM(Object Relational Mapping)对象关系映射,一般指持久化数据和实体对象的映 ...

  8. [转帖]ORM框架的前世今生

    ORM框架的前世今生 https://www.cnblogs.com/7tiny/p/9551754.html 目录 一.ORM简介二.ORM的工作原理三.ORM的优缺点四.常见的ORM框架 一.OR ...

  9. Python元类实战,通过元类实现数据库ORM框架

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架. 本文主要是受到了廖雪峰老师Python3入门教程的启 ...

  10. 吉特仓库管理系统-ORM框架的使用

    最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...

随机推荐

  1. Windows 恶意软件数量是 Mac 的 5000 倍,是 Linux 的 36 倍

    AV-TEST 是一个独立的测试机构,他们会根据各种标准对操作系统的防病毒和安全软件进行评估和评级,并将测试结果免费提供给用户,帮助用户选择最适合自己的产品.近日,AV-TEST 联合旗下的威胁情报平 ...

  2. 【算法】C程序超详细的qsort排序函数解释和模拟

    C程序利用冒泡排序的思想模拟实现qsort排序函数 求个赞求个赞求个赞求个赞 谢谢 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之 ...

  3. AES算法:数据传输的安全保障

    在当今数字化时代,数据安全成为了一个非常重要的问题.随着互联网的普及和信息技术的发展,我们需要一种可靠的加密算法来保护我们的敏感数据.Advanced Encryption Standard(AES) ...

  4. Python Rich:美化终端显示效果

    Rich库的功能就像它的名字一样,使Python编程更加丰富(rich),它帮助开发者在控制台(命令行)输出中创建丰富.多彩和具有格式化的文本. 本篇总结了如何使用Rich库让我们的命令行工具更加美观 ...

  5. NC20164 [JSOI2008]最大数MAXNUMBER

    题目链接 题目 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. ...

  6. NC14700 追债之旅

    题目链接 题目 题目描述 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市与城市之间存在道路相连(每条道路都是双向的),经过任意一条道路需要支付费用.小明一开始位于编号为1的城市,欠债人 ...

  7. 金融机构的反洗钱(AML)合规工作和系统建设

    声明 个人原创, 转载需注明来源 https://www.cnblogs.com/milton/p/16252061.html 反洗钱 AML 从国家机器的角度, 集体非法活动, 无论是金融还是非金融 ...

  8. Eclipse搭建Struts2项目

    最近在系统性的学习maven,碰到搭建struts2环境,特此记录一下. 1.创建maven工程 2.添加依赖 pom.xml文件内容如下 <project xmlns="http:/ ...

  9. 机器学习策略篇:详解为什么是ML策略?(Why ML Strategy?)

    为什么是ML策略? 从一个启发性的例子开始讲,假设正在调试的猫分类器,经过一段时间的调整,系统达到了90%准确率,但对的应用程序来说还不够好. 可能有很多想法去改善的系统,比如,可能想去收集更多的训练 ...

  10. win32 - Rendering a Stream示例

    仅供参考 文档: Rendering a Stream 代码示例: #include <cstdio> #include <Windows.h> // Windows mult ...