• 自己动手写ORM框架


    提起ORM框架,大家都很熟悉,网上流行的ORM框架有很多,其中出名的有一些,不出名的更是数不胜数。

    下面是自己实现的一个简单的ORM框架,实现了常用的增删查改功能,供大家研究ORM实现原理。

    还有一些性能优化相关的功能没有做,这里并不想重复造轮子  仅供学习参考

    功能描述:

       1.支持Update语句

       2.支持Insert语句

       3. 支持Delete语句

       4.支持事务

       5.支持自定义增删查改语句

       6.支持单表查询 ,多表查询

       7.支持排序,分页语句

       8.结果集可以是DataTable  也可 以是 List<T> 泛型集合,还可以是实体对象

       9.结果集支持foreach 遍历

       10.支持Oracle和MSSQLServer数据库

       11.需要支持其他数据库可以参照 Oracle/MSSQLServer 实现相关扩展

    大部分常用功能下面代码已做了演示

      

    DbMapper.1.0.0.3.下载地址

     示例:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 using DBMapper;
      5 using System.Data;
      6 
      7 namespace DbMapperTest
      8 {
      9     class Program
     10     {
     11         static void Main(string[] args)
     12         {
     13             try
     14             {
     15                 string str_ticks=System.DateTime.Now.Ticks.ToString();
     16                 int jlbh = int.Parse(str_ticks.Substring(str_ticks.Length - 8, 8));
     17                 //---oracle测试
     18                 using (var dbMap = DbMapper.CreateDbMapper(DbMapper.PROVIDER_ORACLE,
     19                      "Password=test;User ID=test;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
     20                      + "(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=testdb)));"))
     21                 
     22                 //----sqlserver测试
     23                 //using(var dbMap=DbMapper.CreateDbMapper(DbMapper.PROVIDER_SQLSERVER,"Data Source=DINT-PC;Integrated Security=True; database=TEST"))
     24                 {
     25                     //插入记录
     26                     dbMap.Insert<Person>(new Person
     27                     {
     28                         JLBH = jlbh,
     29                         NAME = "索额图",
     30                         ADDRESS = "皇宫",
     31                         AGE = 30,
     32                         PNO = "zzzzzzzzzzzzzzzzz"
     33                     });
     34                     
     35                     dbMap.Insert<Course>(new Course()
     36                     {
     37                         JLBH = jlbh,
     38                         NAME = "计算机科学与技术",
     39                         TIME = DateTime.Now.ToString()
     40                     });
     41                     dbMap.Insert<PersonCourse>(new PersonCourse()
     42                     {
     43                         COUR_ID = jlbh,
     44                         PERSON_ID = jlbh,
     45                     });
     46                     dbMap.Execute(false);
     47                     if(dbMap.Query<Person>("select * from Person where JLBH=:JLBH",new Person{JLBH=jlbh}).Count>0)
     48                     Console.WriteLine("插入Person记录{0}成功", jlbh);
     49 
     50                     if (dbMap.Query<Course>("select * from Course where JLBH=:JLBH", new Course { JLBH = jlbh }).Count > 0)
     51                     Console.WriteLine("插入Course记录{0}成功", jlbh);
     52 
     53                     if (dbMap.Query<PersonCourse>("select * from PERSON_COURSE where PERSON_ID=:PERSON_ID", new PersonCourse { PERSON_ID = jlbh }).Count > 0)
     54                     Console.WriteLine("插入PersonCourse记录{0}成功", jlbh);
     55 
     56 
     57                     /*----------------修改--------------------------*/  
     58                     Console.WriteLine(""); 
     59                     Console.WriteLine("-----------------修改-----------------");
     60                     dbMap.Update<Course>(new Course { 
     61                        JLBH=jlbh,
     62                        NAME = "计算机科学与技术(修正版)"
     63                     });
     64                     int aff=dbMap.Execute();
     65                     if (aff > 0) {
     66                         Console.WriteLine("插入Course记录{0}成功", jlbh);
     67                     }
     68                     
     69                     
     70                     /*----------------单记录查询---------------*/
     71                     Console.WriteLine(""); 
     72                     Console.WriteLine("----------------单记录查询---------------");
     73                     //动态对象传递参数 .NET4.0及以上版本才支持的
     74                     Person aPerson = dbMap.Query<Person>("select * from Person where JLBH=:JLBH",
     75                     new {
     76                         JLBH=jlbh
     77                     }).First;
     78                     Console.WriteLine("{0} {1} {2} {3}", aPerson.JLBH, aPerson.NAME, aPerson.PNO, aPerson.ADDRESS);
     79 
     80                     /*------------------------foreach遍历结果集--------------------------------*/
     81                     Console.WriteLine("");
     82                     Console.WriteLine("--------foreach遍历结果集-------------");
     83                     foreach (Person cc in dbMap.Query<Person, Course, PersonCourse>(@"select P.JLBH PERSON#JLBH,P.NAME PERSON#NAME,P.PNO,P.ADDRESS,P.AGE,
     84                        C.NAME COURSE#NAME,C.TIME from PERSON P,COURSE C,PERSON_COURSE PC
     85                        where P.JLBH=PC.PERSON_ID and C.JLBH=PC.COUR_ID", null, null, null).OrderBy("PERSON#JLBH", true).Take(5))
     86                     {
     87                         Console.WriteLine("{0} {1} {2}", cc.JLBH, cc.NAME, cc.PNO);
     88                     }
     89 
     90                     /*------------------------------返回结果数量 Count属性-------------------------------------*/
     91                     Console.WriteLine(""); Console.WriteLine(""); 
     92                     Console.WriteLine("-------------------返回结果数量 Count属性-----------------");
     93                     int countPersons = dbMap.Query<Person>("select * from Person", null).Count;
     94                     Console.WriteLine(countPersons.ToString());
     95 
     96                     /*---------------------------多表查询----------------------------------------*/
     97                     Console.WriteLine(""); Console.WriteLine("");
     98                     Console.WriteLine("--------------------多表查询----------------------");
     99                     
    100                     DataTable at = dbMap.Query<Object>(@"select P.JLBH PERSON#JLBH,P.NAME PERSON#NAME,P.PNO,P.ADDRESS,P.AGE,
    101                        C.NAME COURSE#NAME,C.TIME from PERSON P,COURSE C,PERSON_COURSE PC
    102                        where P.JLBH=PC.PERSON_ID and C.JLBH=PC.COUR_ID", null).OrderBy("PERSON#JLBH", false).Skip(1).Take(5).ToTable();
    103                     foreach (DataRow arow in at.Rows)
    104                     {
    105                         Console.WriteLine("{0} {1} {2} {3} {4}", arow["PERSON#JLBH"], arow["PERSON#NAME"], arow["COURSE#NAME"], arow["TIME"], arow["PNO"]);
    106                     }
    107 
    108 
    109                     /*-------------------------返回结果集-----------------------------*/
    110                     Console.WriteLine(""); Console.WriteLine(""); 
    111                     Console.WriteLine("--------------------返回结果集----------------------");
    112                     List<Person> lstPersons = dbMap.Query<Person>("select * from Person", null).OrderBy("JLBH", true).Skip(0).Take(5).ToList();
    113                     foreach (Person p in lstPersons)
    114                     {
    115                         Console.WriteLine("{0} {1} {2} {3} {4}", p.JLBH, p.NAME, p.PNO, p.AGE, p.ADDRESS);
    116                     }
    117                 }
    118             }
    119             catch(Exception ex){
    120                 Console.WriteLine(ex.Message);
    121             }
    122         }
    123     }
    124 
    125     /*还差一个根据表自动生成对象的工具  这里手动生成*/
    126     class Person : IDbTableNaming {
    127         [PrimaryKey]//标示该列为主键  Update 函数需要
    128         public int JLBH { get; set; }
    129         public string NAME { get; set; }
    130         public string PNO { get; set; }
    131         public string ADDRESS { get; set; }
    132         public int AGE { get; set; }
    133         string IDbTableNaming.DBTableName//映射到数据库中的表名  如果没有 则默认为类名
    134         {
    135             get { return "PERSON"; }
    136         }
    137     }
    138     class Course : IDbTableNaming {
    139         [PrimaryKey]
    140         public int JLBH { get; set; }
    141         public string NAME { get; set; }
    142         public string TIME { get; set; }
    143         string IDbTableNaming.DBTableName
    144         {
    145             get { return "COURSE"; }
    146         }
    147     }
    148     class PersonCourse:IDbTableNaming {
    149         public int PERSON_ID { get; set; }
    150         public int COUR_ID { get; set; }
    151         string IDbTableNaming.DBTableName
    152         {
    153             get { return "PERSON_COURSE"; }
    154         }
    155     }
    156 }
  • 相关阅读:
    170601、单例模式的三种水平代码(第三种最佳)
    解决打开pycharm有带图片md文件卡死问题
    Dockerfile 操作
    Docker 命令大全
    MAC
    mac 搭建selenium与ChromeDriver环境
    Mac进行 usr/bin 目录下修改权限问题,operation not permitted
    pytest文档6-fixture之yield实现teardown
    pytest文档5-fixture之conftest.py
    pytest文档4-测试用例setup和teardown
  • 原文地址:https://www.cnblogs.com/dint/p/4242083.html
Copyright © 2020-2023  润新知