c#数据库操作ORM映射框架

主要功能介绍

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

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

Sql参数写法示例:

1
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)
  

修改
1
2
//修改对象,会修改所有字段
int Update(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。具有一下优点:

18位数值型,类型为Int64,long,BigInt,Number(18)等数值类型
全局唯一性:不能出现重复的 ID 号;
递增:下一个 ID 一定大于上一个 ID,例如排序c#教程等特殊需求
信息安全:如果 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值