主要功能介绍

支持Oracle,SQL Server,MySQL,SQLLite等数据库。。主要功能:

  1. 支持查询返回动态类型Dynamic以及可扩展类型ExpandoDynamic
  2. 表拆分,根据某个日期字段在Insert时,字段按年,月,日,季度生成表,并将数据插入对应日期的表
  3. 表检查,在系统启动时,根据程序实体层(Model类)自动创建缺失的表,字段功能
  4. 通过Emit方式进行数据对象的填充和映射,替代反射操作对象。提供性能和效率。执行效率能达到Ado.net原生效率
  5. 自定义主键,通过MyIdMake生成全局唯一ID,18位数值型,类型为Int64,long,BigInt,Number(18)等数值类型。ID具有递增:下一个 ID 一定大于上一个 ID,满足排序等特殊需求
  6. 对于其他数据库,可执行扩展,只需继承类DBSession,并重载对应方法即可
  7. 支持在同一个项目中同时连接多个不同的数据库
  8. 支持常用的:分页,泛型List,实体List,自定义对象List,动态类型Dynamic的List,可扩展类型ExpandoDynamic的List等查询,支持事务操作,AddParameter方式添加参数避免sql注

实体类(Model型)

实体类主要实现C#类和数据库表的映射。例如:

映射特性说明,具体参数详见注释:

DBTable:数据库表映射,主要用户类上

DBColumn:字段映射

DBPrimary:主键映射,支持联合主键,即多个主键

/// <summary>
///管理用户表
/// </summary>
[DBTable("AdminUser")]
public class AdminUser
{
/// <summary>
///Id
/// </summary>
[DBPrimaryKey("Id")]
public Int64 Id { get; set; } /// <summary>
///用户名
/// </summary>
[DBColumn("UserName")]
public string UserName { get; set; } /// <summary>
///密码
/// </summary>
[DBColumn("PassWord")]
public string PassWord { get; set; } /// <summary>
///姓名
/// </summary>
[DBColumn("Name")]
public string Name { get; set; } /// <summary>
///状态
/// </summary>
[DBColumn("State")]
public StateType State { get; set; } /// <summary>
///CreateTime
/// </summary>
[DBColumn("CreateTime")]
public DateTime CreateTime { get; set; }
}

  

初始化

//构造初始化参数
DBContext db = new DBContext("WebSite", DataBaseType.SQLServer, constring, 5); //初始化数据库连接,第二个参数指定数据库映射的实体类
DBSession.InitDBSession(db, typeof(Model.AdminUser).Assembly); //设置默认的数据库连接
DBSession.DefaultDBKey = "WebSite";

  

DBContext 构造参数说明:

dbKey(上面第一个参数):为此数据库连接指定自定义名称

DataBaseType.SQLServer (上面第二个参数):指定数据库类型

constring(上面第三个参数):数据库连接字符串

5(上面第四个参数):连接对象池初始大小,如果为0 则不启用连接对象池

数据库操作说明

常用写法如下:如果不需要事务,则去掉try。所有的数据库操作都直接通过对象session的方法进行操作。

using (DBSession session = DBSession.TryGet())
{
try
{
session.BeginTransaction(); …你的数据库操作逻辑 session.Commit();
}
catch (Exception ex)
{
session.Rollback();
throw ex;
}
}

  

如果不使用using写法

DBSession session = DBSession.TryGet();
try{
…你的数据库操作逻辑
}catch (Exception ex)
{
throw ex;
}finally
  {
    session.Disponse();//一定要关闭连接
  }

  

Sql参数写法示例

session.ExecuteNonQuery("update StoreHouse set State=? where id=? ", state, id);

对于sql中的参数以?替代,后面按照顺序进行输入即可

原生数据库操作方法

支持原生的数据库操作方法有:

//执行增、删、改
int ExecuteNonQuery(string sql, params object[] paras): //获取查询结果的第一行第一列
object ExecuteScalar(string sql, params object[] paras) //获取查询结果的第一行第一列,并返回指定的泛型类型
T ExecuteScalar<T>(string sql, params object[] paras) //获取一个DataTable
DataTable GetTable(string sql, params object[] paras) //读取一个Reader
IDataReader ExecuteReader(string sql, params object[] paras) //执行存储过程 并返回一张表
DataTable ExecuteProcRtuTB(string procName) //执行存储过程
object ExecuteProc(string procName)

  

新增

//新增对象
Insert<T>(T instance) //批量新增,采用批量新增的sql语句新增 目前仅支持Oracle Sql Server
int InsertBatch<T>(List<T> list, int pageSize = 100, DateTime? date = null) //批量新增 采用SqlBulkCopy方式批量新增 目前仅支持Sql Server
void InsertBatchBulkCopy<T>(List<T> list, DateTime? date = null) //批量新增 采用SqlBulkCopy方式批量新增
InsertBatchBulkCopy<T>(DataTable dt, DateTime? date = null)

  

修改

//修改对象,会修改所有字段
int Update<T>(T instance)

  

删除

//根据主键删除,例如:session.Delete<Dept, Int64>(deptId)
int Delete<T, IdT>(IdT id) //根据条件删除,例如:session.Delete<W_UserRole>("UserId=?", old.Id);
int Delete<T>(string where, params object[] paras)

  

映射类查询(返回结果为实体类)

//通过ID(主键)获取指定类型的对象
T GetById<T>(object id) //根据条件查询对象,例如:session.GetObject<WebUser>("Tel=?","13012345678");
T GetObject<T>(string where, params object[] paras) //根据SQL语句查询对象
T GetObjectBySQL<T>(string sql, params object[] paras) //根据SQL语句查询列表
List<T> GetListBySQL<T>(string sql, params object[] paras) //根据条件获取列表,例如:session.GetList<WebUser>("Tel like ?","Tel desc","130%");
List<T> GetList<T>(string where, string order, params object[] paras)

  

自定义类型查询(返回结果为非映射类)

//获取自定义的对象列表列表
List<T> GetCustomerList<T>(string sql, params object[] paras) //根据SQL语句查询对象
T GetCustomerObject<T>(string sql, params object[] paras) //获取自定义对象列表,分页查询
List<T> GetCustomPagingList<T>(
int pageIndex,
int pageSize,
string before,
string fields,
string from,
string where,
string group,
string order,
params object[] paras)

  

动态类查询(返回结果为Dynamic类型)

//获取自定义对象列表,自己给定SQL语句
object GetDynamicList(string sql, params object[] paras) //获取符合条件的第一条记录, 给定SQL语句
object GetDynamicObject(string sql, params object[] paras) //获取自定义对象列表 分页查询
object GetDynamicPagingList(
int pageIndex,
int pageSize,
string fields,
string from,
string where,
string group,
string order,
params object[] paras)
{
Command.CommandType = CommandType.Text;
Command.CommandText = PrepareCustomSelectPaging(pageIndex, pageSize, fields, from, where, group, order, paras);
using (IDataReader reader = Command.ExecuteReader())
{
return FullDataReader.CreateDegFullDynamicList(reader)(reader);
}
}

  

可扩展类查询(返回结果为System.Dynamic.ExpandoObject类型)

//动态可扩展集合对象列表。返回对象与列名一致,返回对象可动态扩展
object GetExpandoDynamicList(string sql, params object[] paras) //动态可扩展集合对象
object GetExpandoDynamicObject(string sql, params object[] paras) //动态可扩展集合对象 分页查询
object GetExpandoDynamicPagingList(
int pageIndex,
int pageSize,
string before,
string fields,
string from,
string where,
string group,
string order,
params object[] paras)

  

数据库主键策略

在DBFrame中类MyIdMake 自定义了主键策略。常见的主键策略自增长:缺点对于表间关系维护是个大麻烦。Guid:太长,无序导致insert性能降低。

MyIdMake是参考比较成熟的全局唯一ID生成算法生成的Id。具有一下优点:

  1. 18位数值型,类型为Int64,long,BigInt,Number(18)等数值类型
  2. 全局唯一性:不能出现重复的 ID 号;
  3. 递增:下一个 ID 一定大于上一个 ID,例如排序等特殊需求
  4. 信息安全:如果 ID 是连续的,恶意用户的爬取工作就非常容易做了

参考:https://mp.weixin.qq.com/s/8XH6oN7KR93vvyB7rcIdtw

用法:

1:在初始化时设置机器编号:MyIdMake.MyIdNo = 1;

2:MyIdMake. NewId 生成一个当前时间主键

3: long New(DateTime pointTime) //根据指定时间生成一个新的主键

主键解析:

//获取主键值中的时间
DateTime MyIdMake. GetMyIdDate(long id) //获取 某个时间点最小的Id,用于将Id作为时间查询的值,在时间查询时可通过Id大小查询(主键查询效率更高)
long MyIdMake. GetTimeQueryId (string time)

  

说明:

主键组成:yyMMdd+5位秒(距当天00:00:00秒数)+5位序号+2位机器码

每秒钟每台机器最多生成:99999个Id,超过后会阻塞当前线程,等待下一秒才生成并返回

结语

源代码托管于GitHub,供大伙学习参考,项目地址:https://github.com/keguoquan/DBFrame。感兴趣或觉得不错的望赏个star,不胜感激!

若能顺手点个赞,更加感谢!

如有疑问可以QQ咨询:343798739

实体类生成工具

支持从PowerDesign数据库设计工具以及Oracle,SQL Server,MySQL,SQLLite等数据库获取表机构并生成对应的实体类

实体生成工具,详见本人另一篇文章:https://www.cnblogs.com/keguoquan/p/14541958.html

c#数据库操作ORM映射框架的更多相关文章

  1. 关于对MyBatis.net框架的学习笔记( MyBatis.net是一款灵活性极大,sql由开发者自行在xml中编写, 轻量的ORM映射框架). 同时避免了sql硬编码到代码中不易维护的问题...

    对于为什么要用ORM,为什么又要选择MyBatis.net,这个问题希望读者自行查找资料.这里直接贴出相关的调试笔记. 步骤1)下载与引用. http://code.google.com/p/myba ...

  2. go语言数据库操作, gorm框架

    type User struct{ ID uint `gorm:"primary_key"` Name string Age int Birthday time.Time AddT ...

  3. ODB——基于c++的ORM映射框架尝试(使用)

    摘要: 2.使用 首先,需要定义一个对象,用来和数据库字段对应: [cce lang=”cpp”] #ifndef VOLUME_H #define VOLUME_H #include #includ ...

  4. 自定义注解实现简单的orm映射框架

    package com.mj; import javax.xml.bind.Element; import java.lang.annotation.*; import java.lang.refle ...

  5. Django进阶Model篇—数据库操作(ORM)

    一.数据库配置 django 默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver之类的数据库需要第三方的支持,具体详见https://docs.d ...

  6. 转:C#制作ORM映射学习笔记三 ORM映射实现

    现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这 ...

  7. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  8. PHP数据库操作:使用ORM

    之前我发了一篇博文PHP数据库操作:从MySQL原生API到PDO,向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的.本文介绍如 ...

  9. PHP-Phalcon框架中的数据库操作

    > 本文描述了PHP-Phalcon框架中数据库操作方法,主要讨论Phalcon框架的Model组件中的操作方法.更详细的Model介绍请参考:官方文档 1. 连接数据库 在Phalcon框架中 ...

  10. python【第十二篇下】操作MySQL数据库以及ORM之 sqlalchemy

    内容一览: 1.Python操作MySQL数据库 2.ORM sqlalchemy学习 1.Python操作MySQL数据库 2. ORM sqlachemy 2.1 ORM简介 对象关系映射(英语: ...

随机推荐

  1. Selenium Python 问题汇总

    1. 在自动化打开浏览器后会长时间加载,此时使用如下命令解决: driver.set_page_load_timeout(20) # 设置浏览器超时加载时间 driver.set_script_tim ...

  2. 万字图文:SaaS业务架构、价值流、业务能力、业务流程、业务对象、组织架构

    大家好,我是汤师爷~ 本文为读者提供一个SaaS业务架构的系统性框架,探讨业务架构分析的核心要素,帮助SaaS企业深入剖析目标客户的业务模式,全面理解他们的业务架构. 无论你是SaaS创业者.产品经理 ...

  3. C# HOOK 键盘事件

    C# HOOK 键盘事件 /* by: wgscd date:2023-8-15 desc: test hook in c# */ using System; using System.Collect ...

  4. Java后台管理框架的开源项目

    1.ThinkGem / JeeSite(开发人员/项目名称) JeeSite是您快速完成项目的最佳基础平台解决方案,JeeSite是您想学习Java平台的最佳学习案例,JeeSite还是接私活的最佳 ...

  5. 2025-01-18:施咒的最大总伤害。用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组 power 中,其中可能会有多个咒语具有相同的伤害值。 使用某个特定伤

    2025-01-18:施咒的最大总伤害.用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组 power 中,其中可能会有多个咒语具有相同的伤害值. 使用某个特定伤 ...

  6. .NET 中 Logger 常被忽视的方法 BeginScope

    BeginScope 方法是 .NET 中 ILogger 接口的一部分,用于创建日志记录的作用域(Scope).这种作用域可以将特定的上下文信息包含在日志中,从而提高日志的可读性和调试效率. 配置日 ...

  7. 从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群

    从DNS配置到Pacemaker部署:一步步教你在Linux平台上实现AlwaysOn集群 AlwaysOn集群是SQL Server里唯一推荐的高可用性架构, 在AlwaysOn高可用性架构中,有非 ...

  8. RabbitMq消息过期时间TTL介绍

    概述: 在rabbitmq中我们可以给消息设定过期时间LLT(Time to Live),在消息发送后过期时间段内未被消费,则系统会将其删除,被删除的消息将会进入死信队列.关于设置消息的过期时间有两种 ...

  9. 离线安装IDEA插件:详细步骤指南

    离线安装IDEA插件:详细步骤指南 网络环境下载插件包 访问 https://plugins.jetbrains.com/ 一.准备工作 找到可用的插件文件 访问 https://plugins.je ...

  10. Python代码覆盖率工具之Coverage

    Python代码覆盖率工具之Coverage 在软件开发过程中,确保代码覆盖率是质量控制的关键一环.通过测量代码覆盖率,开发者可以了解哪些部分的代码正在被测试执行,哪些部分尚未被覆盖,从而优化测试策略 ...