二、手写ORM实现数据库插入

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 二、手写ORM实现数据库插入

在利用反射插入时会映射所有字段:但是插入时有主键自增不需要指定值

因此利用特性标记主键,将主键排除掉

1.编写属性

[AttributeUsage(AttributeTargets.Property)]
    public class KeysAuthAtturbute : Attribute
    {
        public KeysAuthAtturbute() {}
    }

2.标记属性

5408e8c60d2807743b898c68998f81e5_1365.png

3.查询除KeysAuthAtturbute之外的字段(排除主键)

public static IEnumerable<PropertyInfo> PropertyInfoKeys(this Type type)
      {
          return type.GetProperties().Where(c => !c.IsDefined(typeof(KeysAuthAtturbute), true));
      }


4.编写方法

insert用到了参数化拼接,防止SQL注入

例如:insert into Student

values(@Age,@Birthday,@Sex) 再给赋值

public  bool insert<T>(T t)
      {
          Type type = typeof(T);//获取到具体实体类型
          string TableName = type.Name;
          string fileName = string.Join(",",type.PropertyInfoKeys().Select(p=>string.Format("[{0}]", p.Name)));
          string valuesName = string.Join(",", type.PropertyInfoKeys().Select(p => $"@{p.Name}"));//将参数以@Age,@Sex方式列出
          string sql = $@"INSERT INTO [{TableName}] ({fileName}) VALUES ({valuesName})";
          SqlCommand cmd = new SqlCommand(sql, conn);
          //用于赋值参数  数据库允许为空的情况下,判断是否有值,没有的话赋值为空值
          IEnumerable<SqlParameter> parameters = type.PropertyInfoKeys().Select(p =>
          new SqlParameter($"@{p.Name}", p.GetValue(t)??DBNull.Value));
          cmd.Parameters.AddRange(parameters.ToArray());
          if (conn.State == System.Data.ConnectionState.Closed)
          {
              conn.Open();
          }
          int result = cmd.ExecuteNonQuery();
          return result == 1;
      }

5.调用

sqlserverDBhelper sqlserverD = new sqlserverDBhelper();
           sqlserverD.insert<Student>( new Student {
               Name = "lw",
               Age = 20,
               Birthday = DateTime.Now,
               Sex = "女",
           });

 

在程序中每次调用都需要拼接SQL字符串,使程序变得缓慢

因此利用泛型缓存加载

 

1.新建一个类 复制之前的代码,初始化构造函数里存放sql语句

public class sqlhublider<T>
   {
       private static string selectsql = null;
       private static string insertsql = null;
       static sqlhublider()
       {
           Type type = typeof(T);//获取到具体类型
           string fileName = string.Join(",", type.PropertyInfoKeys().Select(p => string.Format("[{0}]", p.Name)));
           string valuesName = string.Join(",", type.PropertyInfoKeys().Select(p => $"@{p.Name}"));
           insertsql = $@"INSERT INTO [{type.Name}] ({fileName}) VALUES ({valuesName})";
           string filedstring = string.Join(",", type.GetProperties().Select(c => string.Format("[{0}]", c.Name)));
           selectsql = string.Format("select {0} from {1} where ID= ", filedstring, type.Name);
       }
       public static string Getsql(Sqltype sqltype)
       {
           switch (sqltype)
           {
               case sqlserver.Sqltype.selectsql:
                   return selectsql;
               case sqlserver.Sqltype.insertsql:
                   return insertsql;
               default:
                   throw new Exception("sqltype");
           }
       }
   }
   public enum Sqltype//枚举类型 不同类型的的SQL语句
   {
       selectsql,
       insertsql
   }

2.方法改编

public  bool insert<T>(T t)
       {
            Type type = typeof(T);//获取到具体类型
            string sql= sqlhublider<T>.Getsql(Sqltype.insertsql);
           SqlCommand cmd = new SqlCommand(sql, conn);
           //用于赋值参数  数据库允许为空的情况下,判断是否有值,没有的话赋值为空值
           IEnumerable<SqlParameter> parameters = type.PropertyInfoKeys().Select(p =>
           new SqlParameter($"@{p.Name}", p.GetValue(t)??DBNull.Value));
           cmd.Parameters.AddRange(parameters.ToArray());
           if (conn.State == System.Data.ConnectionState.Closed)
           {
               conn.Open();
           }
           int result = cmd.ExecuteNonQuery();
           return result == 1;
       }

3.调用

sqlserverDBhelper sqlserverD = new sqlserverDBhelper();
           sqlserverD.insert<Student>( new Student {
               Name = "lw",
               Age = 22,
               Birthday = DateTime.Now,
               Sex = "男",
           });
           sqlserverD.insert<Student>(new Student
           {
               Name = "lw",
               Age = 21,
               Birthday = DateTime.Now,
               Sex = "男",
           });

 

调试时发现,第二次插入直接使用了之前的SQL语句,不需要再次拼装了,使性能得到了提升。

泛型缓存原理:JIT会为不同的实体构造不同的类型副本

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
5月前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
115 2
|
2月前
|
SQL 定位技术 数据库
深入探索Django ORM:高效数据库操作的秘诀####
本文旨在为读者揭开Django ORM(对象关系映射)的神秘面纱,通过一系列生动的比喻和详实的案例,深入浅出地讲解其核心概念、工作原理及高级特性。我们将一起探讨如何利用Django ORM简化数据库交互,提升开发效率,同时确保数据的一致性和安全性。不同于传统的技术文档,本文将以故事化的形式,带领读者在轻松愉快的氛围中掌握Django ORM的精髓。 ####
|
5月前
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
|
4月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
129 0
|
6月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
497 0
|
6月前
|
数据库 Java 数据库连接
玩转Play Framework的秘密武器:Ebean ORM带你解锁高效数据库操作新姿势,让你的代码从此飞起来!
【8月更文挑战第31天】Play Framework 以其简洁的 API 和高效开发体验著称,Ebean ORM 则是其推荐的对象关系映射(ORM)工具之一。Ebean 可将 Java 对象轻松映射到数据库表,简化数据库交互。本文将指导你在 Play Framework 中使用 Ebean ORM 进行数据库操作,涵盖项目创建、依赖引入、数据库配置、模型定义及 CRUD 操作,并通过示例代码展示实现过程。通过这些步骤,你将学会如何利用 Ebean 的丰富功能,如事务管理、查询构建等,提升 Web 应用的数据库交互能力。
103 0
|
6月前
|
数据库 测试技术 开发者
Play Framework的测试魔法:让代码在舞台上翩翩起舞,确保应用质量的幕后英雄!
【8月更文挑战第31天】Play Framework不仅以其高效开发与部署流程著称,还内置了强大的测试工具,提供全面的测试支持,确保应用高质量和稳定性。本文将详细介绍如何在Play Framework中进行单元测试和集成测试,涵盖`WithApplication`、`WithServer`及`WithDatabase`等类的使用方法,并通过示例代码手把手教你如何利用Play的测试框架。无论是单元测试、集成测试还是数据库操作测试,Play Framework均能轻松应对,助你提升应用质量和开发效率。
64 0
|
6月前
|
SQL 关系型数据库 数据库连接
Entity Framework Core 入门教程来袭!快速上手强大的 ORM 工具,开启高效数据库开发之旅!
【8月更文挑战第31天】Entity Framework Core(EF Core)是一个轻量且可扩展的对象关系映射(ORM)框架,允许开发者使用 .NET 语言操作数据库而无需直接编写 SQL 语句。本教程涵盖 EF Core 的安装、数据库上下文创建、数据库连接配置及常见数据库操作(如添加、查询、更新和删除),并介绍如何利用数据库迁移功能安全地更改数据库结构。通过本教程,你可以快速掌握 EF Core 的基本用法,提高开发效率。
471 0
|
6月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
71 0

热门文章

最新文章