提起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. Run P4 without P4factory - A Simple Example In Tutorials.

    前言 本文是我运行P4社区于Github开源教程Tutorials中的P4 SIGCOMM 2015 Tutorial一些实战小结,Github链接: Github. 测试的例子:P4 SIGCOMM ...

  2. Myeclipse java程序中运行图片无法加载并且乱码

       Windows---prefrence--workspace--text file encoding亲测有效

  3. 腾讯QQ认证空间4月27日已全面开放申请,欲进军自媒体

    今天看到卢松松的博客上爆出,腾讯QQ认证空间4月27日已全面开放申请的消息,这一消息出来, 马浩周根据提示方法进行申请,下面先说说腾讯QQ认证空间的申请方法: QQ认证空间开放申请公告地址:http: ...

  4. Thinking in Java——笔记(11)

    Holding Your Objects In general, your programs will always be creating new objects based on some cri ...

  5. ASP.NET Web Api

    1.参考资料 Routing in Asp.NET Web Api: http://www.asp.net/web-api/overview/web-api-routing-and-actions/r ...

  6. 给Source Insight做个外挂系列之二--将本地代码注入到Source Insight进程

    上一篇文章介绍了如何发现正在运行的“Source Insight”窗口,本篇将介绍“TabSiPlus”是如何进行代码注入的.Windows 9x以后的Windows操作系统都对进程空间进行了严格的保 ...

  7. AsyncTask内的各个方法调用顺序

    |- AsyncTask内的各个方法调用顺序:|- 首先,用户调用execute方法,启动AsyncTask .然后在execute方法中:|- 首先调用onPreExecute方法,执行初始化操作. ...

  8. storm学习

    一 storm 相关术语 . Nimbus storm 集群主节点,负责资源分配和任务调度.(相当于namenode) . supervisor storm集群工作节点,接受Nimbu分配任务,管理w ...

  9. !+"\v1" 能判断浏览器类型吗?

    我在 http://www.iefans.net/ie-setattribute-bug/ 中看到如此判断是否是IE,if(!+"\v1"){IE代码}else{其他浏览器代码}, ...

  10. 继续Django

    环境准备 1.    创建一个Django后,Django的目录: │ manage.py │ ├─Django_s1 │ settings.py │ urls.py │ wsgi.py │ __in ...