自己动手写ORM框架
提起ORM框架,大家都很熟悉,网上流行的ORM框架有很多,其中出名的有一些,不出名的更是数不胜数。
下面是自己实现的一个简单的ORM框架,实现了常用的增删查改功能,供大家研究ORM实现原理。
功能描述:
1.支持Update语句
2.支持Insert语句
3. 支持Delete语句
4.支持事务
5.支持自定义增删查改语句
6.支持单表查询 ,多表查询
7.支持排序,分页语句
8.结果集可以是DataTable 也可 以是 List<T> 泛型集合,还可以是实体对象
9.结果集支持foreach 遍历
10.支持Oracle和MSSQLServer数据库
大部分常用功能下面代码已做了演示
示例:
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框架的更多相关文章
- (新)自己动手写ORM框架(1)-增删查改的使用
之前写过一个系列文章自己动手写ORM框架,经过在多个项目的中的使用,对这套代码进行了许多改进,下面是使用方法: 新增学员信息代码预览: DBHelper db = DBHelper.getInstan ...
- 自己动手写ORM的感受
之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻.作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM ...
- 自己动手写Spring框架--IOC、MVC
对于一名Java开发人员,我相信没有人不知道 Spring 框架,而且也能够轻松就说出 Spring 的特性-- IOC.MVC.AOP.ORM(batis). 下面我想简单介绍一下我写的轻量级的 S ...
- 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...
- 自己写ORM框架 DBUtils_DG Java(C#的写在链接里)
ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...
- 自己写ORM框架 SqlHelper_DG C#(java的写在链接里)
ORM框架想必大家都比较熟知了,即对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同 ...
- 自己动手写web框架----1
本文可作为<<自己动手写struts–构建基于MVC的Web开发框架>>一书的读书笔记. 一个符合Model 2规范的web框架的架构图应该如下: Controller层的Se ...
- 自己动手写Android框架-数据库框架
大家在工作中基本上都有使用到数据库框架 关系型:ORMLite,GreenDao 对象型:DB4O,Perst 这些数据库用起来都非常的简单,对于我们Android上来说这些数据库足够我们使用了,但是 ...
- 自己动手写web框架----2
在上一节,我们自己写的web框架,只能运行显示一个HelloWorld.现在我们对其进行一次加工,让他至少能运行一个登陆程序. 首先看login.jsp <%@ page contentType ...
随机推荐
- vim操作
2.vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(comm ...
- eclipse导入项目后,java文件无法编辑的问题
新公司第一天,从svn checkout maven项目后,导入eclipse,发现文件的图标不对,如下图箭头所示,出现这个问题的原因, 是项目的的目录下没有.classpath文件,所以需要执行下m ...
- 关于iOS热修复(HotPatch)技术的使用总结
苹果做了非常多的努力来建造和维持一个健康并且干净的应用环境.其中对现在的现状起到很大作用的部分就是苹果APP STORE,它是被一个十分周密的对所有提交的应用进行检查的审批程序所保护的.尽管这个程序是 ...
- C#多线程环境下调用 HttpWebRequest 并发连接限制
C#多线程环境下调用 HttpWebRequest 并发连接限制 .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 win ...
- AngularJS基础知识1
一.angularJS简介 1.什么是 AngularJS? AngularJS 是一个 JavaScript 框架.它是一个以 JavaScript 编写的库.AngularJS是协助搭建单页面工程 ...
- CentOS 7.2 安装配置Samba服务器
1背景 转Linux刚刚1年,vim操作还不能应对工程代码,之前一直都是Gnome桌面 + Clion 作开发环境,无奈在服务器上没有这样的环境, 看同事是(Windows)Source Insigh ...
- ASP.NET MVC 4 视图页去哪里儿
这里特别感谢 swagon 提到了Displaymodeprovider,所以才有了本篇博客,也使我对[View的呈现]中寻找视图页的过程有了清晰的认识! 前戏 在MVC中,执行完Action之后,会 ...
- js中的 && 和 ||
js里面&&和||用法容易绕进去. 总结一下,遵循短路原则. &&就是去找false的选项,||就是去找true的选项. 比如 a&&b 如果 a为fa ...
- linux常用工具链接
http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/lsof.html
- Java网络编程之流——流、过滤器、阅读器和书写器
Java的I/O建立于流(Stream)之上.输入流读取数据:输出流写入数据.所有的输出流都有相同的基本方法来写入数据,所有输入流也使用相同的基本方法来读取数据.在创建流之后,你通常可以忽略在读写时的 ...