Dorado 5 : 5.07.SqlDataset (RF1)

SqlDataset是一种通过查询类型的SQL属性来定义Dataset内容的Dataset。
SqlDataset具有如下的方法:

dataset.setSql(String sql);

通过该方法开发人员可以自己生成一个十分复杂的用于查询的SQL来定义dataset的sql属性。SqlDataset根据该属性获取数据库中的数据,并且在这个过程中SqlDataset本身可以充分利用dorado提供的方言机制实现高效率的数据查询。尤其是可以利用方言提供分页处理机制。大大加快查询的性能。
SqlDataset支持分页处理功能,开发的时候开发人员并不需要自己处理分页,只要在定义dataset的时候指定pageSize,剩下的就全部交给SqlDataset吧。
另外,SqlDataset还具备了持久化的功能,它可以实现自身数据数据库持久化功能,可以通过如下的代码实现持久化操作:

dataset.doUpdate();

以及和持久化相关的事务问题,在SqlDataset中也得到了很好的支持,一般来说开发人员都无需在SqlDataset持久化的时候关注其事务处理,系统会自动协助你完成这些基本的工作。
SqlDataset既可以通过配置使用也可以在服务器端编程使用:

配置方式使用SqlDataset

在Module或者ViewModel中可以直接添加SqlDataset类型的Dataset:
Auto create fields 按钮SQL Builder 按钮
图表 33 配置方式的SqlDataset
属性sql用来设置定义SqlDataset内容的SQL语句,设置的SQL语句必须为查询类型,
鼠标点击到sql属性的编辑区域后,在sql属性编辑区域右侧会出现一个按钮:

图表 34
点击这个按钮会打开一个sql的编辑器,在这个编辑器里可以编写SQL语句并可以预览SQL的执行结果。

图表 35 SQL 编辑器
SQL语句设置并保存,在Service启动的情况下后点击Outline中左侧的"Auto create fields"按钮,Dorado Studio可以根据设置的SQL的查询结果集中的字段自动添加Dataset的Field。
此外还可以通过Dataset设置向导来完成SQL的设置,点击"SQL Builder"按钮可以打开向导。

图表 36 Dataset向导
在此,通过向导最终可以生成一条查询的SQL语句。此向导的使用方法在AutoSqlDataset中进行详细说明。

SqlDataset中的参数

在设置的SQL语句中可以使用类似JDBC的PreparedStatement中的"?"的参数,不同的是,Dorado中的提供的是可以命名的参数,在Dorado中参数是以冒号开始的非空格连续字符串,形如":employee_name",其中的冒号是一个标志,代表后边的字符串是参数,冒号后边的字符串为参数名。例如"SELECT * FROM EMPLOYEE WHERE EMPLOYEE-NAME LIKE :EMPLOYEE_NAME"。参数名的命名一般来说为任意的非空格连续字符串都可以,但是建议按照Java变量的命名规范来命名。
参数可以在Dorado Studio中需要设置SQL的地方、Dataset设置向导中设置的Where条件中或者服务器端使用SqlDataset时设置的SQL中使用,这些参数可以在运行时被动态的替换。
参数与Dataset的parameter有内在的关联,当对parameter设置值时,dorado会把与值赋给与parameter同名的参数,开发过程中正是通过这种关联来实现对变量的动态赋值,理解这一点十分重要。
在设置的SQL语句中还可以使用Dorado提供的EL表达式,例如"select * from employee where employee_name like '${Request.employee_name}'",在运行时SQL中的EL表达式可以被动态的替换为实际的EL表达式的值。

dataSource属性

除sql属性之外,如果只对Dataset进行查询还需要设置dataSource属性,如果还要对Dataset进行数据更新还需要设置originTable属性和keyFields属性:dataSource为此Dataset使用的数据源,可以通过下拉框选择;originTable为对Dataset进行更新操作时要Dorado要更新的数据库中的表的表名;keyFields为定位Dataset中数据所用的字段,keyFields可以是数据库表中的主键,也可以是其他字段,多个字段之间以逗号隔开。当对Dataset进行更新时Dorado会以设置的主键为条件对数据库中originTable表进行更新。

编程方式使用SqlDataset

对于通过配置方式使用的SqlDataset,可以在Dataset监听器或者视图模型实现类中对其进行进一步的控制。比如在视图模型实现类中可以通过如下代码改变配置的SqlDataset的sql属性:

Dataset dataset = getDataset("datasetEmployee");
SqlDataset employeeDataset = (SqlDataset)dataset;
employeeDataset.setSql("select * from employee where dept_id = :dept_id");

此外,还可以在服务器端借助SqlDataset来进行数据的存取,需要设置的属性和在配置方式使用SqlDataset介绍中关于数据查询和数据更新需要设置的属性相同。
如下代码可以用来完成数据的获取:

SqlDataset dataset = new SqlDataset();
dataset.setDataSource("doradosample");
dataset.setSql("select * from dept where dept_name like :dept_name");
dataset.parameters().setString("dept_name", "%北京%");
try {
dataset.load();
} catch (Exception e) {
}
RecordIterator ri = dataset.recordIterator();
while(ri.hasNext()){
Record record = ri.nextRecord();
System.out.println(record.getString("dept_id"));
}

上述代码中,调用dataset的load方法从数据库中加载数据。
如下代码可以用来完成数据的更新:

SqlDataset dataset = new SqlDataset("dsource","select * from dept");
dataset.setOriginTable("dept");
dataset.setKeyFields("dept_id");
try {
dataset.load();
dataset.moveFirst();
while(!dataset.isLast()){
Record record = dataset.getCurrent();
if("D13".equals(record.getString("dept_id"))){
record.setString("dept_name", "test");
}
dataset.moveNext();
}
dataset.update();
} catch (Exception e) {
}

从代码中可以看出,使用SqlDataset来做数据更新的前提是要更新的数据必须先从数据库中拿出来,所以通过SqlDataset来做数据更新是比较麻烦的,相比起来Dorado的DBStatement完成相应的操作要简单一些。