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

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

功能描述:

1.支持Update语句

2.支持Insert语句

3. 支持Delete语句

4.支持事务

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

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

7.支持排序,分页语句

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

9.结果集支持foreach 遍历

10.支持Oracle和MSSQLServer数据库

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

DbMapper.1.0.0.3.下载地址

示例:

 using System;
using System.Collections.Generic;
using System.Text;
using DBMapper;
using System.Data; namespace DbMapperTest
{
class Program
{
static void Main(string[] args)
{
try
{
string str_ticks=System.DateTime.Now.Ticks.ToString();
int jlbh = int.Parse(str_ticks.Substring(str_ticks.Length - , ));
//---oracle测试
using (var dbMap = DbMapper.CreateDbMapper(DbMapper.PROVIDER_ORACLE,
"Password=test;User ID=test;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
+ "(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=testdb)));")) //----sqlserver测试
//using(var dbMap=DbMapper.CreateDbMapper(DbMapper.PROVIDER_SQLSERVER,"Data Source=DINT-PC;Integrated Security=True; database=TEST"))
{
//插入记录
dbMap.Insert<Person>(new Person
{
JLBH = jlbh,
NAME = "索额图",
ADDRESS = "皇宫",
AGE = ,
PNO = "zzzzzzzzzzzzzzzzz"
}); dbMap.Insert<Course>(new Course()
{
JLBH = jlbh,
NAME = "计算机科学与技术",
TIME = DateTime.Now.ToString()
});
dbMap.Insert<PersonCourse>(new PersonCourse()
{
COUR_ID = jlbh,
PERSON_ID = jlbh,
});
dbMap.Execute(false);
if(dbMap.Query<Person>("select * from Person where JLBH=:JLBH",new Person{JLBH=jlbh}).Count>)
Console.WriteLine("插入Person记录{0}成功", jlbh); if (dbMap.Query<Course>("select * from Course where JLBH=:JLBH", new Course { JLBH = jlbh }).Count > )
Console.WriteLine("插入Course记录{0}成功", jlbh); if (dbMap.Query<PersonCourse>("select * from PERSON_COURSE where PERSON_ID=:PERSON_ID", new PersonCourse { PERSON_ID = jlbh }).Count > )
Console.WriteLine("插入PersonCourse记录{0}成功", jlbh); /*----------------修改--------------------------*/
Console.WriteLine("");
Console.WriteLine("-----------------修改-----------------");
dbMap.Update<Course>(new Course {
JLBH=jlbh,
NAME = "计算机科学与技术(修正版)"
});
int aff=dbMap.Execute();
if (aff > ) {
Console.WriteLine("插入Course记录{0}成功", jlbh);
} /*----------------单记录查询---------------*/
Console.WriteLine("");
Console.WriteLine("----------------单记录查询---------------");
//动态对象传递参数 .NET4.0及以上版本才支持的
Person aPerson = dbMap.Query<Person>("select * from Person where JLBH=:JLBH",
new {
JLBH=jlbh
}).First;
Console.WriteLine("{0} {1} {2} {3}", aPerson.JLBH, aPerson.NAME, aPerson.PNO, aPerson.ADDRESS); /*------------------------foreach遍历结果集--------------------------------*/
Console.WriteLine("");
Console.WriteLine("--------foreach遍历结果集-------------");
foreach (Person cc in dbMap.Query<Person, Course, PersonCourse>(@"select P.JLBH PERSON#JLBH,P.NAME PERSON#NAME,P.PNO,P.ADDRESS,P.AGE,
C.NAME COURSE#NAME,C.TIME from PERSON P,COURSE C,PERSON_COURSE PC
where P.JLBH=PC.PERSON_ID and C.JLBH=PC.COUR_ID", null, null, null).OrderBy("PERSON#JLBH", true).Take())
{
Console.WriteLine("{0} {1} {2}", cc.JLBH, cc.NAME, cc.PNO);
} /*------------------------------返回结果数量 Count属性-------------------------------------*/
Console.WriteLine(""); Console.WriteLine("");
Console.WriteLine("-------------------返回结果数量 Count属性-----------------");
int countPersons = dbMap.Query<Person>("select * from Person", null).Count;
Console.WriteLine(countPersons.ToString()); /*---------------------------多表查询----------------------------------------*/
Console.WriteLine(""); Console.WriteLine("");
Console.WriteLine("--------------------多表查询----------------------"); DataTable at = dbMap.Query<Object>(@"select P.JLBH PERSON#JLBH,P.NAME PERSON#NAME,P.PNO,P.ADDRESS,P.AGE,
C.NAME COURSE#NAME,C.TIME from PERSON P,COURSE C,PERSON_COURSE PC
where P.JLBH=PC.PERSON_ID and C.JLBH=PC.COUR_ID", null).OrderBy("PERSON#JLBH", false).Skip().Take().ToTable();
foreach (DataRow arow in at.Rows)
{
Console.WriteLine("{0} {1} {2} {3} {4}", arow["PERSON#JLBH"], arow["PERSON#NAME"], arow["COURSE#NAME"], arow["TIME"], arow["PNO"]);
} /*-------------------------返回结果集-----------------------------*/
Console.WriteLine(""); Console.WriteLine("");
Console.WriteLine("--------------------返回结果集----------------------");
List<Person> lstPersons = dbMap.Query<Person>("select * from Person", null).OrderBy("JLBH", true).Skip().Take().ToList();
foreach (Person p in lstPersons)
{
Console.WriteLine("{0} {1} {2} {3} {4}", p.JLBH, p.NAME, p.PNO, p.AGE, p.ADDRESS);
}
}
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
} /*还差一个根据表自动生成对象的工具 这里手动生成*/
class Person : IDbTableNaming {
[PrimaryKey]//标示该列为主键 Update 函数需要
public int JLBH { get; set; }
public string NAME { get; set; }
public string PNO { get; set; }
public string ADDRESS { get; set; }
public int AGE { get; set; }
string IDbTableNaming.DBTableName//映射到数据库中的表名 如果没有 则默认为类名
{
get { return "PERSON"; }
}
}
class Course : IDbTableNaming {
[PrimaryKey]
public int JLBH { get; set; }
public string NAME { get; set; }
public string TIME { get; set; }
string IDbTableNaming.DBTableName
{
get { return "COURSE"; }
}
}
class PersonCourse:IDbTableNaming {
public int PERSON_ID { get; set; }
public int COUR_ID { get; set; }
string IDbTableNaming.DBTableName
{
get { return "PERSON_COURSE"; }
}
}
}

自己动手写ORM框架的更多相关文章

  1. (新)自己动手写ORM框架(1)-增删查改的使用

    之前写过一个系列文章自己动手写ORM框架,经过在多个项目的中的使用,对这套代码进行了许多改进,下面是使用方法: 新增学员信息代码预览: DBHelper db = DBHelper.getInstan ...

  2. 自己动手写ORM的感受

    之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...

  3. 自己动手写Spring框架--IOC、MVC

    对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...

  4. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  5. 自己写ORM框架 DBUtils_DG Java(C#的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  6. 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)

    ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...

  7. 自己动手写web框架----1

    本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...

  8. 自己动手写Android框架-数据库框架

    大家在工作中基本上都有使用到数据库框架 关系型:ORMLite,GreenDao 对象型:DB4O,Perst 这些数据库用起来都非常的简单,对于我们Android上来说这些数据库足够我们使用了,但是 ...

  9. 自己动手写web框架----2

    在上一节,我们自己写的web框架,只能运行显示一个HelloWorld.现在我们对其进行一次加工,让他至少能运行一个登陆程序. 首先看login.jsp <%@ page contentType ...

随机推荐

  1. Unity内存理解(转)

    Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBu ...

  2. eclipse如何配置tomcat运行web项目时省略项目名称

    三个关键点,如图所示

  3. How to change hostname on SLE

    修改/etc/HOSTNAME文件,在此文件中保存主机名,例如: linuxserv1 然后运行命令设置主机名 # /etc/rc.d/boot.localnet start 方法3. 运行 sysc ...

  4. Map与Tuple

    一:Map 1.创建一个不可变的map 2.创建一个可变的map 3.创建一个空的map 4.可变map添加一个元素 5.查看一个元素和修改一个元素 6.可变map删除元素 7.不可变map添加一个元 ...

  5. hive --service metastore 出现的问题

    Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083 执行命令jps root@hadoopm:/usr# jps1763 Res ...

  6. JavaScript作用域和闭包

    在JavaScript中,作用域是执行代码的上下文.作用域有3种类型: 1.全局作用域 2.局部作用域---(又叫函数作用域) 3.eval作用域 var foo =0;//全局作用域console. ...

  7. 关于移动app开发的一些不错的站点

    1. http://www.androiddevtools.cn      Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的A ...

  8. JavaScript编码规范指南

    前言 本文摘自Google JavaScript编码规范指南,截取了其中比较容易理解与遵循的点作为团队的JavaScript编码规范. JavaScript 语言规范 变量 声明变量必须加上 var  ...

  9. Docker version 1.12.5建立registry私库

    sudo docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry :前面的是宿主机的地址(/opt/da ...

  10. java 读写文件

    1. 读文件 import java.io.*; import java.util.*; public class test { public void test_readfile(String fi ...