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;">项目名称/目录路径"
/>
只需要把“项目名称”设置为其他项目,就可以把代码生成到其他项目录下了。