• 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[
            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>
    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>

     

     

  • 相关阅读:
    windows下安装部署RocketMQ
    Windows安装RabbitMQ
    HttpClient工具类
    Docker部署Spring Boot项目
    在Docker中安装Redis以及主从环境搭建
    df命令得到一个诡异的现象
    一个“稍后再读”的软件 POCKET
    也是关于 Stay Hungry. Stay Foolish.
    改用thebrain做思维导图
    文件系统只读,一个没有解决的问题(续)
  • 原文地址:https://www.cnblogs.com/zengyy/p/3361104.html
Copyright © 2020-2023  润新知