FoxOne---一个快速高效的BS框架--(1)

FoxOne---一个快速高效的BS框架--(2)

FoxOne---一个快速高效的BS框架--(3)

FoxOne---一个快速高效的BS框架--(4)

FoxOne---一个快速高效的BS框架--WEB控件属性编辑器

FoxOne---一个快速高效的BS框架--数据访问(Dao)

FoxOne---一个快速高效的BS框架--生成增删改查

数据访问组件并非本人原创,本人是在前人的代码的基础之上稍加改良。

一切都从一个Blog类开始:

先简单介绍一下上述类中各Attribute的意义

1.Table("BL_Blog")是表明该实体对应的数据表为BL_Blog,如果表名与实体名一致,则可以不用声明;

2.[PrimaryKey]特征表明该属性为主健;

3.[Column(DataType="varchar",Length="300")]特征声明当前属性在创建数据库字段时对应的类型和长度;

4.[Column(Update=false)]声明当前属性在更新时不用更新该属性;

下面我们就开始在代码中使用定义好的Blog类

------------------------------------------------------------------------------

根据实体创建表结构的代码为:

FoxOne.Data.Dao.Get().CreateTable<Blog>();

插入Blog数据的代码为:

                FoxOne.Data.Dao.Get().Insert(new Blog()
{
Id = Guid.NewGuid().ToString(),
BrowseCount = ,
Content = "world",
Title = "hello",
CreateTime = DateTime.Now,
CreatorId = Security.Sec.User.Id,
LastUpdateTime = DateTime.Now
});

根据ID更新Blog数据的代码为:

                FoxOne.Data.Dao.Get().Update<Blog>(new Blog()
{
Id = id,
LastUpdateTime = DateTime.Now,
Title = "hello1"
});

根据当前用户ID批量更新Blog的代码为:

                FoxOne.Data.Dao.Get().BatchUpdate<Blog>(new { CreatorId = Security.Sec.User.Id }, new
{
LastUpdateTime = DateTime.Now,
Title = "hello1"
});

删除单条Blog数据:

FoxOne.Data.Dao.Get().Delete<Blog>(id);

批量删除Blog数据的代码为:

FoxOne.Data.Dao.Get().BatchDelete<Blog>(new { CreatorId=Security.Sec.User.Id});

获取单条Blog数据的代码为:

var blog = FoxOne.Data.Dao.Get().Get<Blog>(id)

获取全部Blog数据的代码为:

var blogs = FoxOne.Data.Dao.Get().Select<Blog>();

获取当前登陆用户创建的所有Blog数据的代码为:

var blogs = FoxOne.Data.Dao.Get().Select<Blog>(new { CreatorId = Security.Sec.User.Id });

代码中出现的Security.Sec.User是当前登陆用户的IUser对象,里面有Id,Name,Roles,Department等丰富的上下文信息可以使用。

当然传的参数也能是数组,生成的语句也变相应的变成IN

var blogs = FoxOne.Data.Dao.Get().Select<Blog>(new { BrowseCount = new int[] { , ,  } });

自定义SQL语句查询批量Blog数据的代码为:

1.首先在配置文件中增加自定义的SQL语句

  <command key="foxone.business.blog.selectByCondition">
<![CDATA[
SELECT * FROM BL_Blog WHERE BrowseCount>100 AND CreatorId=#CreatorId#
]]>
</command>

2.在代码中使用定义好的语句

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition", new { CreatorId = Security.Sec.User.Id });

Dao有自动从环境变量中求解值的功能,所以上面的语句又可以简化为

  <command key="foxone.business.blog.selectByCondition">
<![CDATA[
SELECT * FROM BL_Blog WHERE BrowseCount>100 AND CreatorId=#Env:User.Id#
]]>
</command>

这样的代码中调用此SQL时就不用再传递CreatorId

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition");

上述SQL中出现的Env环境变量是通过Unity注册进去的

ObjectHelper.RegisterType<ISqlParameters, EnvParameters>("Env");

EnvParameters的代码如下:

    public class EnvParameters : ISqlParameters
{
public const string Prefix = "Env:";
private static readonly int PrefixLength = Prefix.Length;
public object Resolve(string name)
{
object value;
return TryResolve(name, out value) ? value : null;
} public bool TryResolve(string name, out object value)
{
if (name.ToUpper().StartsWith(Prefix.ToUpper()))
{
string varName = name.Substring(PrefixLength);
return Env.TryResolve(varName, out value);
}
value = null;
return false;
}
}

如果需要扩展更加丰富的环境变量支持,只需要实现如下接口:

namespace FoxOne.Data
{
public interface ISqlParameters
{
object Resolve(string name); bool TryResolve(string name, out object value);
}
}

此外DAO支持动态SQL语句:

  <command key="foxone.business.blog.selectByCondition">
<![CDATA[
SELECT * FROM BL_Blog WHERE 1=1
{? AND Title LIKE '%$Title$%' }
{? AND CreatorId=#CreatorId# }
{? AND BrowseCount>#Count# }
]]>
</command>

所谓的动态SQL,就是根据你在代码中传的参数来动态接拼SQL语句

当代码中这样调用时:

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition");

则执行的SQL语句为

SELECT * FROM BL_Blog WHERE 1=1

而当代码中这样调用时:

var blogs = FoxOne.Data.Dao.Get().QueryEntities<Blog>("foxone.business.blog.selectByCondition", new { Title="今天"});

则执行的SQL语句为:

SELECT * FROM BL_Blog WHERE 1=1 AND Title LIKE '%今天%'

除此之外还可以按页获取数据

                var blogs = FoxOne.Data.Dao.Get().PageQueryEntities<Blog>(
"foxone.business.blog.selectByCondition",
,
,
"CreateTime DESC",
new { Title = "今天" });

所有DAO自动生成的SQL都会自动兼容不同的数据库产品,自定义的SQL则可以存在不同后缀名的config文件中,Blog.Oracle.Config文件中的SQL都是给Oracle环境下使用的,Blog.MySQL.config文件中的SQL都是在MYSQL环境下使用的。

最后DAO还有查询其它类型的结果的方法,如下:

        /// <summary>
/// 查询多条数据,并以IDataReader返回
/// </summary>
/// <param name="sql">select sql语句</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以IDataReader返回结果集</returns>
public abstract IDataReader QueryReader(string sql, object parameters = null); /// <summary>
/// 查询多条数据,并以DataSet返回
/// </summary>
/// <param name="sql">select sql语句</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以DataSet返回结果集</returns>
public abstract DataSet QueryDataSet(string sql, object parameters = null); /// <summary>
/// 查询多条数据,并以IDictionary为元素的IList返回
/// </summary>
/// <param name="sql">select sql语句</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以IDictionary为元素的IList返回结果集,数据不存在则返回空IList</returns>
public abstract IList<IDictionary<string, object>> QueryDictionaries(string sql, object parameters = null); /// <summary>
/// 查询单条数据,并以IDictionary返回
/// </summary>
/// <param name="sql">查询单条数据的select sql语句</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以IDictionary返回单条数据,数据不存在则返回Null</returns>
public abstract IDictionary<string, object> QueryDictionary(string sql, object parameters = null); /// <summary>
/// 查询单条数据,并以实体类返回
/// </summary>
/// <typeparam name="T">实体类类型</typeparam>
/// <param name="sql">查询单条数据的select sql语句(字段名必须与实体类属性名一致)</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以实体类返回单条数据,数据不存在则返回Null</returns>
public abstract T QueryEntity<T>(string sql, object parameters = null) where T : class, new(); /// <summary>
/// 查询单条数据,并以实体类返回
/// </summary>
/// <typeparam name="T">实体类类型</typeparam>
/// <param name="type">实体类接口</param>
/// <param name="sql">查询单条数据的select sql语句(字段名必须与实体类属性名一致)</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以实体类返回单条数据,数据不存在则返回Null</returns>
public abstract T QueryEntity<T>(Type type, string sql, object parameters = null); /// <summary>
/// 执行select sql语句,检查是否有数据返回
/// </summary>
/// <param name="sql">select sql语句</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>True有数据 false没有数据</returns>
public abstract bool Exists(string sql, object parameters = null); /// <summary>
/// 查询单条数据的单个字段
/// </summary>
/// <typeparam name="T">单个字段的返回类型</typeparam>
/// <param name="sql">查询单个字段的sql语句</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以指定的类型返回制定字段。在查询出来字段值为空的情况时,如果指定以string或其他类型返回,则返回null,如果以int等数值型类型返回,则返回0</returns>
public abstract T QueryScalar<T>(string sql, object parameters = null); /// <summary>
/// 查询多条数据的单个字段
/// </summary>
/// <typeparam name="T">单个字段的返回类型</typeparam>
/// <param name="sql">查询多条数据单个字段的sql语句</param>
/// <param name="parameters">普通Object或者IDictionary,分别通过属性名和Key与sql中的参数名匹配</param>
/// <returns>以制定元素的IList返回多条数据的单个字段,数据不存在在返回空IList</returns>
public abstract IList<T> QueryScalarList<T>(string sql, object parameters = null);

github:https://github.com/gameking0124/FoxOne

FoxOne---一个快速高效的BS框架--数据访问(Dao)的更多相关文章

  1. FoxOne---一个快速高效的BS框架--生成增删改查

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  2. FoxOne---一个快速高效的BS框架--(2)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  3. FoxOne---一个快速高效的BS框架

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  4. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  5. FoxOne---一个快速高效的BS框架--(4)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  6. MyBatis框架的XML数据访问Dao层接口的组合使用

    MyBatis 的前生为Apache的开源项目iBatis.其优势在于灵活,几乎可以替代JDBC,同时提供了编程接口.目前MyBatis的数据访问Dao层不需要实现类,也不需要像JDBC那样拼接Hql ...

  7. Spring Boot框架 - 数据访问 - 整合Mybatis

    一.新建Spring Boot项目 注意:创建的时候勾选Mybatis依赖,pom文件如下 <dependency> <groupId>org.mybatis.spring.b ...

  8. Spring Boot框架 - 数据访问 - JDBC&自动配置

    一.新建Spring Boot 工程 特殊勾选数据库相关两个依赖 Mysql Driver — 数据库驱动 Spring Data JDBC 二.配置文件application.properties ...

  9. 一个类GraphQL的ORM数据访问框架发布

    Zongsoft.Data 发布公告 很高兴我们的 ORM 数据访问框架(Zongsoft.Data)在历经两个 SaaS 产品的应用之后,今天正式宣布对外推广! 这是一个类 GraphQL 风格的  ...

随机推荐

  1. windbg内存查看(d*)

    d*命令 d{a|b|c|d|D|f|p|q|u|w|W} Address [/c ColumuWidth] [l Length] Address:查看address地址处的内存. ColumnWid ...

  2. VMware Workstation 12 Pro 之安装林耐斯StartOS X64系统

    VMware Workstation 12 Pro 之安装林耐斯StartOS X64系统... ---------------- 先去下载系统暗中包ISO   网址:http://www.xiaza ...

  3. hdu 6171---Admiral(双向搜索)

    题目链接 Problem Description Suppose that you are an admiral of a famous naval troop. Our naval forces h ...

  4. Django项目之小博客

    学习了几天Django,学着做了一个简易的小博客,主要用来练习Django基本的操作. 主要用到的命令和Django包.模块等: django.urls.url django.urls.import ...

  5. C语言:freopen函数

    当我们求解acm题目时,通常在设计好算法和程序后,要在调试环境(例如VC等)中运行程序,输入测试数据,当能得到正确运行结果后,才将程序提交到oj中.但由于调试往往不能一次成功,每次运行时,都要重新输入 ...

  6. redis 介绍和常用命令

    redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...

  7. [2014-08-24]为 Xamarin Studio 创建的 Asp.Net Mvc 项目配置 gitignore

    今天在尝试 Mac 下使用 Xamarin Studio (以下简称XS) 开发 Asp.Net Mvc 项目,发现XS没启用版本控制,故自己去命令行下使用 git init,想到需要一个.gitig ...

  8. jmeter日记

    1.不要像loadrunner一样使用集合点,jmeter不需要 2.性能测试 线程组设置的时候 永远 3.启动jmeter之后,打开log 4.分布式的话 tps是多台电脑的tps之和 自动加好了的 ...

  9. eclipse创建的maven项目无法部署到tomcat

    今天在eclipse中创建了个maven项目,想运行起来看看,发现代码开发完成后无法发布到tomcat. 解决办法如下: 第一种: 选中项目-右键属性-Project Facets 勾选上面三项并选择 ...

  10. MySQL的JOIN(三):JOIN优化实践之内循环的次数

    这篇博文讲述如何优化内循环的次数.内循环的次数受驱动表的记录数所影响,驱动表记录数越多,内循环就越多,连接效率就越低下,所以尽量用小表驱动大表.先插入测试数据. CREATE TABLE t1 ( i ...