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