自己动手写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 ...
随机推荐
- spring mvc@RequestParam根据参数名获取传入参数值
在SpringMVC后台控制层获取参数的方式主要有两种,一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取.这里主要 ...
- 掌握Thinkphp3.2.0----模版基础
我们将要学习一下 ThinkPHP 模版,ThinkPHP 内置了一个基于 XML 的性能卓越的模版引擎 ThinkTemplate,使用了动态编译和缓存技术,支持自定义标签库, 其实我还体会不到其中 ...
- svn 服务器搭建
http://www.cnblogs.com/wrmfw/archive/2011/09/08/2170465.html 一,安装必须的软件包. $ apt-get install subversio ...
- How to install starDIct on suse OS?
1. Access page http://code.google.com/p/stardict-3/ to download starDict package or use zypper in to ...
- iPhone的CSS3媒体查询
iPhone的CSS3媒体查询: 各版本的iPhone媒体查询是根据其分辨率和一些CSS3媒体查询的特性来实现媒体查询的...详见下: iPhone6的媒体查询: @media only screen ...
- MYSQL提权总结
最近在测试一个项目,遇到了MYSQL数据库,想尽办法提权,最终都没有成功,很是郁闷,可能是自己很久没有研究过提权导致的吧,总结一下MYSQL提权的各种姿势吧,权当复习了.关于mysql提权的方法也就那 ...
- Python学习笔记 for windows
学习来源 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738136 ...
- ROW_NUMBER() OVER() 用法
语法 ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause ) 参数 PARTITIO ...
- UWP&WP8.1 重新绘制图片 WriteableBitmap用法 图片转byte[]数组,byte[]数组转图片
---恢复内容开始--- WriteableBitmap 是UWP和WP8.1绘制图片的,重组图片的最重要方法.方法较为简单,方法多样性. 通过查看文档,WriteableBitmap的继承性是 ...
- docker在centos7下的一些坑
在centos的docker上安装mysql提示chown mod /var/lib/mysql permission denied,通过下面的方法1解决. 在centos上挂载数据卷,在容器内部访问 ...