引言

前几日看到一片热门的博客, .NET高级工程师面试题之SQL篇
,要求找出各种系的最高分,并且按系编号,学生编号升序排列。这些查询相比复杂,也正如独立,自从用了OGL450M后,很久没有写过SQL语句了,于是小编探讨了下,自个儿也写了一个:

 WITH cte1 as (
 select stu.deptID,
        D.depName, 
        stu.stuid ,
        stu.stuName,
        score_sum.AllScore
    from dbo.Student stu
      inner join (select stuid ,SUM(score) as AllScore from dbo.Score group by stuid) score_sum      
          on  stu.stuid =score_sum.stuid 
      inner join dbo.Department D on stu.deptID= D.depID
)
 select cte1.* from cte1 
      inner join (select deptID, max(AllScore) maxScore from cte1  group by deptID) M
            on cte1.AllScore = M.maxScore and cte1.deptID=M.deptID
 order by cte1.deptID,
          cte1.stuid

 

大家办事中日常蒙受类似的复杂性查询,但常见的做法是把它写到BLL程序中,也有同学喜欢写在储存进程中,它有哪些难题吗?

  • 写到程序中,
    • 不难养成拼接SQL的习惯,
    • 还要SQL语句零散的分布到程序的依次地点,糟糕维护,
    • 并有或许爆发安全难题;
  • 写到存储过程,
    • 假诺多了也不好维护,
    • 而且程序调用不如直接调用SQL语句方便,
    • 安插的时候还得安插这么些囤积进程,系统上线复杂的时候,平时忘记更新一七个存储进度。

除了,SQL语句不论写到程序中要么写在蕴藏进度中,都有一个很大的通病,程序不能跨数据库平台!

比方把具有的SQL语句都集中管理在一个安排文件中,那么程序编制和护卫、公布都要便于广大,也易于跨数据库平台,甚至可以依照这么些SQL配置文件,写个代码生成器,自动生成DAL层代码。
天下盛名的 iBatis,MyBaits.Net
就是那样的功能,但它定义了一套复杂的平整,配置起来很复杂,项目或然80%的时间都在写查询配置,借使没有代码工具开发工作量很大的。

当然,与MyBatis不雷同之处,SOD框架并不主张将项目标查询都用SQL写到SqlMap文件,提出大家仅将复杂的SQL查询写到SqlMap配置文件,一般品种那类复杂查询也就20%左右,而对于80%的一般查询,使用ORM即可,框架同时帮助O瑞虎M与SqlMap技术,这是SOD框架的一大特征!

SQL-MAP–集中管理SQL查询

PDF.NET
SOD框架
SQL-MAP功能借鉴了iBaits的考虑,可是大力简化它的配置并提供代码生成工具,可以自动化的做到DAL代码生成,下面是它的劳作进度:

XML 1

SOD框架提供了SqlMap配置文件管理器来治本和编辑SQL配置文件,然后经过代码生成器生成DAL层代码,末了交给SODk框架执行。

编辑SQL配置文件,假设由此下面说的布署工具来做,可以参见这篇小说:

PDF.NET之SQL-MAP使用图解

但以此顺序太老,一向没有更新,工具的下载地址是:

http://ft.codeplex.com/releases/view/65308

工具包涵在那一个“集成开发工具”
内,通过菜单或许图标即可操作。上边是融为一体开发工具打开数据库并履行本文的查询的界面:

 

XML 2

 

SQL-MAP配置管理工具不太好用,初学者学习概念可以试一试,不过要想纯熟运用,推荐使用VS来写这么些SQL配置文件更便宜。本文将向大家详细介绍那些进度。

一、编写SQL-MAP配置文件

1.1,建立SQL-MAP应用项目

一般来说图所示,新建一个
SqlMapDemo项目,在它其中先添加一个XML文件,文件命名为 SqlMap.config
,然后,找到地方的“集成开发工具”的装置目录,添加
SqlMap.xsd 文件。该公文很关键,它是大家在VS里面编写XML文件可以有
智能提示 的关键。

XML 3

 

添加了这么些XSD文件到花色后,还亟需把下边的内容

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="SqlMap.xsd"  

注意:有关此详细内容,请参见《PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和业内》。

1.2 使用XML智能提示

将下面的情节添加到刚才的SqlMap.config
文件中,那样,输入尖括号,恐怕输入空格,智能提示内容就出来,如下所示:

XML 4

 

那是添加完整的SqlMap.config
文件,该文件完全手写,在智能指示的扶植下,编写仍旧很有益的。请留心安顿文件内挨家挨户节点属性的内容,详细内容请看上边链接的公文。注意,那里要用
CDATA 来写SQL查询。

XML 5

留意:借使要执行拿到结果集的查询,需求在Sql-Map文件的命令节点里面使用
Select 节点,并且须要指明 ResultClass 的品种,它有上边二种可选值:

  1. ValueType –结果为值对象,比如Int,String之类的查询单值结果
  2. DataSet –数据集,默认
  3. EntityObject –单个实体类对象
  4. EntityList –实体类列表

专注:要是指定
ResultClass=”EntityObject” / ResultClass=”EntityList” ,那么须要同时表明ResultMap 属性,表示结果要映射到的实际品种,比如:

ResultClass=”EntityObject” ResultMap=”XXXNameSpace.YYYEntityClass”

关于此详细内容,请参见《PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和正式》。

在意:<Script > 配置节,出了有Type表面数据库类型之外,还非得有 ConnectionString =”” Version=””
那样的内容,否则,下边的代码生成不可以生成代码。

二、使用代码生成器

2.1 配置代码生成器

开拓PDF.NET集成开发工具,接纳菜单
“配置”–SQL-MAP代码生成器配置,出现上面的界面:

在编排区域,鼠标右键菜单,启用用编辑,假若是首先次配置,请一定删除配置文件内的华语注释,否则配置文件格式不可以识别。

XML 6

此地根本配置SqlMap.config文件所在的完好路径,输出代码的目录,以及命名空间等等。

编纂完结,在编辑区的鼠标右键菜单上,启用“保存文件”的成效。

2.2 生成代码

假使上面配置不错,点击第四个工具栏的图标,就足以活动调用处
PDFCodeMaker.exe 程序,读取配置文件音讯,自动生成DAL代码文件,如下图:

XML 7

6

XML 8

之后,大家抬高刚才生成的DAL代码文件到花色中,如上图。

三、使用SqlMap配置文件

3.1 SqlMap配置文件的应用办法

SqlMap配置文件有2种选取方法,

  • 在应用程序配置文件的AppSeting 配置节里面指定文件路径
  • 放置到程序集文件作为资源文件使用

在本示例中,选择嵌入式编译的办法,那样SQL语句的安全性更高,并且帮衬一个项目中动用多少个SqlMap配置文件,可是不如作为单身文件使用修改方便。如下图:

XML 9

那种办法编译,该资源文件的名字就是
“程序集默许名字空间.目录名字.文件名字” ,那里的例子是
SqlMapDemo.SqlMap.config ,由于在跟目录上面,没有目录名字。

在意,要正确运用嵌入式SQL配置文件,还非得在该公文中指出”停放文件的主次集名称,资源文件名字“,如本例如下图青白边框标记的部分所示:

 

XML 10

SqMap.config 文件修改形成后,在此启动 PDFCodeMaker.exe
程序,重新生成DAL文件,如下所示,伸张了签入式文件的装置:

XML 11

3.2 生成SqlMapDAL文件

反省发现,DAL类文件的名字空间不科学,这里修改下计划文件的 RootNameSpace
部分,如下图:

XML 12

重新生成DAL类文件,大家看看最终生成的SqlMapDAL类的情节:

XML 13XML 14

//使用该程序前请先引用程序集:PWMIS.Core,并且下面定义的名称空间前缀不要使用PWMIS,更多信息,请查看 http://www.pwmis.com/sqlmap 
// ========================================================================
// Copyright(c) 2008-2010 公司名称, All Rights Reserved.
// ========================================================================
using System;
using System.Data;
using System.Collections.Generic;
using PWMIS.DataMap.SqlMap;
using PWMIS.DataMap.Entity;
using PWMIS.Common;

namespace SqlMapDemo.SqlMapDAL
{
/// <summary>
/// 文件名:TestSqlMapClass.cs
/// 类 名:TestSqlMapClass
/// 版 本:1.0
/// 创建时间:2015/5/12 17:16:32
/// 用途描述:SQL-MAP示例测试程序
/// 其它信息:该文件由 PDF.NET Code Maker 自动生成,修改前请先备份!
/// </summary>
public partial class TestSqlMapClass
    : DBMapper 
{
    /// <summary>
    /// 默认构造函数
    /// </summary>
    public TestSqlMapClass()
    {
        Mapper.CommandClassName = "TestGroup";
        //CurrentDataBase.DataBaseType=DataBase.enumDataBaseType.SqlServer;
        Mapper.EmbedAssemblySource="SqlMapDemo,SqlMapDemo.SqlMap.config";//SQL-MAP文件嵌入的程序集名称和资源名称,如果有多个SQL-MAP文件建议在此指明。
    }


    /// <summary>
    /// 找出每一个系的最高分,并且按系编号,学生编号升序排列
    /// </summary>
    /// <returns></returns>
    public DataSet QueryStudentSores( ) 
    { 
            //获取命令信息
            CommandInfo cmdInfo=Mapper.GetCommandInfo("QueryStudentSores");
            //执行查询
            return CurrentDataBase.ExecuteDataSet(CurrentDataBase.ConnectionString, cmdInfo.CommandType, cmdInfo.CommandText ,null);
        //
    }//End Function


}//End Class

}//End NameSpace 

SqlMapDemo.SqlMapDAL

3.3 团队开发

社团费用平日提到到文件修改争执,SqlMap配置文件也会遇上,借使大家不去修改同一个Command配置,用源代码管理器的自行合并成效是一直不难点的。

设即使独占式签出管理,那么一个开发人员使用SqlMap文件,此外一个就唯有等待了,但框架提供了变更的章程来解决那些题材。

  • 按成效模块划分DAL程序集,各个DAL程序集一个SqlMap.config文件,接纳嵌入式编译;
  • 在一个DAL程序项目上确立五个SqlMap.config文件,拔取嵌入式编译 。

专注:提出每个开发人士负责一个SqlMap.config文件的管理,然后分别安插自个儿的PDFCodeMaker.exe.config

 

3.4 切换数据库

在同一个SqlMap.config 文件之中添加新的 <Script Type=””
节点,比如Oracle
,然后将本来数据库类型的SQL查询改写成当下项目标SQL查询语句 ,程序会依照DBMapper的AdoHelper的骨子里类型自动选拔正确的<Script
Type=”” 节点,从而做到数据库切换,完毕您的施用系统跨数据库的效益。

其它,也得以别的建立一个SqlMap.config
文件,里面专门写新的数据库上面的SQL语句,大家在此之前一个银行的门类,就是那般从SqlServer移植到PostgreSql的。

四、运行SQL-MAP程序

4.1 配置连接字符串

SQL-MAP DAL类程序依然通过AdoHelper
对象来施行,那里丰硕一个应用程序配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name ="default" connectionString="Data Source=.;Initial Catalog=TestDB;Integrated Security=True" providerName="SqlServer"/>
  </connectionStrings>
</configuration>

4.2 运行程序

然后,就足以写如下的代码来测试SQL-MAP程序了:

 class Program
 {
     static void Main(string[] args)
     {
         Console.WriteLine("PDF.NET SOD框架 SqlMap示例程序--2015.5.12-------");
         Console.WriteLine("http://www.pwmis.com/sqlmap ---------");

         SqlMapDemo.SqlMapDAL.TestSqlMapClass test = new SqlMapDAL.TestSqlMapClass();

         //AdoHelper db = new SqlServer();
         //取最后一个连接配置
         AdoHelper db = MyDB.GetDBHelper();
         //SQL-MAP DAL 默认也会取最后一个连接配置,所以下面一行代码可以注释
         //test.CurrentDataBase = db;
         DataSet data = test.QueryStudentSores();

         Console.WriteLine("查询到记录数量:{0}",data.Tables[0].Rows.Count);
         Console.WriteLine("测试完成。");
         Console.Read();
     }
 }

结果运行如下:

XML 15

设置一个断点,大家来探视 ”SQL-MAP DAL对象“的Mapper对象有何样内容:

XML 16

在当下窗口输入 test.Mapper
,回车,就可知到地点的故事情节了。那里显得了刚刚配置的SQL-MAP嵌入式文件的地方和文书良好的门径:SqlMapFile
属性。

 上面是事无巨细的结果:

test.Mapper
{PWMIS.DataMap.SqlMap.SqlMapper}
    _CommandClassName: "TestGroup"
    _DataBase: {PWMIS.DataProvider.Data.SqlServer}
    _dataBaseType: SqlServer
    _embedAssemblySource: "SqlMapDemo,SqlMapDemo.SqlMap.config"
    _ParaChar: "@"
    _ParamsMap: {PWMIS.Common.ParamMapType[0]}
    _ParasLenth: 0
    _ResultClass: ValueType
    _ResultMap: ""
    _SqlMapFile: "@R://SqlMapDemo,SqlMapDemo.SqlMap.config"

 结语

测试完全正确,使用 SOD框架的SQL-MAP 技术是或不是很粗略?

延续都只必要修改下文件之中的SQL语句就行了,

一回配置,一键生成!

那就是,SOD框架的SQL-MAP
技术的天性!结合SOD框架的O君越M作用,它完全可以代表MyBatis.Net 。

感谢我们关怀PDF.NET
SOD框架,那是一个开源免费的框架,详细消息请看官网
http://www.pwmis.com/sqlmap

框架开源项目地址:http://pwmis.codeplex.com
,本项目示范代码已经签入到codeplex 上,我们可以透过SVN下载应用。

本篇程序已经提供了单独的下载:XML 17    
Sql-Map Demo

正文相关录像播放和下载点击那里》》

相关文章

网站地图xml地图