SRF之数据访问

数据访问组件实现实体类和数据表映射、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>
View Code

 

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[selectId,Name,LoginId,Email,Phone,IM,Sex,Enabled,DepartmentId,(select name from SEC_Department where id=DepartmentId) as Departmentfrom SEC_User where 1=1and Id=:Id]]></query>
</map>
View Code

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 - 1, maxRows == null ? -1 : maxRows.Value);return sql;}public override char ParameterToken{get { return ':'; }}}
View Code

支持更多数据库:

目前框架支持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>

 

 

转载于:https://www.cnblogs.com/zengyy/p/3361104.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ 2054 Color a Tree

贪心。。。。 Color a TreeTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 6647 Accepted: 2249Description Bob is very interested in the data structure of a tree. A tree is a directed graph in which a special node is singled out, called the "ro…

php xml 空格,php闭合标签输出多余空行使xml页面显示错误的处理

在PHP官方文档中&#xff0c;曾经指出最好不要再结尾添加?>结束标记。但我们编程的习惯和使用的IDE都会为我们自动建立php结束标记?>。这个标记使用在正常情况下是不影响程序的运行的。尤其在早期的php4中&#xff0c;这种标记使用不当也不会影响最后的输出。但我最近遇…

Oil Deposits

hdu1241:http://acm.hdu.edu.cn/showproblem.php?pid1241 题意&#xff1a;就是找出有多少块有石油的区域&#xff0c;就是数组中的,这边相邻指的是是周围的八个位置。 题解&#xff1a; dfs&#xff0c;从一块油田的位子开始&#xff0c;朝着与他相邻的8个方向收索&#xff…

java.io.FileNotFoundException:/mnt/sdcard/......(Permission denied)

今天在实现下载模块的时候&#xff0c;从服务器下载apk安装的时候总是不成功。 打开LogCat查看日志&#xff0c;发现在访问sdcard的时候出现Permission denied的情况。 百度之后发现原因是没有添加权限。 解决办法是在Manifest文件里添加&#xff1a; “<uses-permission an…

详解.NET IL代码(一)

本文主要介绍IL代码&#xff0c;内容大部分来自网上&#xff0c;进行整理合并的。 一、IL简介 为什么要了解IL代码&#xff1f; 如果想学好.NET&#xff0c;IL是必须的基础&#xff0c;IL代码是.NET运行的基础&#xff0c;当我们对运行结果有异议的时候&#xff0c;可以通过IL代…

CentOS yum安装mcrypt详细图解教程[linux]

在Linux的发行版CentOS 6.3 系统下&#xff0c;LAMP(LinuxApacheMysqlphp)环境搭建好后发现PHPMyadmin提示 “无法载入mcrypt模块” 的错误感觉很不爽&#xff0c;就尝试着使用yum安装提示找不到模块。如下为执行过程&#xff1a; [rootptr228 ~]# yum install php-mcrypt Sett…

[算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

上一篇的blog地址为&#xff1a;http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题&#xff0c;在最后的编程题中竟然出现了去哪儿网开发的第一题&#xff0c;也就是简化路径值。但是这次做题后&#xff0c;我发现我上次写的那个简化源码有很多问…

java封装264成flv,将H.264封装为FLV格式-Go语言中文社区

本文将介绍如何将H.264封装成flv格式。在看本文之间&#xff0c;建议先看一看下面两篇文章&#xff1a;首先说一说构建一个FLV文件需要什么&#xff1f;FLV Header FLv script tag FLV Video tag FLV Audio tag由于这里只是封装H.264&#xff0c;所以不包括Audio tag。下面将…

[转]iis7.5+win2008 出现 HTTP Error 503. The service is unavailable.

解决&#xff1a; 应用程序池启动32位应用程序 设置托管管道为集成 &#xff08;仍然有问题&#xff09; 试试以下方法&#xff1a; http://phpwind.me/1222.html 楼主 发表于: 2011-11-26 图片:123.png 访问网站之前 应用程序池是开启的 访问后 网页报503 service unavailabl…

sublime php运行环境,sublime php 运行环境

sublime php 运行环境sublime php 运行环境有时候需要用运行一段 PHP 代码&#xff0c;比如测试某个函数返回值等等&#xff0c;如果启动Http Server&#xff0c;再打开浏览器&#xff0c;那黄花菜都凉了。我们可以在 Sublime Text 3 中创建 php 的 build system&#xff0c;这…

用Java写有关早上的语录,实用的适合早上发的早安问候语语录汇编39句

实用的适合早上发的早安问候语语录汇编39句不管梦想是什么&#xff0c;只有带着淡然的态度&#xff0c;做好当前的事情。早安&#xff01;下面是小编精心准备的适合早上发的早安问候语39句,欢迎大家前来欣赏。1、世上除了生死&#xff0c;其它都是小事。不管遇到了什么烦心事&a…

JQuery合并表格单元格

转&#xff1a;http://www.cnblogs.com/xuguoming/p/3412124.html JQuery合并表格单元格 一、需求 如果存在一个表格&#xff0c;想把其中某一列内容相同的部分合并单元格&#xff0c;用JQ动态如何操作&#xff0c;原始表格如下&#xff1a; 合并单元格之后的表格如下&#xff…

[音视频]H264码流分析工具

[音视频]H264码流分析工具 CTI-TS EasyICE Elecardstreameyetools VideoEye H264VideoESViewer 学习H264码流&#xff0c;H264码流进行分析 http://blog.csdn.net/leixiaohua1020/article/details/17933821 H264BSAnalyzer https://github.com/latelee/H264BSAnalyzer.g…

手机型号识别 手机PID UID 驱动识别 数据库包

主要用在手机驱动识别,列如手机助手开发,都需要用到这个.QQ9711-5034 整套数据库以及源码包含如下&#xff1a; 1&#xff09; 包含1160 张手机外壳图片&#xff0c;78 个手机驱动文件。 2&#xff09; 支持192 个品牌&#xff0c;2293 款手机&#xff0c;还有山寨机没有统计进…

Chart.js学习

一、简介 Chart.js是一个基于HTML5的简单的面向对象的图表库&#xff0c;支持包括IE7和8的所有现代浏览器。图表库中有6种表&#xff0c;分别是&#xff1a;曲线图&#xff08;Linecharts&#xff09;、柱状图&#xff08;Barcharts&#xff09;、雷达图&#xff08;Radarchart…

php将图片导入,php中图片文件的导入,上传与下载

---------------------------------------------图片的导入-------------------------------------------------------------------图片的上传与下载上传图片:序号图片添加时间操作//打开目录$diropendir("./images");//遍历目录$i;while($freaddir($dir)){if($f!&qu…

用parsetInt解析数字,并求和

实现代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml" xml:lang"en"> <h…

oracle arp绑定mac地址,使用ARP命令来绑定IP和MAC地址

使用ARP命令来绑定IP和MAC地址前言&#xff1a;我本来没有想过写关于ARP绑定的文章&#xff0c;坦白的说一句&#xff0c;在你理解ARP工作的原理时&#xff0c;这其实比较简单。只是看到最近论坛很多人在问关于绑定IP和MAC地址的问题&#xff0c;所以才决定写这个文章&#xff…

阿里巴巴2013年实习生笔试题A

一、单项选择题 1.下列说法不正确的是&#xff1a;&#xff08;B&#xff09; A.SATA硬盘的速度速度大约为500Mbps/s B.读取18XDVD光盘数据的速度为1Gbps C.前兆以太网的数据读取速度为1Gpbs D.读取DDR3内存数据的速度为100Gbps 解析&#xff1a;有说B的&#xff0c;有说D的&am…

linux之间安全传输文件,使用SCP安全地传输文件[Linux] | MOS86

终端访问远程Linux机器的最常见方法是使用安全Shell(SSH)。要工作&#xff0c;Linux服务器需要运行SSH服务器(OpenSSH)&#xff0c;另一端需要一个SSH客户端&#xff0c;像Windows中的PuTTy&#xff0c;或者Linux上的ssh命令行工具&#xff0c;或者其他类似Unix的操作系统&…