在AppFramework里DAO类可以由代码生成工具自动生成,开发者只需要通过DAO类基本上就可以完成大部分增删查改业务,一些特殊的业务如果无法用DAO实现,则可以通过SqlMap结合IDBSession来实现。
DAO主要处理三类对象:
1、 表:生成的代码有增删改查等方法;
2、 视图:生成的代码有查询方法;
3、 SQL虚拟视图:在一些条件比较差的数据库里,例如对视图不支持或支持不好,或者在一些特殊的应用场合下不允许使用视图时,可以用子查询来模拟数据库视图。SQL虚拟视图生成的代码也只有查询方法;
DAO的增、删、改用法比较简单,本文前面已有叙述。DAO的查询功能形式要丰富一些,下文只对DAO的一些高级查询用法进行说明。
用DAO的SelectList方法可以获得ObjectTable<T>类型的实体集合。SelectList有多个重载方法,但用法都大同小异:
/// <summary>
///
根据查询并获取一批记录,若要返回所有字段,把
fields
设为
"*"
,程序将优化执行过程
/// </summary>
/// <param name="orderBy">
排序表达式
</param>
/// <returns>
返回对象数组
</returns>
ObjectTable<BasUser> SelectList(IDBSession session, string fields, QueryFilter filter, string orderBy);
/// <summary>
///
根据查询并获取一批记录,若要返回所有字段,把
fields
设为
"*"
,程序将优化执行过程
/// </summary>
/// <param name="orderBy">
排序表达式
</param>
/// <returns>
返回对象数组
</returns>
ObjectTable<BasUser> SelectList(IDBSession session, string fields, string filter, string orderBy);
/// <summary>
///
根据查询并获取一批记录,若要返回所有字段,把
fields
设为
"*"
,程序将优化执行过程
/// </summary>
/// <param name="orderBy">
排序表达式
</param>
/// <returns>
返回对象数组
</returns>
ObjectTable<BasUser> SelectList(IDBSession session, string fields, QueryFilter filter, string orderBy, BatchObjectConstructionEventHandler create);
需要说明的有以下几点:
1、 fields参数:fields参数告诉DAO只读取哪些字段,而DAO也只会填充这些字段所对应的实体对象属性。这种模式有许多好处,不但可以有效地减少网络带宽和内存的消耗,提高了对象构造速度,还不需要为每个查询定制一个实体,减少了实体类型的个数,降低了程序的规模和复杂度。注意,如果要查询所有字段,可以把fields设置为”*”,这样DAO会对程序进行优化。
2、 orderBy参数:orderBy告诉DAO以什么方式对结果集进行排序,如果不指定排序方式,传入null即可。
3、 返回结果集:返回的结果集可以直接绑定到DataGrid、DataGridView、ComboBox等各种UI控件;返回的结果集还可以进行排序和二次查询,这比IBatis返回IList的功能要强大得多。
DAO提供了SelectTable方法获得DataTable。
/// <summary>
///
根据查询并获取一批记录,若要返回所有字段,把
fields
设为
"*"
,程序将优化执行过程
/// </summary>
/// <param name="orderBy">
排序表达式
</param>
/// <returns>
返回
DataTable</returns>
DataTable SelectTable(IDBSession session, string fields, QueryFilter filter, string orderBy);
其中orderBy告诉DAO以什么方式对结果集进行排序,如果不指定排序方式,传入null即可。
测试数据表明,SelectTable的性能比SelectList的性能要差很多,其主要原因是因为DataTable的构造速度不如实体对象集合的构造速度快。对于相同的查询语句,用SelectTable执行比用SelectList大约多耗时40%以上。
SelectList
返回的结果集可以直接绑定到
DataGrid
、
DataGridView
、
ComboBox
等各种
UI
控件上,而且返回的结果集还可以进行排序和二次查询,具有高执行效率的同时,又兼有
DataTable
的灵活性,因此推荐开发者尽量采用
SelectList
作查询。