SmartPersistenceLayer 2.0 之基础设置篇
现在我要讲一下,SPL在系统中应该如何应用,通过本篇,你将会学会如何配置SPL到你的系统中。
SPL运行原理
SPL作为一个数据访问平台,最终以DLL的方式体现,那么系统只要引用SPL的DLL就可以开始应用了。
SPL将依赖于两个XML配置文件:数据源配置文件(以下我称之为DatabaseMap.xml)和实体映射文件(以下称之为ClassMap.xml)。这两个配置文件在整个系统运行时,将一次性载入到内存,这样可以提高SPL的运行效率,所以如果这两个配置文件修改了,要IISReset或是重编译才能见到效果。
DatabaseMap.xml
databaseMap.xml是数据源配置文件,在这里配置系统运行的数据库连接,目前支持三种数据源(SQL Server,Oracle,Access),可以在这个文件中配置多个多种数据源,下面举个例子:
<?xml version="1.0" encoding="utf-8"?><map>
<!-- SQL Server服务器配置 -->
<database name="SQL" type="MsSqlServer">
<parameter name="Provider" value="SQLOLEDB.1" />
<parameter name="Password" value="" />
<parameter name="Initial Catalog" value="northwind" />
<parameter name="User ID" value="sa" />
<parameter name="Data Source" value="localhost" />
<classMapFile path="ClassMap1.xml" />
</database>
<!-- SQL Server服务器配置 -->
<database name="ACCESS" type="MsAccess">
<parameter name="Provider" value=" Microsoft.Jet.OLEDB.4.0" />
<parameter name="Data Source" value=" D:/pl/Test/test.mdb" />
<classMapFile path="ClassMap2.xml" />
</database>
<!-- SQL Server服务器配置 -->
<database name="ORACLE" type="Oracle">
<parameter name="Provider" value="MSDAORA.1" />
<parameter name="Password" value="password" />
<parameter name="User ID" value="user" />
<parameter name="Data Source" value="host.domain.com" />
<classMapFile path="ClassMap3.xml" />
</database>
</map>
以上列举了三种数据库的配置信息,其中:
database 的name是指在SPL中要使用的数据源名,这个值要能唯一标识一个连接,这样在SPL中可以直接使用name就可以执行操作了.
database的type有三种:MsSqlServer是指SQL数据库
MsAccess是指Access数据库
Oracle是指ORACLE数据库
parameter是连接中要用到的各个参数,这根据不同的数据源类型会有不同的值,具体的参照上面的写法就可以了.
如果要扩展参数,可以直接添加parameter,因为SPL中从parameter中读取[值对]组装成连接字符串的.
每个连接源上都有一个 <classMapFile path="ClassMap.xml" />是指定这个数据源对应的表与实体的映射信息,可以采用与databaseMap的相对路径指定,也可以指定为绝对路径,下面解释一下ClassMap.xml中的内容.
ClassMap.xml
ClassMap.xml是实体与表的映射关系,我以一个典型的例子要做解释,比如目前有个表为学生表Student,有字段:
Id 序号 Int pk 自动增长
No 学号 Varchar(40) pk
Name 姓名 Varchar(40)
Birthday 出生日期 Datatime
Grade 年级 Int
Score 入学成绩 decimal
那么对应的映射信息为:
<class name="StudentEntity" table="Student" database="MyDB">
<attribute name="Id" column="Id" type="Integer" increment="true" key="primary" />
<attribute name="No" column="No" type="String" key="primary" />
<attribute name="Name" column= StudentEntity "Name" type="String" />
<attribute name="Birthday" column="Birthday" type="Date" />
<attribute name="Grade" column="Grade" type="Integer" />
<attribute name="Score" column="Score" type="Decimal" />
</class>
从以上的配置我们很容易理解:
class 的name是指实体名,这要与实体类的名称相同
table是指映射的数据库是的表名;
database是指定实体默认的数据库源,对应databaseMap.xml的配置;
IsSaveToMemory为可选配置,如果此表为维护性数据,具有字段少,记录少,修改频率低,使用频率高,就可以设置IsSaveToMemory="true",这样,这个表的数据将会自动在内存存取,具体将在后面讲解.
attribute是每一个对应的实体属性与表字段名映射,
name为实体的属性名,要与实体类中的属性相同;
column是指表的字段名,这与表中的字段要相同;
type是指类型,如整数型Integer,字符型String,日期型Date,数字型Decimal等.
increment是指字段是否为自动增长,是则标识为true,这样SPL将会从数据库中自动生成;
key值为primary说明此字段是主键,在SPL中每个表必须要有一个主键,这作为表的唯一标识;
Class的Type对照表:
SQL Server | Oracle | XML中的type | .NET内置类型 |
bigint | NUBMER | BigInt | System.Int64 |
binary |
| Binary | System.Byte[] |
bit |
| Boolean | System.Boolean |
char | CHAR | String | System.String |
datetime | DATE | Date | System.DateTime |
decimal | NUMBER | Decimal | System.Decimal |
float | FLOAT | Double | System.Double |
image |
| Binary | System.Byte[] |
int | NUMBER | Integer | System.Int32 |
money |
| Decimal | System.Decimal |
nchar | NCHAR | String | System.String |
ntext |
| String | System.String |
numeric | NUMBER | Decimal | System.Decimal |
nvarchar | NVARCHAR2 | String | System.String |
real | REAL | Single | System.Single |
smalldatetime | DATE | Date | System.DateTime |
smallint | NUMBER | SmallInt | System.Int16 |
smallmoney |
| Decimal | System.Decimal |
sql_variant |
| Object | System.Object |
text |
| String | System.String |
timestamp |
| Binary | System.Byte[] |
tinyint |
| TinyInt | System.Byte |
uniqueidentifier |
| Guid | System.Guid |
varbinary |
| Binary | System.Byte[] |
varchar | VARCHAR2 | String,Varchar | System.String |
实体类定义
通过以上的XML配置我们已经了解到O/R Mapping的定义方式了,很显然,在作了Entity与Table的映射后,我们还需要在系统中定义Entity类,为了让这些实体类能统一管理,我的建议是大家新建一个Project和NameSpace,因为这些实体类的形式非常相同,可以用代码生成器生成。
我举一个例子来说明实体类结构:
namespace BusinessEntity
{
using System;
using System.Collections;
using System.Data;
using PersistenceLayer;
public class StudentEntity : EntityObject
{
//常量定义部分
public const string __ID = "Id";
public const string __NO = "No";
public const string __NAME = "Name";
public const string __BIRTHDAY = "Birthday";
public const string __GRADE = "Grade";
public const string __SCORE = "Score";
//局部变量定义部分
private int m_Id;
private string m_No;
private string m_Name;
private System.DateTime m_Birthday;
private int m_Grade;
private System.Decimal m_Score;
public StudentEntity()
{
}
//属性定义部分
public int Id
{
get
{
return this.mID;
}
set
{
this.m_ID = value;
}
}
public string No
{
get
{
return this.m_No;
}
set
{
this.m_No = value;
}
}
public string Name
{
get
{
return this.m_Name;
}
set
{
this.m_Name = value;
}
}
public System.DateTime Birthday
{
get
{
return this.m_Birthday;
}
set
{
this.m_ Birthday = value;
}
}
public int Grade
{
get
{
return this.m_Grade;
}
set
{
this.m_Grade = value;
}
}
public System.Decimal Score
{
get
{
return this.m_Score;
}
set
{
this.m_Score = value;
}
}
}
}
讲解如下:
1.实体类的NameSpace可以自己定义,只要定义后记得在系统中引用就可以了。
2.Using的内存就采用那四个就可以了
3.实体类继承于EntityObject,具父类为SPL中的一个public abstract类,只要具体的实体类继承后,实体类就拥有了Save(),Retrieve(),Delete()的实体操作功能。
4.实体类的第一部分为常量定义,在其他的PL中,都没有提到常量定义,而这个常量定义是非常有意义的,因为以后的系统应用中,经常会在没有实体化的情况下使用实体属性名,比如定义Condition时,那么采用常量的话,就可以从实体类直接使用"."操作就可以选择了,如StudentEntity.__Name就代表了Name这个属性。
5.实体的第二部分就是局部变量,只要我们定义好正确的类型即可.
6.实体的第三部分为属性,也就是对应的Set与Get给局部变量即可.
通过以上的代码就很简单的实现了实体类的定义,到此为止SPL的配置与实体类的定义都完成了,也就是我们的使用SPL的准备工作完成了。
初始使用
当我们进行了以上的准备工作后,在应用系统中要进行使用,只要一个步骤就可以了,就是初始化一个SPL,我们使用SPL中的一个Setting类就可以完成:
string DatabaseXml="Config/DatabaseMap.xml";
Setting.Instance().DatabaseMapFile=Server.MapPath(DatabaseXml);
就是通过以上的方式,指定下DatabaseMapFile的地址就可以了,这里当然是绝对地址,所以对于Web来说我们要进行一下MapPath了,而对于WinForm系统来说,只要指定为exe执行目录的相对目录就可以了。
初始化只要系统在开始时运行一次就可以了,所以对于Web来说,可以放在Global里,而我习惯于放在Web的BasePage里,对于WinForm只要在第一个Form上执行一次就可以了,在使用到SPL时会自动进行初始化连接的。
安全性
当然大家自然而然会想到连接的安全性,连接的安全性应该是由大家的系统自己来处理,比如简单一点的方式,我们可以把xml后缀改为config后缀,这样其他人不能直接看到config内容。这当然不能太安全,大家也可能通过加密后放在xml中,自己在初始时进行解密连接。
好了,以上的配置其实是相对简单的,当然以上的这些配置,我们可以通过代码生成器来完成,因为这些内存是基本相同的.
听棠
2004年11月
MSN:tintown_liu@hotmail.com