1.1.1 在DBAccess.config配置多个数据源
如果应用系统规模较大,有可能会使用多个数据源。AppFramework支持多个数据源,配置方法是在DBAccess.config里配置多个<DataSource>节点,并给每个数据源命名不同的名称。注意,为了提高性能,应该把最常用的数据源设置为默认数据源,在DataSource节点里把Default属性设置值为true,例如:
<DataSource
Name="IMS"
DBType="SQLServer" DBVersion="8.0"
Default="true"
ConnectionString="Data Source=./SQL2005;Initial Catalog=IMS;User ID=IMSUser;Password=12345678" />
<DataSource
Name="ABC"
DBType="SQLServer" DBVersion="8.0"
ConnectionString="Data Source=192.168.1.111;Initial Catalog=ABC;User ID=IMSUser;Password=12345678" />
在程序中获取默认数据源的会话接口,则使用:
//
获得默认数据源的会话接口
using (IDBSession session = DBSessionManager.Default.GetSession())
{
……
}
获取非默认数据源的会话接口,需要传入数据源名称参数:
//
获得默认数据源的会话接口
using (IDBSession session = DBSessionManager.Default.GetSession("ABC"))
{
……
}
建议:为了避免数据源名称字符串书写不统一导致不必要的错误,一种好的做法是把各种数据源定义为枚举,然后用枚举值的ToString()
方法作为GetSession()
的参数(
这种做法还有一个好处是,当数据源名称发生修改时可以用IDE
重构器批量修改)
:
//
获得默认数据源的会话接口
using (IDBSession session = DBSessionManager.Default.GetSession(DataSource.ABC.ToString()))
{
……
}
下面是一个简单的例子,附带注释说明:
<?xml version="1.0" encoding="gb2312" ?>
<Map>
<Head
ReferencePath="" <!--
添加引用路径,可以是相对路径,也可以是绝对路径,多个路径用“
;
”间隔
-->
Import="" <!--
添加引用的程序集,多个路径用“
;
”间隔
-->
Using="" <!--
添加引用的命名空间,多个路径用“
;
”间隔
-->
>
<Description> <!--
放置描述信息
-->
</Description>
</Head>
<!--
定义映射的数据源,如果有多个
DaoGen
文件,应该把此节统一放在
CodeGenPlugin.config
文件里,以免在多个
DaoGen
出现重复配置,代码生成器优先采用
DaoGen
文件里定义的数据源连接串
-->
<DataSource Name="IMS" DBType="Oracle" DBVersion="9.0.14" ConnectionString="Data Source=IMSDB;User ID=IMSUser;Password=12345678" />
<MapItem
Type="Table,View,SQL" <!--
定义映射的数据源类型,
Table
表示表、
View
表示视图、
SQL
表示查询,默认
:Table
-->
TableName="" <!--
当
Type=Table
或
Views
时,表示映射的表或视图名;当
Type=SQL
时,表示
SQL
语句的别名
-->
CSharpTableName="" <!--
映射到
CSharp
里的表名,此名称将作为各个生成类的类名前缀,例如
BAS_USER
默认映射为
BasUser
,生成的类包括
BasUserDef,BasUserParam
等等
-->
PrimaryKey="XX|XX|XX" <!--
指定表的主键,通常都是一个字段,若有多个字段作联合主键,用
"|"
间隔开,默认
:ID
-->
InheritedTableName="XXX" <!--
表示表之间的继承关系,从哪个表继承,其值是某个
MapItem
的
TableName
,默认
:
无
-->
ReadOnly="false|true" <!--
表示只生成查询方法
,
默认
:false
-->
>
<!--
映射的
SQL
语句,当
MapItem
的
Type
属性等于
SQL
时有效
-->
<SelectSQL></SelectSQL>
<!--
把数据库字段映射到
C#
类的属性
ColumnMap
可以有
0~N
个
-->
<ColumnMap
FieldName="ID" <!--
表、视图或子查询的字段名
-->
CSharpFieldName="ID" <!--
映射到
C#
类的属性名
-->
CSharpType="int" <!--
映射的
C#
类型,如果不指定,
代码生成器会自动指定一个合适的类型
-->
/>
<!--
配置用到的自增长字段
SequenceField
可以有
0~N
个
-->
<SequenceField
FieldName="" <!--
字段名
-->
SequenceName="" <!--
序列名,仅适合类似
ORACLE
支持
SEQUENCE
对象的数据库,默认
: FieldName + "_S"
-->
/>
<!--
可以有
0
或
1
个
DAO
节
-->
<DAO>
<!--
配置实体类映射信息,可以有
0
或
1
个
InfoClass
节
-->
<InfoClass
Name="BasUser" <!--
实体类名,默认:按
"_"
分段首字母大写连接,例如
BAS_USER
映射为
BasUser
-->
Interfaces="IBasUser" <!--
配置实体类实现的接口名,如果实现了多个接口,用“
,
”间隔,默认为:
I +
实体类名
-->
MainInter <!--
指定实体类实现的接口里哪个作为主接口,默认为
Interfaces
里的第一个接口,如果
Interfaces
为空,则默认为:
I +
实体类名
-->
/>
<!--
配置参数类映射信息,可以有
0
或
1
个
ParamClass
节
-->
<ParamClass
Name="BasUserParam" <!--
参数类名,默认:实体类名
+ Param
,例如
BasUserParam
-->
Interfaces="IBasUserParam" <!--
配置参数类实现的接口名,如果实现了多个接口,用“
,
”间隔,默认为:
I +
参数类名
-->
MainInter <!--
指定参数类实现的接口里哪个作为主接口,默认为
Interfaces
里的第一个接口,如果
Interfaces
为空,则默认为
I +
参数类名
-->
/>
<!--
配置
DAO
类映射信息,可以有
0
或
1
个
DAOClass
节
-->
<DAOClass
Name="BasUserDAO" <!-- DAO
类名,默认:实体类名
+ DAO
,例如
BasUserDAO
-->
Inter <!--
配置
DAO
类实现的接口名,如果实现了多个接口,用“
,
”间隔,默认为:
I + DAO
类名
-->
FactoryClass="BasUserFactory" <!--
指定
DAO
类的工厂类名,默认为:
DAO
类名
+ Factory
,例如
BasUserFactory
-->
/>
</DAO>
<!--
定义
SQL
模板
,
可以有
0~N
个,放在
<MapIetm>
节点内外的效果无差别
-->
<statement
id="GetBasUserList" <!--
模板映射的名字,生成的
C#
类将命名为:
ID + "SqlMap"
-->
>
<!--
定义动态
SQL
块,可以有
0~N
个,语法类似于
IBatis
的
dynamic
,但语法以及支持的种类要简单一些
-->
<dynamic
prepend="dept_id in (select id from BAS_Dept where" <!--
配置在块的开头添加的语句
-->
append=")" <!--
配置在块的结尾添加的语句,与
prepend
成对出现
-->
seprator="or" <!--
块内的项的间隔串
-->
>
<!--
动态项,在指定参数非空时才输出
SQL
语句,可以有
0~ N
项
-->
<isNotNull
name="DeptName" <!--
参数名
-->
> <!--
动态项的
SQL
模板,其中
#xxx#
表示占位串,将与参数值绑定
-->
upper(name) like #DeptName#
</isNotNull>
<isNotNull property="CreatedTimeBegin" > created_time >= #CreatedTimeBegin# </isNotNull>
</dynamic>
</statement>
</MapItem>
<!--
定义
SQL
模板
,
可以有
0~N
个
-->
< statement id="GetUserAgeAvr">
select avr(age) from (
select age from bas_user
< dynamic prepend="where dept_id in (" append=")" seperator="and">
<isNotNull property="Names">select id from bas_dept where Name in (#Names#)</ isNotNull >
</ dynamic >
)
</ statement >
</Map>
1.1.3 配置CodeGenPlugin.config使代码生成到其他项目下
项目比较大的时候,通常要进行分层开发,接口包与实现包分离、DAO与实体包分离,因此生成的代码往往不在同一个项目下。CodeGenPlugin.config提供了配置生成代码位置的功能。
<SavePath
Model="
项目名称
/
目录路径
"
DAOInterFONT-SIZE: 9pt; COLOR: blue;">项目名称
/
目录路径
"
/>
只需要把“项目名称”设置为其他项目,就可以把代码生成到其他项目录下了。