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,一经查实,立即删除!

相关文章

java 抽象类 方法_java 抽象类

Java为什么使用抽象类和接口Java接口和Java抽象类代表的就是抽象类型&#xff0c;就是我们需要提出的抽象层的具体表现。OOP面向对象的编程&#xff0c;如果要提高程序的复用率&#xff0c;增加程序的可维护性&#xff0c;可扩展性&#xff0c;就必须是面向接口的编程&#xff…

JQuery Show()的几种效果

1 show()方法和hide()方法 $("selector").show() 从display:none还原元素默认或已设置的display属性$("selector").hide() 设置元素的display样式为none&#xff0c;等于$("selector").css("display","none")&#xff…

java 创建servlet出错_java-创建applicationContext.xml时出错:在Servlet...

我正在尝试使用Spring和Hibernate配置Java MVC Web应用程序,但是当我运行服务器时出现此错误,并且我不知道这是什么问题.ERROR: org.springframework.web.context.ContextLoader - Context initialization failedorg.springframework.beans.factory.BeanCreationException: Err…

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多进程并发,php多进程模拟并发事务

用实例代码给大家介绍关于php多进程模拟并发事务产生的一些问题&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说了&#xff0c;来一起看看详细的介绍吧数据表drop table if exists test;create table if not exists test (id int not null auto_increment ,count …

查看数据库中有哪些活动的事务,对应的会话id,执行的语句

select dbt.database_id,DB_NAME(dbt.database_id) 数据库名,dbt.transaction_id,at.name,at.transaction_begin_time,case at.transaction_type --事务类型 when 1 then 读/写事务 when 2 then 只读事务 when 3 then 系统事务 when 4 then 分布式事务 end trans…

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…

apache配置php版本,apache配置支持多版本php

首先在apache2配置目录中建立虚拟主机配置文件如下ServerName gzshes.localhostDocumentRoot "/var/www/gzshes"DirectoryIndex index.html index.phpOptions Indexes FollowSymLinks ExecCGIAllowOverride AllRequire all granted#下面为URL静态重写环境的配置&…

php批量采集电视剧,如何通过PHP多线程批量采集下载远程网站图片代码实例

/*** curl 多线程* author http://www.lai18.com* param array $array 并行网址* param int $timeout 超时时间* return mix*/public function Curl_http($array,$timeout15){$res array();$mh curl_multi_init();//创建多个curl语柄foreach($array as $k>$url){$conn[$k]…

php asp写法,asp/php常用的库连接文件代码写法大全

今天有位朋友问到了&#xff0c;关于conn.asp文件内容&#xff0c;这里我作统一整理说明。一直以来主要写asp与php&#xff0c;所以这里只作这两种写法总结&#xff0c;常用的各类库连接文件写法。ASP&#xff1a;by:zhoz http://log.zhoz.com/ASP来说&#xff0c;首先当然是SQ…

windows_study_2

描述&#xff1a;如何确定像%ProgramFiles%这样格式的目录的具体位置&#xff1f; 解决&#xff1a;运行——cmd——echo %ProgramFiles%——回车——界面就显示出目录位置了。转载于:https://www.cnblogs.com/lishidefengchen/p/3370150.html

php 控制器分组模式,控制器分组路由

控制器分组路由目的降低控制器复杂度我有个Volunteer(自愿者)控制器&#xff0c;下面有多个子模块&#xff0c;比如&#xff1a;job、question、resume、groupapp|--cli|--m|--web| |--controller| | |--Message.php| | |--Passport.php| | |--User.php| | |--Volunteer.php如果…

WCF部署到IIS不使用svc文件

<?xml version"1.0" encoding"utf-8"?><configuration> <system.web> <compilation debug"false" targetFramework"4.0" /> </system.web> <system.serviceModel> <behaviors> …

php订阅号借权,php订阅号借权

微信订阅号显示暂时无法提供服务该怎么用&#xff1f;方法:1.首先确定您的微信公众号使用的是开发者模式&#xff0c;接口设置正确&#xff0c;并能正常收发普通消息。2.下面说一下提示"该公众号暂时无法提供服务&#xff0c;请稍候再试"这条信息的原因大家先了解一下…

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

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

php vendor路径,php – 如何使用composer获取根包路径

我正在使用composer开发一个名为php-app-config的PHP组件.这个组件,一旦被另一个项目需要,并使用composer install安装,应该在root package的config文件夹中查找配置文件,类似于root_package / config / config.yml../config/config.yml应仅存在于根包中,而不应存在于composer.…

POJ 2253 Frogger (求某两点之间所有路径中最大边的最小值)

题意&#xff1a;有两只青蛙&#xff0c;a在第一个石头&#xff0c;b在第二个石头&#xff0c;a要到b那里去&#xff0c;每种a到b的路径中都有最大边&#xff0c;求所有这些最大边的最小值。思路&#xff1a;将所有边长存起来&#xff0c;排好序后&#xff0c;二分枚举答案。 时…

基于matlab的频率响应分析,基于MATLAB/GUI的二阶低通电路频率响应分析与仿真

第 34 卷 第 5 期 2011 年 10 月 电 子 器 件 Chinese Journal of Electron Devices Vol&#xff0e; 34 No&#xff0e; 5 Oct&#xff0e; 2011 项目来源: 基本电路的分析与综合实时演示系统( ndkf0908) 收稿日期:2011&#xff0d;04&#xff0d;19 修改日期:2011&#xff0d…

详解.NET IL代码(一)

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