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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 二、手写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
相关文章
|
6天前
|
SQL 关系型数据库 MySQL
探索Gorm - Golang流行的数据库ORM框架
探索Gorm - Golang流行的数据库ORM框架
|
4月前
|
SQL 关系型数据库 MySQL
Python 数据库访问与ORM框架——打造高效开发利器
Python 作为一门广泛使用的编程语言,其在数据库访问方面也有着较为成熟的解决方案,其中ORM框架更是成为了开发者们的首选。本文将介绍 Python 中数据库访问和 ORM 框架的基本概念,以及如何使用 SQLAlchemy 这一优秀的 ORM 框架进行开发。
|
4月前
|
SQL 数据管理 数据库
Python数据库访问与ORM框架:探索高效数据管理的奥秘
在当今信息爆炸的时代,高效地管理和处理海量数据成为了企业和开发者的迫切需求。本文将介绍Python中的数据库访问技术以及ORM框架(如SQLAlchemy),探索其在数据管理方面的重要作用。通过使用Python数据库访问和ORM框架,开发者可以更轻松地操作数据库、提高代码可读性和维护性,并实现高效的数据持久化和查询。
|
4月前
|
关系型数据库 API 数据库
Python数据库访问与ORM框架:加速开发、提升效率
在现代软件开发中,数据库是不可或缺的组成部分。本文介绍了Python中数据库访问的重要性,并探讨了ORM框架(例如SQLAlchemy)如何帮助程序员加速开发、提升效率。通过使用ORM框架,开发人员可以轻松地将Python对象映射到数据库表,并且可以通过简洁的API进行数据库操作。此外,本文还讨论了ORM框架在处理复杂查询、维护数据一致性和实现数据库迁移方面的优势。
|
2天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
2天前
|
关系型数据库 MySQL API
Python web框架fastapi数据库操作ORM(一)
Python web框架fastapi数据库操作ORM(一)
|
7天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
9 0
|
17天前
|
安全 API 数据库
Python中的Tortoise ORM框架:高效、灵活的数据库交互新选择
【4月更文挑战第14天】在Python的数据库交互领域中,对象关系映射(ORM)框架扮演着举足轻重的角色。近年来,随着技术的不断发展和进步,众多ORM框架如雨后春笋般涌现,其中Tortoise ORM以其高效、灵活的特性受到了广大开发者的青睐。本文将深入探讨Tortoise ORM框架的核心特性、使用方法以及其在Python开发中的应用。
|
22天前
|
数据库 Python
ORM映射到数据库
ORM映射到数据库。
11 1
|
2月前
|
关系型数据库 MySQL 数据库连接
实战演练:使用Go语言和ORM框架与数据库进行交互
【2月更文挑战第13天】本文将通过一个实战演练,展示如何使用Go语言和ORM(对象关系映射)框架与数据库进行交互。我们将选择一个流行的ORM框架,如GORM,来完成这个任务。通过实际编码,我们将演示如何连接数据库、执行CRUD操作、处理错误和异常,并展示ORM框架如何简化数据库操作过程。