广告
返回顶部
首页 > 资讯 > 后端开发 > Python >ADO.NET与ORM的比较(3)Lin
  • 773
分享到

ADO.NET与ORM的比较(3)Lin

NETADOLin 2023-01-31 07:01:46 773人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的ssh就是spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具

说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的ssh就是spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具来操作数据。在.net中操作数据库的方式有多种,除了最直接的方式就是使用ADO.NET之外,还可以使用NHibernate这个Hibernate在.NET中的实现ORM,如果你对第三方的ORM持怀疑态度,你还可以使用来自微软的实现、根正苗红的Linq或者EntityFramework。
 大部分从早期就开始使用.NET开发的程序员可能对ADO.NET有种迷恋,使用ADO.NET可以充分将我们早期的sql知识发挥得淋漓尽致,并且出于对性能的考虑,有些人对.NET中的ORM还保持一种观望态度,包括我自己也是这种态度。不过即使在实际开发中不用,并不代表我们不能去了解和比较这些技术,任何事物的出现和消亡总有其原因的,我们可以了解它们的优点和长处。所以本人抽出了几个周末的时间分别用ADO.NET、NHibernate、Linq和EntityFramework来实现对数据库单表数据的创建、读取、更新和删除操作,也就是所谓的CRUD(C:Create/R:Read/U:Update/D:Delete)。
 通过实现相同功能的比较,大家自己判断那种方式更适合自己。需要说明的是,如果在VS2008中使用EntityFramework就需要安装VS2008SP1。
 语言集成查询 (LINQ) 是 Visual Studio 2008 中的一组功能,可为 C# 和 Visual Basic 语言语法提供强大的查询功能。LINQ 引入了标准的、易于学习的查询和更新数据模式,可以对其技术进行扩展以支持几乎任何类型的数据存储。Visual Studio 2008 包含 LINQ 提供程序的程序集,这些程序集支持将 LINQ 与 .NET Framework 集合SQL Server 数据库、ADO.NET 数据集和 XML 文档一起使用。
 在本篇讲述利用Linq实现对数据库的CRUD功能,也就是Linq to SQL,需要说明的是Linq to SQL只支持SQL Server数据库,Linq to SQL只是Linq的一部分功能。
 用Linq to SQL来操作数据库确实比使用NHibernate在操作上要方便得多,通过下面的操作读者也会体会得到,毕竟这个是微软官方的东东,微微支持的力度自然要大些。
 一、准备
 首先,向项目中添加Linq To SQL的类,如下图所示:
 
 在名称一栏中填写较友好的名字之后,然后项目中就会增加一个后缀为dbml的文件,双击这个文件就会进入设计视图,如下图所示:
 
 在服务器资源管理中找到相应的数据库连接,依次点开之后就可以将数据库中的表拖到dbml设计器上。如果读者界面上没有服务器资源管理器可以使用CTRL+ALT+S组合键将其调出来。如果没有数据库连接,可以按照下面的步骤进行,在服务器资源管理器中的“数据连接”——“添加连接”,出现如下界面:
 
 
 在上面的界面中依次填写好数据库、用户名和密码及要连接的库名之后,点击确定,这样在服务器资源管理器中就增加了一个数据库连接,展开之后如下图所示:
 
 拖拽一个表到dbml上就会自动生成这个表的实体类,如下图所示:
 
 也许有人会思考这个类的定义在哪里,可以告诉你的是这个类的定义在这个dbml文件对应的cs文件中(dbml文件名.designer.cs这种形式),如下图所示:
 
 有些这些之后我们就可以动手编码实现对数据库进行CRUD操作了。
 二、编码
 由于在dbml文件中已经存在了DataContext和UserInfo表对应的UserInfo实体类,所以我们仅仅需要编写对数据库操作的类就可以了。编写的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data.Linq;
using System.Configuration;
    
namespace LinqDemo
{
         /// <summary>
         /// 说明:这个类是为了演示.NET中的Linq to SQL的用法
         /// 作者:周公(周金桥)
         /// 日期:2010-03-01
         /// </summary>
         public class LinqCRUD
         {
                 /// <summary>
                 /// 统计用户总数
                 /// </summary>
                 /// <returns></returns>
                 public int Count()
                 {
方法一#region 方法一
                         //使用SqlConnection来实例化DataContext对象
                         SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["LinqDemo.Properties.Settings.AspNetStudyConnectionString"].ConnectionString);
                         DataContext context = new DataContext(connection);
                         IEnumerable<int> collection = context.ExecuteQuery<int>("select count(1) from UserInfo");
                         int count = collection.ElementAt<int>(0);
                         return count;
                         #endregion
    
方法二#region 方法二
                         //UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         ////return context.UserInfo.Count<UserInfo>(item => item.Age > 23);//带条件统计
                         //return context.UserInfo.Count<UserInfo>();
                         #endregion
                 }
                 /// <summary>
                 /// 创建用户
                 /// </summary>
                 /// <param name="info">用户实体</param>
                 /// <returns></returns>
                 public void Create(UserInfo info)
                 {
                         UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         context.UserInfo.InsertOnSubmit(info);
                         context.SubmitChanges();
                 }
                 /// <summary>
                 /// 读取用户信息
                 /// </summary>
                 /// <param name="userId">用户编号</param>
                 /// <returns></returns>
                 public UserInfo Read(int userId)
                 {
                         UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         context.Log = Console.Out;
                         var query = from item in context.UserInfo
                                                 where item.UserID == userId
                                                 select item;
                         return query.First<UserInfo>();
                 }
                 /// <summary>
                 /// 更新用户信息
                 /// </summary>
                 /// <param name="info">用户实体</param>
                 /// <returns></returns>
                 public void Update(UserInfo info)
                 {
                         UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         UserInfo ui = context.UserInfo.First<UserInfo>(item => item.UserID == info.UserID);
                         ui.Age = info.Age;
                         ui.Email = info.Email;
                         ui.Mobile = info.Mobile;
                         ui.Phone = info.Phone;
                         ui.RealName = info.RealName;
                         ui.Sex = info.Sex;
                         ui.UserName = info.UserName;
                         context.SubmitChanges();
                 }
                 /// <summary>
                 /// 删除用户
                 /// </summary>
                 /// <param name="userId">用户编号</param>
                 /// <returns></returns>
                 public void Delete(int userId)
                 {
方法一#region 方法一
                         //UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         //context.ExecuteCommand("delete from UserInfo where UserId=" + userId);
                         #endregion
方法二#region 方法二
                         UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         UserInfo ui = context.UserInfo.First<UserInfo>(item => item.UserID == userId);
                         context.UserInfo.DeleteOnSubmit(ui);
                         context.SubmitChanges();
                         #endregion
                 }
    
                 /// <summary>
                 /// 删除用户
                 /// </summary>
                 /// <param name="userId">用户实体</param>
                 /// <returns></returns>
                 public void Delete(UserInfo info)
                 {
                         UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         var userList = from Users    
                                                            in context.UserInfo
                                                            where Users.UserID == info.UserID    
                                                            select Users;
                         foreach (var user in userList)
                         {
                                 context.UserInfo.DeleteOnSubmit(user);
                         }
                         //context.UserInfo.DeleteOnSubmit(userList.First<UserInfo>());
                         //注意下面的写法是错误的
                        // context.UserInfo.DeleteOnSubmit(info);
                         context.SubmitChanges();
                 }
    
                 /// <summary>
                 /// 获取用户表中编号最大的用户
                 /// </summary>
                 /// <returns></returns>
                 public int GetMaxUserId()
                 {
                         UserInfoDataClassesDataContext context = new UserInfoDataClassesDataContext();
                         int userId=context.UserInfo.Max<UserInfo>(item => item.UserID);
                         return userId;
                 }
         }
}
 说明,在上面的代码中每个方法的第一句都是实例化一个叫UserInfoDataClassesDataContext的类,这个类我们并没有编写,但是奇怪的是上面的代码居然能编译通过,这是为什么呢?原来秘密还是在那个dbml文件中,这个类在dbml的设计文件中的定义如下:
[System.Data.Linq.Mapping.DatabaseAttribute(Name="AspNetStudy")]
public partial class UserInfoDataClassesDataContext : System.Data.Linq.DataContext
{
//.....省略其它代码
}

 可以看出UserInfoDataClassesDataContext是继承DataContext的,这个DataContext在MSDN中的定义为:
 DataContext 是通过数据库连接映射的所有实体的源。它会跟踪您对所有检索到的实体所做的更改,并且保留一个“标识缓存”,该缓存确保使用同一对象实例表示多次检索到的实体。
 也就是我们用DataContext来与数据库进行交互,DataContext会根据上下文环境来决定如何与数据库交互,正因为如此,所以我们用Linq to SQL的代码才如此简单!
 三、单元测试代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using LinqDemo;
    
namespace NUnitTest
{
         [TestFixture]
         public class LinQtest
         {
                 private LinqCRUD instance = null;
                 [SetUp]
                 public void Initialize()
                 {
                         instance = new LinqCRUD();
                 }
                 [Test]
                 /// <summary>
                 /// 统计用户总数
                 /// </summary>
                 /// <returns></returns>
                 public void Count()
                 {
                         Assert.Greater(instance.Count(), 0);
                 }
                 [Test]
                 /// <summary>
                 /// 创建用户
                 /// </summary>
                 /// <param name="info">用户实体</param>
                 /// <returns></returns>
                 public void Create()
                 {
                         UserInfo info = new UserInfo()
                         {
                                 Age = 12,
                                 Email = "zzz@ccav.com",
                                 Mobile = "13812345678",
                                 Phone = "01012345678",
                                 RealName = "测试" + DateTime.Now.Millisecond.ToString(),
                                 Sex = true,
                                 UserName = "zhoufoxcn" + DateTime.Now.Millisecond.ToString()
                         };
                         instance.Create(info);
                 }
                 [Test]
                 /// <summary>
                 /// 读取用户信息
                 /// </summary>
                 /// <param name="userId">用户编号</param>
                 /// <returns></returns>
                 public void Read()
                 {
                         UserInfo info = instance.Read(1);
                         Assert.NotNull(info);
                 }
                 [Test]
                 /// <summary>
                 /// 更新用户信息
                 /// </summary>
                 /// <param name="info">用户实体</param>
                 /// <returns></returns>
                 public void Update()
                 {
                         UserInfo info = instance.Read(1);
                         info.RealName = "测试" + DateTime.Now.Millisecond.ToString();
                         instance.Update(info);
                 }
                 [Test]
                 /// <summary>
                 /// 删除用户
                 /// </summary>
                 /// <param name="userId">用户编号</param>
                 /// <returns></returns>
                 public void DeleteByID()
                 {
                         int userId = instance.GetMaxUserId();
                         instance.Delete(userId);
                 }
    
                 [Test]
                 /// <summary>
                 /// 删除用户
                 /// </summary>
                 /// <param name="userId">用户实体</param>
                 /// <returns></returns>
                 public void Delete()
                 {
                         int userId = instance.GetMaxUserId();
                         UserInfo info = instance.Read(userId);
                         //Console.WriteLine("MaxUserId=" + userId);
                         instance.Delete(info);
                 }
         }
}

 上面的代码在NUnit2.5.3中测试通过。
 四、总结
 NHibernate与ADO.NET相比开发更简单,应对数据库的变化更灵活,而Linq to SQL比NHibernate更方便应对数据库变化,开发效率也高,使用Linq to SQL后我们仅需要编写一个类就足够了,比较遗憾的是Linq to SQL只支持SQL Server,所以很多人都在使用Entity Framework这个ORM框架了。
 周公
 2010-04-05

--结束END--

本文标题: ADO.NET与ORM的比较(3)Lin

本文链接: https://www.lsjlt.com/news/191317.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ADO.NET与ORM的比较(3)Lin
    说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate,除了在学习基础知识的时候被告知可以使用JDBC操作数据库之外,大量的书籍中都是讲述使用Hibernate这个ORM工具...
    99+
    2023-01-31
    NET ADO Lin
  • ORM分组操作示例(与SQL语句的比较)
    单表操作 建表: class Employee(models.Model): name = models.CharField(max_length=16) age = models.IntegerField() s...
    99+
    2016-09-02
    ORM分组操作示例(与SQL语句的比较) 数据库入门 数据库基础教程
  • ORM分组操作示例(与SQL语句的比较)
    class Employee(models.Model): name = models.CharField(max_length=16) age = models.IntegerField() salary = mo...
    99+
    2020-12-08
    ORM分组操作示例(与SQL语句的比较) 数据库入门 数据库基础教程 数据库 mysql
  • python类型比较的3种方式
    通过types模块的类成员来判断,其实所有python中的类型都是这个types模块中类型的实例。 import types  type(x) is types.IntType # 判断是否int 类型  type(x) is typ...
    99+
    2023-01-31
    类型 方式 python
  • Flask与Django的比较
    Flask与Django的区别 Flask Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 Flask自由、灵活,可扩展性强,第三方库的选择面广,开...
    99+
    2023-01-31
    Flask Django
  • IMAP与POP3的比较
    IMAP与POP3的比较 POP3提供了快捷的邮件下载服务,用户可以利用POP3把邮箱里的信下载到PC上进行离线阅读。一旦邮件进入PC的本地硬盘,就可以选择把邮件从服务器上删除,然后脱离与Internet的连接并选择在任何时候阅读已经下载的...
    99+
    2023-01-31
    IMAP
  • Python2与Python 3的对比
    首发 http://www.everlose.info/notes/2013/10/31/difference-between-python3-to-python2/ 这篇文章总结了一些与Python2.6相比Python3.0中的新特性...
    99+
    2023-01-31
    Python
  • FreeBSD8.0与Ubuntu9.10的性能比较
    本篇内容介绍了“FreeBSD8.0与Ubuntu9.10的性能比较”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Ubuntu 9...
    99+
    2023-06-17
  • Solr与Elasticsearch的优缺点比较
    这篇文章主要讲解了“Solr与Elasticsearch的优缺点比较”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Solr与Elasticsearch的优缺...
    99+
    2022-10-19
  • Java String类的性质与比较
    目录1.什么是String?2.String类的构造方法3.String类的性质4.String之间的相互比较1.什么是String? 首先,初学者一定要知道String是一个类,...
    99+
    2022-11-12
  • 钉钉与erp系统的比较
    首先,钉钉是一款非常适合中小企业的移动办公软件。由于它的易用性和低成本,它已经成为中小企业管理的必备工具之一。在钉钉上,中小企业可以通过手机进行远程办公,不必担心会受到时差和空间的限制。此外,钉钉还提供了企业内部的沟通平台,方便员工之间的交...
    99+
    2023-10-28
    系统 erp
  • 【数据结构Java版】对象的比较之Comparable与Comparator比较器
    目录   一、基本类型的比较 二、对象类型的比较 (1)对象类型比较出现的问题 (2)重写基类equals方法 (3)基于Comparable接口的比较 1.实现Comparable接口,重写compareTo方法 (4)基于Compara...
    99+
    2023-09-06
    数据结构 比较 Comparable Comparator 算法
  • Go和Laravel:数据类型的比较与对比
    Go和Laravel是两种不同的编程语言,各有其独特的特点和优势。其中,数据类型是两种语言中最为基础和重要的部分,本文将从数据类型的角度对Go和Laravel进行比较与对比。 一、基础数据类型 Go和Laravel的基础数据类型都有一些相...
    99+
    2023-07-19
    numy laravel 数据类型
  • Shell脚本传递参数的3种方法比较
    #!/bin/bash #extracting command text_text_text_line options as parameters help_info(){ echo "NAME" ...
    99+
    2022-06-04
    种方法 脚本 参数
  • Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
    《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tut...
    99+
    2023-06-02
  • Kotlin比较与解释Lazy与Lateinit的用法
    目录LateinitLazy这里比较与解释 Lazy 与 Lateinit 的用法。 Lateinit 有时变量的值在其声明的位置不可用。 一个例子是在 Activity 或 Fra...
    99+
    2023-02-23
    Kotlin Lazy的用法 Kotlin Lateinit的用法
  • Percona Server与MySQL 5.5性能的比较
    本篇内容介绍了“Percona Server与MySQL 5.5性能的比较”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2022-10-18
  • PHP与JSP的性能测试比较
    小编给大家分享一下PHP与JSP的性能测试比较,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!测试环境:◆硬件:P4 2.4G,1G内存◆软件:WindowsXP+...
    99+
    2023-06-17
  • 比较 JDK 8 与 JDK 17 的区别
            随着技术的不断发展,Java 也在不断地推出新版本以满足开发者的需求。在本文中,我们将比较两个重要版本:JDK 8 和 JDK 17。JDK 8 是 Java 发展史上的一个里程碑,引入了很多新特性,如 Lambda 表达式...
    99+
    2023-09-04
    java jvm 开发语言
  • position布局与flex布局的比较与选择
    position布局与flex布局的比较与选择在前端开发中,页面布局是一个非常重要的部分,它决定了页面元素的位置和排列方式。在CSS中,有多种方式可以实现页面布局,其中两种常见的方式是position布局和flex布局。本文将从比较和示例两...
    99+
    2023-12-26
    比较 flex position
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作