ORM之二:核心接口与扩展操作
一、数据库提供者接口
/// <summary>
/// 数据库提供者
/// </summary>
public interface IDbProvider : IDisposable
{
/// <summary>
/// 初始化数据库连接信息
/// </summary>
/// <param name="dbConnInfo"></param>
/// <returns></returns>
IDbProvider Init(DbConnInfo dbConnInfo); /// <summary>
/// 获取Lambda语法的数据操作对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
IReqository<T> GetReqository<T>() where T : class, new(); ///<summary>
/// 获取Linq语法的数据查询对象
///</summary>
///<typeparam name="T"></typeparam>
///<returns></returns>
IQuery<T> GetQuery<T>() where T : class, new(); ///<summary>
/// 扩展操作
///</summary>
///<returns></returns>
IDbExtension GetDbExtension(); /// <summary>
/// 事务开启
/// </summary>
void Begin(); /// <summary>
/// 事务提交
/// </summary>
void Commit(); /// <summary>
/// 事务回滚
/// </summary>
void Rollback(); } ///<summary>
/// 扩展数据库提供者
///</summary>
internal interface IDbProviderExtend : IDbProvider
{
IDbExecutor DbExecutor { get; }
}
二、单表操作
/// <summary>
/// 标准的数据层接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IReqository<T> where T : class
{
/// <summary>
/// 新增实体对象
/// </summary>
/// <param name="entity">实体对象</param>
void Insert(T entity); /// <summary>
/// 批量新增实体对象
/// </summary>
/// <param name="entitys"></param>
void Insert(IList<T> entitys); /// <summary>
/// 根据条件表达式自动删除对应数据
/// </summary>
/// <param name="where"></param>
/// <returns></returns>
int Delete(Expression<Func<T, bool>> where); /// <summary>
/// 根据条件表达式将映射对象的数据进行局部更新
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="update"></param>
/// <param name="where"></param>
/// <returns></returns>
int Update<TResult>(Expression<Func<T, TResult>> update, Expression<Func<T, bool>> where) where TResult : class; /// <summary>
/// 根据条件表达式获得[Top 1]实体对象
/// </summary>
/// <param name="where"></param>
/// <param name="nolock">是否允许脏读</param>
/// <returns></returns>
T Single(Expression<Func<T, bool>> where, bool nolock = false); /// <summary>
/// 根据条件表达式获得实体对象列表
/// </summary>
/// <param name="where">条件表达式</param>
/// <param name="nolock">是否允许脏读</param>
/// <returns></returns>
IList<T> Select(Expression<Func<T, bool>> where, bool nolock = false); /// <summary>
/// 根据条件表达式获得指定记录的条数
/// </summary>
/// <param name="where"></param>
/// <param name="nolock">是否允许脏读</param>
/// <returns></returns>
int Count(Expression<Func<T, bool>> where, bool nolock = false); /// <summary>
/// 根据条件表达式获取某列的和
/// </summary>
/// <param name="select"></param>
/// <param name="where"></param>
/// <param name="noLock"></param>
/// <returns></returns>
object Sum<TResult>(Expression<Func<T, TResult>> select, Expression<Func<T, bool>> where, bool noLock = false); }
三、多表操作
///<summary>
/// 多表查询对象接口
///</summary>
///<typeparam name="T">数据实体</typeparam>
public interface IQuery<out T> : IOrderedQueryable<T>
{
} ///<summary>
/// IQuery的扩展方法
///</summary>
public static class Query
{
///<summary>
/// 分页功能
///</summary>
///<param name="source"></param>
///<param name="rowCount">每页的行数</param>
///<param name="pageNumber">第几页</param>
///<typeparam name="TSource"></typeparam>
///<returns></returns>
public static IQueryable<TSource> Page<TSource>(this IQueryable<TSource> source, int rowCount, int pageNumber)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return source.Provider.CreateQuery<TSource>(Expression.Call(null,
((MethodInfo) MethodBase.GetCurrentMethod()).MakeGenericMethod(new Type[]
{
typeof (TSource)
}),
new Expression[]
{
source.Expression,
Expression.Constant(rowCount),
Expression.Constant(pageNumber)
}));
} ///<summary>
/// 扩展join功能
///</summary>
///<param name="source"></param>
///<param name="joins"></param>
///<typeparam name="TSource"></typeparam>
///<returns></returns>
public static IQueryable<TSource> SetJoinMode<TSource>(this IQueryable<TSource> source, params JoinMode[] joins)
{
if (source == null)
{
throw new ArgumentNullException("source");
} return source.Provider.CreateQuery<TSource>(Expression.Call(null,
((MethodInfo) MethodBase.GetCurrentMethod()).
MakeGenericMethod(new Type[] {typeof (TSource)}),
new Expression[]
{
source.Expression,
Expression.Constant(joins)
}));
}
} ///<summary>
///</summary>
public enum JoinMode
{
///<summary>
/// 内连接
///</summary>
Inner, ///<summary>
/// 左连接
///</summary>
Left, ///<summary>
/// 右连接
///</summary>
Right, ///<summary>
/// 全连接
///</summary>
Full
}
四、扩展操作
/// <summary>
/// 扩展操作
/// </summary>
public interface IDbExtension
{
/// <summary>
/// 执行存储过程返回影响行数
/// </summary>
/// <param name="name"></param>
/// <param name="parameters"></param>
/// <returns></returns>
int ExcuteProcNonQuery(string name, DbParameterCollection parameters = null); /// <summary>
/// 执行存储过程返回DataSet
/// </summary>
/// <param name="name"></param>
/// <param name="parameters"></param>
/// <returns></returns>
DataSet ExcuteProcQuery(string name, DbParameterCollection parameters = null); /// <summary>
/// 执行存储过程返回泛型集合
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="name"></param>
/// <param name="parameters"></param>
/// <returns></returns>
IList<TResult> ExcuteProcReader<TResult>(string name, DbParameterCollection parameters = null); /// <summary>
/// 执行sql语句返回影响行数
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
int ExcuteNonQuery(string sql, DbParameterCollection parameters = null); /// <summary>
/// 执行sql语句返回DataSet
/// </summary>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
DataSet ExcuteQuery(string sql, DbParameterCollection parameters = null); /// <summary>
/// 执行sql语句返回泛型集合
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="sql"></param>
/// <param name="parameters"></param>
/// <returns></returns>
IList<TResult> ExcuteQuery<TResult>(string sql, DbParameterCollection parameters = null);
}
ORM之二:核心接口与扩展操作的更多相关文章
- Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置
Servlet3.0版本对Servlet配置进行了重大变革,Servlet类不需要再麻烦的去编辑web.xml文件了,只需要在类上面进行注释就可以了,获得了 Java 社区的一片赞誉之声,以下是新增的 ...
- Hibernate(三)__核心接口和类
该图显示了核心接口类以及配置文件的关系层次,越往下越偏向底层数据库. 1. hibernate.cfg.xml文件 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下, ...
- Hibernate详解(5)——Hibernate核心接口和工作原理
Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...
- Spring Boot REST(一)核心接口
Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...
- Hibernate 之核心接口
1.持久化和ORM 持久化是指把数据(内存中的对象)保存到可持久保存的存储设备中(如硬盘),主要应用于将内存中的数据存储到关系型数据库中,在三层结构中,持久层专注于实现系统的逻辑层面,将数据使用者与数 ...
- 深入解析Hibernate核心接口
Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate核心接口,包括介绍SessionFactory接口.Query和Criteria接口等方面. Session 接口对于Hibe ...
- Hibernate核心接口和工作原理
Hibernate核心接口和工作原理 Hibernate有五大核心接口,分别是:Session .Transaction .Query .SessionFactory .Configuration . ...
- spring源码系列(二):IOC接口设计分析
这里主要对springIOC接口体系进行简单的概述和分析,具体每个接口详细分析在下面目录: 参考内容: <Spring技术内幕:深入解析 Spring架构与设计原理> 和 <Spri ...
- 【Spring】Spring的事务管理 - 1、Spring事务管理概述(数据库事务、Spring事务管理的核心接口)
Spring事务管理概述 文章目录 Spring事务管理概述 数据库事务 什么是Spring的事务管理? Spring对事务管理的支持 Spring事务管理的核心接口 Platform Transac ...
随机推荐
- Git版本控制使用介绍
Git是什么? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git与SVN的最主要的区别? Git是分布式的,SVN不是 Git没有一个全局的版本号,而SVN有 ...
- poj1195Mobile phones(二维树状数组)
http://poj.org/problem?id=1195 模版题 i写成k了 找了一个多小时没找出来.. #include <iostream> #include<cstring ...
- poj 3274 Gold Balanced Lineup(哈希 )
题目:http://poj.org/problem?id=3274 #include <iostream> #include<cstdio> #include<cstri ...
- js实现对数据库的增删查改
1.查询 复制代码 代码如下: <HTML> <HEAD> <TITLE>数据查询</TITLE> <Script > var conn = ...
- POJ 3436 ACM Computer Factory (拆点+输出解)
[题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...
- PostgreSql字符串函数和操作符
本节描述了用于检查和操作字符串数值的函数和操作符.在这个环境中的字符串包括所有 character, character varying, text 类型的值.除非另外说明,所有下面列出的函数都可以处 ...
- 基于WebForm+EasyUI的业务管理系统形成之旅 -- ParamQueryGrid行、列合并(Ⅸ)
上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划查询(Ⅷ)>,主要介绍通过报表工具数据钻取,获取施工计划详细信息. 这篇我们看看ParamQueryGrid[行 ...
- poj 3279 Fliptile
题意:一个n * m的棋盘,0或1,每次改变一个格子时同时改变上下左右的格子,问用最少次数将棋盘全变成0的策略. 题解:用二进制压缩第一行更改的状态,之后遍历棋盘,如果当前格子为1则改变下方的格子,记 ...
- Memcache缓存与Mongodb数据库的优势和应用
先说说自己对 Memcache和Mongodb的一些看法,主要是抛砖引玉了,希望看到大家的意见和补充. Memcache Memcache的优势我觉得总结下来主要体现在: 1) 分布式.可以由10台拥 ...
- volatile之一--volatile不能保证原子性
Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这 ...