今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每个系的最高分,而且按系编号,学生编号升序排列。这个查询比较复杂,也比较典型,自从用了ORM后,好久没有写过SQL语句了,因而我研究了下,本身也写了一个:html
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配置文件,写个代码生成器,自动生成DAL层代码。 大名鼎鼎的 iBatis,MyBaits.Net 就是这样的功能,但它定义了一套复杂的规则,配置起来很复杂,项目可能80%的时间都在写查询配置,若是没有代码工具开发工做量很大的。数据库
固然,与MyBatis不同之处,SOD框架并不主张将项目的查询都用SQL写到SqlMap文件,建议你们仅将复杂的SQL查询写到SqlMap配置文件,通常项目这类复杂查询也就20%左右,而对于80%的通常查询,使用ORM便可,框架同时支持ORM与SqlMap技术,这是SOD框架的一大特色!安全
PDF.NET SOD框架的SQL-MAP功能借鉴了iBaits的思想,可是大力简化它的配置并提供代码生成工具,能够自动化的完成DAL代码生成,下面是它的工做过程:app
SOD框架提供了SqlMap配置文件管理器来管理和编写SQL配置文件,而后经过代码生成器生成DAL层代码,最后交给SODk框架执行。框架
编写SQL配置文件,若是经过上面说的配置工具来作,能够参考这篇文章:ide
但这个程序太老,一直没有更新,工具的下载地址是:工具
http://ft.codeplex.com/releases/view/65308
工具包含在这个“集成开发工具” 内,经过菜单或者图标便可操做。下面是集成开发工具打开数据库并执行本文的查询的界面:
SQL-MAP配置管理工具不太好用,初学者学习概念能够试一试,可是要想熟练应用,推荐使用VS来写这个SQL配置文件更方便。本文将向你们详细介绍这个过程。
以下图所示,新建一个 SqlMapDemo项目,在它里面先添加一个XML文件,文件命名为 SqlMap.config ,而后,找到上面的“集成开发工具”的安装目录,添加 SqlMap.xsd 文件。该文件很重要,它是咱们在VS里面编写XML文件可以有 智能提示 的关键。
添加了这个XSD文件到项目后,还须要把下面的内容
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SqlMap.xsd"
注意:有关此详细内容,请参见《PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范》。
将上面的内容添加到刚才的SqlMap.config 文件中,这样,输入尖括号,或者输入空格,智能提示内容就出来,以下所示:
这是添加完整的SqlMap.config 文件,该文件彻底手写,在智能提示的帮助下,编写仍是很方便的。请注意配置文件内各个节点属性的内容,详细内容请看上面连接的文件。注意,这里要用 CDATA 来写SQL查询。
注意:若是要执行得到结果集的查询,须要在Sql-Map文件的命令节点里面使用 Select 节点,而且须要指明 ResultClass 的类型,它有下面几种可选值:
注意:若是指定 ResultClass="EntityObject" / ResultClass="EntityList" ,那么须要同时申明 ResultMap 属性,表示结果要映射到的具体类型,好比:
ResultClass="EntityObject" ResultMap="XXXNameSpace.YYYEntityClass"
有关此详细内容,请参见《PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范》。
打开PDF.NET集成开发工具,选择菜单 “配置”--SQL-MAP代码生成器配置,出现下面的界面:
在编辑区域,鼠标右键菜单,启用用编辑,若是是第一次配置,请必定删除配置文件内的中文注释,不然配置文件格式没法识别。
这里主要配置SqlMap.config文件所在的完整路径,输出代码的目录,以及命名空间之类。
编辑完成,在编辑区的鼠标右键菜单上,启用“保存文件”的功能。
若是上面配置正确,点击第二个工具栏的图标,就能够自动调用处 PDFCodeMaker.exe 程序,读取配置文件信息,自动生成DAL代码文件,以下图:
6
以后,咱们添加刚才生成的DAL代码文件到项目中,如上图。
SqlMap配置文件有2种使用方式,
在本示例中,采用嵌入式编译的方式,这样SQL语句的安全性更高,而且支持一个项目中使用多个SqlMap配置文件,可是不如做为独立文件使用修改方便。以下图:
这种方式编译,该资源文件的名字就是 “程序集默认名字空间.目录名字.文件名字” ,这里的例子是 SqlMapDemo.SqlMap.config ,因为在跟目录下面,没有目录名字。
注意,要正确使用嵌入式SQL配置文件,还必须在该文件中指出"嵌入文件的程序集名称,资源文件名字“,如本例以下图红色边框标记的部分所示:
SqMap.config 文件修改完成后,在此启动 PDFCodeMaker.exe 程序,从新生成DAL文件,以下所示,增长了签入式文件的设置:
检查发现,DAL类文件的名字空间不正确,这里修改下配置文件的 RootNameSpace 部分,以下图:
从新生成DAL类文件,咱们看看最后生成的SqlMapDAL类的内容:
//使用该程序前请先引用程序集: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
团队开发经常涉及到文件修改冲突,SqlMap配置文件也会遇到,若是你们不去修改同一个Command配置,用源代码管理器的自动合并功能是没有问题的。
若是是独占式签出管理,那么一个开发人员使用SqlMap文件,另一个就只有等待了,但框架提供了变通的方式来解决这个问题。
注意:建议每个开发人员负责一个SqlMap.config文件的管理,而后各自配置本身的PDFCodeMaker.exe.config
在同一个SqlMap.config 文件里面添加新的 <Script Type="" 节点,好比Oracle ,而后将原来数据库类型的SQL查询改写成当前类型的SQL查询语句 ,程序会根据DBMapper的AdoHelper的实际类型自动选择正确的<Script Type="" 节点,从而完成数据库切换,实现你的应用系统跨数据库的功能。
另外,也能够另外创建一个SqlMap.config 文件,里面专门写新的数据库下面的SQL语句,咱们之前一个银行的项目,就是这样从SqlServer移植到PostgreSql的。
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>
而后,就能够写以下的代码来测试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(); } }
结果运行以下:
设置一个断点,咱们来看看 ”SQL-MAP DAL对象“的Mapper对象有哪些内容:
在及时窗口输入 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框架的ORM功能,它彻底能够代替MyBatis.Net 。
感谢你们关注PDF.NET SOD框架,这是一个开源免费的框架,详细信息请看官网 http://www.pwmis.com/sqlmap
框架开源项目地址:http://pwmis.codeplex.com ,本项目示例代码已经签入到codeplex 上,你们能够经过SVN下载使用。
本篇程序已经提供了独立的下载: Sql-Map Demo