数据访问组件实现实体类和数据表映射、SQL语句配置执行、动态sql语句等功能,ORM方式能实现简单的对象和表的映射(配置类似hibernate),但比较单一(不支持一对多、多对多的情况),下边不做介绍,采用配置SQL语句的方式更灵活强大,可实现sql语句的集中管理、动态的sql语句以及对象和SQL语句的映射。

如何使用

配置文件

data.config:配置数据库访问相关信息,配置文件放站点的bin目录下,详细说明如下

<?xml version="1.0" encoding="utf-8" ?>
<config xmls="urn:entlib.data-config">
<!--sql语句目录,映射文件目录,可以用相对目录-->
<property name="mappingdir">/map</property>
<!--枚举型是否用整形表示(即在枚举型用整形保存到数据库)true,false,默认false-->
<property name="enumasint">false</property>
<!--是否记录日志(true,false),默认true-->
<property name="Logging">true</property>
<!--数据库链接字符串,注意不包含Provider(连接多个数据库时添加多个connection)-->
<connection name="" dbtype="mssql">
Data Source=localhost;Initial Catalog=gh_oms;User ID=sa;Password=1
</connection>
</config>

SQL配置文件

sql配置文件所在的目录在data.config的mappingdir定义,也可放在mappingdir的子目录,

文件名:xxx.map.xml

<?xml version="1.0" encoding="utf-8" ?>
<map xmlns="urn:srf.data-mapping">
<query name="admin.user.get">
<![CDATA[
select
Id,Name,LoginId,Email,Phone,IM,Sex,Enabled,DepartmentId,
(select name from SEC_Department where id=DepartmentId) as Department
from SEC_User where 1=1
and Id=:Id
]]>
</query>
</map>

name:sql语句的名称,必须在所有的映射文件中是唯一的,命名建议:模块.对象.操作

mode:语句解析方式

  • 默认写法(mode="")
    参数:用:xxxx 参数用:前缀,不区分大小写,字符串参数$xxxx$将用字符串替换
    动态sql:在{ }里边的参数(只要有一个参数)如果没有值 则该部分语句将移除。 不支持字符串参数。
  • velocity写法 (mode="velocity")
    采用velocity的语法编写,提供扩展函数 util.IsNullOrEmpty()

调用

引用 SRF.Data.dll
调用代码:
readonly Data.DBHelperBase dbhelper = Data.DBHelperFactory.GetDBHelper();
dbhelper.GetQuery("admin.user.insert").SetParameter(user).Execute();

补充

(1)模糊查询

目前不支持在配置的语句中给参数加上通配符,模糊查询时您需要在代码里边给参数值加上通配符,如果是SRF.UI.DataSource查询列表可参考下边代码

SRF.UI.DataSource datasource = new UI.DataSource("admin.user.list", "admin.user.count", m => { m.Like("name"); });//给参数name的值加上通配符

(2)全局参数

除了调用时传递参数外,你也可以添加一些全局参数(每次调用都自动传递这些参数),做法如下:

SRF.Data.Query.AddParameter("user.id", SRF.Security.SecurityContext.User.Id);// 添加当前用户id作为全局参数

在配置语句时可以这么写

select*from post where userid=@user.id

目前系统默认添加的有当前用户信息的参数(user.id,user.loginid,user.username),你可以在配置语句时使用这3个参数。

关于事务

SRF.Data库本身不提供事务的支持,可用TransactionScope实现(请确保web服务器和数据库服务器的运行msdtc服务)

示例代码如下:

using (TransactionScope transationScope = new TransactionScope(TransactionScopeOption.Required))
{
dbhelper.GetQuery("admin.dictionary.delete").SetParameter("Id", id).Execute();
transationScope.Complete();
}

SQL语句生成

数据库访问配置的语句可以用CodeSmith来生成,下载CodeSmith模板

如何实现

1、语句的解析

第1步对配置的sql做解析:根据参数将配置语句解析成可语法正确的带参数的sql语句,解析器实现ISQLParser接口。SRF.Data自带2种解析器,DefaultSQLParser和VelocitySQLParser,DefaultSQLParser采用正则表达式对配置的语句做解析,VelocitySQLParser采用NVelocity模板语言的语法解析(这种方式可以实现比较复杂的语句,但效率相对较低)。
第2步解析语句中的参数以及传递过来的参数列表生成DbCommand,参考Query.BuildCommand()

自定义sql解析器:

(1)  实现ISQLParser接口

    public interface ISQLParser
{
string Parse(string sql, IDictionary<string, object> parameters, char parameterToken);//根据参数解析sql,返回可执行的sql语句
}

(2)  SQLParserFactory.Register()注册SQL解析器

(3)  在映射文件中写明解析器的key
  <query name="admin.user.insert" mode="解析器的SqlKey">

2、数据库操作

数据库的访问和语句执行在Database类实现,由于不同数据库的Provider和语句有所差别,所以不同的数据库要继承Database,例如MySql

public class MySqlDatabase : Database
{
public MySqlDatabase(string connectionString)
: base(connectionString, MySql.Data.MySqlClient.MySqlClientFactory.Instance)
{
}
public override string BuildPageSql(string sql, int startRow, int? maxRows,string orderBy="")
{
sql += string.Format(" limit {0},{1}", startRow - , maxRows == null ? - : maxRows.Value);
return sql;
}
public override char ParameterToken
{
get { return ':'; }
}
}

支持更多数据库:

目前框架支持mssql、mysql、sqlite数据库,你也可以扩展增加其它数据库的支持

1、继承SRF.Data.Impl.Database

Database实现具体的数据库操作,包括数据库连接和语句执行

2、注册Database

SRF.Data.Impl.DatabaseFactory.Register()

3、调用

在data.cfg.xml配置文件中填写数据库类型(和Register方法的参数key一致)

<property name="dbtype">mssql</property>

SRF之数据访问的更多相关文章

  1. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  2. 高性能Javascript--高效的数据访问

    接上一篇,希望能写一个高性能Javascript专题. 第一篇:高性能Javascript--脚本的无阻塞加载策略. 参考摘录<高性能Javascript>. 经典计算机科学的一个问题是, ...

  3. 解析大型.NET ERP系统数据访问 对象关系映射框架LLBL Gen Pro

    LLBL Gen Pro是一个为.NET开发人员设计的的对象关系映射(ORM)框架,与NHibernate,Entity Framework等框架一样,通过实体与数据表的映射,实现关系数据库持久化. ...

  4. 架构从最简单的数据访问框架(ORM)到资源调度和治理中心(SOA)说起

    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构当网站流量很小时,只需一个应用,将 ...

  5. ADO.NET数据访问模板整理

    /// <summary> /// 数据访问类:hi_test /// </summary> public partial class TestDA { public Test ...

  6. ADO.NET数据访问技术

    ADO.NET数据访问技术 就是将C#和MSSQLl连接起来的纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用.是所有数据访问技术的基础. A ...

  7. Oracle数据访问组件ODAC的安装方法

    Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...

  8. 分享自己的超轻量级高性能ORM数据访问框架Deft

    Deft 简介 Deft是一个超轻量级高性能O/R mapping数据访问框架,简单易用,几分钟即可上手. Deft包含如下但不限于此的特点: 1.按照Transact-SQL的语法语义风格来设计,只 ...

  9. 在 ASP.NET 中创建数据访问和业务逻辑层(转)

    .NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...

随机推荐

  1. IOS开发-jqeurey mobile

    有一阵子没写东西了,最近打算重新拾起开发,做点手机上的东东,选中了phonegap.jquery mobile,phonegap的部署网上非常多,有空了再班门弄斧,这里先记下jquery mobile ...

  2. IOS键盘的相关设置(UITextfield)

    一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault,                // 默认键盘:支持所有字符 UIKeyboa ...

  3. CSS3 border-radius 属性和CSS outline 属性

    CSS3 border-radius 属性 border-radius 属性是一个简写属性,用于设置四个 border-*-radius 属性. 提示:该属性允许为元素添加圆角边框! 注释:按此顺序设 ...

  4. gcc编译, gdb调试, makefile写法

    //test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...

  5. 开发者眼中最好的 22 款 GUI 测试工具

    1.Abbot - Java GUI 测试框架 Abbot是一个基于GUI的简单的Java测试框架,它能够帮助开发者测试Java用户界面. 它提供事件自动生成和验证Java GUI组件,使您能够轻松地 ...

  6. Weblogic发布小问题——The root element weblogic-web-app is missing in the descriptor file

    前几天发布项目遇到这样一个小错误,在此记录一下,以便加深一点印象,下次好解决类似的问题! (对应的应用服务器是WebLogic Server 版本: 10.3.6.0,应用是以文件夹的形式发在服务器的 ...

  7. GLES & Shader Language 易错集锦

    1. vertex shader 和 fragment shader 通过varying变量传递数据,  如下代码在编译fragment shader时候会提示编译错误 vertex shader F ...

  8. WPF学习系列之八(形状,画刷和变换)

    形状,画刷和变换   概述: 在许多用户界面技术中,普通控件和自定义绘图之间具有清晰的区别.通常来说,绘图特性只用于特定的应用程序--如游戏,数据可视化和物理仿真等.而WPF具有一个非常不同的原则.它 ...

  9. MySQL:MySQL和SQL Server的区别

    导读:接下来的网上商城的项目,需要用到MySQL数据库了.这个对于我来说,是一个新接触的东西,按照惯例,在刚开始学习一个东西的时候,先从宏观上去了解它.本篇博客,先介绍SQL Server的基本内容, ...

  10. Hadoop SecondaryNameNode备份及恢复

    1.同步各个服务器时间 yum install ntp ntpdate ntp.fudan.edu.cn hdfs-site.xml配置 如果没有配置这一项,hadoop默认是0.0.0.0:5009 ...