|
|
3#

楼主 |
发表于 2009-4-24 13:05:55
|
只看该作者

·不从业务方法获取参数
下面的业务方法声明可以从demo表中取出所有所有记录,返回一个Demo对象的数组。
@SQL(statement=“select * from demo” )
Public Demo[] getDemos();
·从业务方法中获取基本类型参数
下面的statement中,我们使用{demoId}变量从getDemoById()方法调用中获取传入的参数demoId。
@SQL(statement=“select * from demo where id={demoId}” )
Public Demo[] getDemoById(int demoId);
·从业务方法中获取Java对象类型参数
下面的statement中,我们使用{demo.name}变量表示从createDemo ()方法调用中获取传入的Java类对象demo的name属性的内容。
@SQL(statement = “insert into demo(name,value)
values({demo.name},{demo.value})”)
public void createDemo(Demo demo);
·从业务方法中获取完整SQL语句
有些时候,SQL语句可能需要动态生成,这时候statement默认的方式无法帮开发者完成这个过程,而是需要在Java代码中完成SQL语句的组装后传递给业务方法,这种情况下我们可以使用{sql: …}的方式向statement中传递一个完整的sql语句。
@SQL(statement=“{sql: totalsql}” )
Public Demo[] getDemos(String totalsql);
·从业务方法中获取SQL语句片断
statement还支持某一段SQL语句从业务方法的参数中获取,比如下面的这个例子中,只有最后的{sql: name}来源于业务方法中的参数。
@SQL(statement = “select id,name,value from demo
where name like {sql: name}”)
public Demo[] getDemosFilterByName(String name);
这种方式可以解决SQL语句中包含引号等特殊字符的问题,解决方法是你可以在业务方法调用之前使用Java代码创建包含这些特殊字符串的内容,然后通过sql片断的方式发送给statement。
这种方式另外一种用途是可以解决SQL语句部分片断需要动态生成的问题,举个例子,我们的多条件查询的条件下,用户可以选择按照一个或者多个条件进行查询,所以where语句后面的条件是动态的,这种情况下,我们就可以把判断和SQL语句中where语句的生成这部分功能实现分离到Java语句中,然后作为业务方法调用参数传递到statement中来。
调用存储过程
JDBC控件支持对存储过程的调用,只需要在statement中配置里面采用{call …}这样的方式表示当前执行的是一个存储过程就可以了,下面的例子演示了如何调用存储过程以及如何向调用过程传递参数。
@SQL(statement=“call sp_updateData({keyVal}, {intVal})”
void call_sp_updateCust(short keyVal, int intVal);
控件返回类型
继承JDBC控件后声明业务方法时,查询类业务方法需要返回数据,在业务逻辑中,需要返回的业务数据通常可以分为三种:
·简单字段。
比如要查询今天有多少人访问了我们的系统、编号Id为1000的用户他的真实姓名是什么?。
·单条记录。
比如查询结果需要返回编号为1000的用户。
·多条记录。
比如查询结果需要返回所有系统用户。
本节中将按照这三种不同的情况给大家介绍JDBC控件所支持的返回类型以及内部处理机制。
使用控件返回简单字段
JDBC控件支持所有Java基本类型及其对应对象类型的返回,比如int、Integer、String等,在继承JDBC控件后声明业务方法时,只需要声明所需要的返回类型,JDBC控件会自动将SQL操作结果造型为所需要的返回类型。
比如我们声明一个业务方法:
@SQL(statement = “select count(*) from demo”)
public int getDemosCount();]
控件调用后的结果将返回一个int数值,而如果你声明的业务方法如下:
@SQL(statement = “select count(*) from demo”)
public Integer getDemosCount();
控件调用后的结果将返回一个Integer对象。
返回结果为简单字段时,如果SQL语句执行后没有符合要求的结果,控件将根据声明的返回类型返回不同的值,如果声明返回结果为数值型,那么返回结果为0;如果声明返回结果为boolean,那么将返回false,而如果声明的返回结果为类类型,那么控件调用返回结果为null。
使用控件返回单条记录
当SQL查询语句需要返回单条记录时,控件支持两种不同的返回类型:JavaBean对象或者Map(或者HashMap)对象。如果能够确定返回对象的属性,通常采用返回JavaBean对象,比如要查找id为1000的系统访问者的详细信息,通常我们知道系统访问者的所有细节,所以使用JavaBean对象作为访问信息。如果无法确定返回对象的详细属性或者时返回对象的属性经常发生变化,比如我们的业务方法中可能返回一个系统访问者的信息,也可能返回的是一个管理员的信息,那么我们可以选择使用Map(或者HashMap)对象声明为业务方法的返回对象。
返回JavaBean对象
这种情况下,控件将在SQL语句执行结束后,自动构造一个返回结果声明类型的对象,调用它的相关setter方法初始化这个对象,然后返回这个对象。如果初始化过程中没有找到合适的setter方法,系统将抛出违例信息。
我们可以通过如下的声明,控制控件在调用后返回一个Demo对象:
@SQL(statement = “select id,name,value from demo
where id={demoId}”)
public Demo getDemoById(int demoId) ;
可声明为返回JavaBean类型的Java类必须符合以下条件:
·Java类必须提供和statement中声明的返回字段对应的getter和setter方法。这些getter和setter方法必须支持大小写敏感。Java类中必须包含但不仅限于这些getter和setter方法。
·Java类中每个getter和setter方法定义的数据类型必须和数据库表中的数据类型保持一致。
如果该Java类是某个类的内部类,那么这个类必须使用public static关键字定义类声明。
返回Map(或者HashMap)对象
在不确定返回对象详细信息的情况下,我们可以声明返回对象类型为Map(或者HashMap),这种情况下,控件在SQL调用完成以后,将调用Map(或者HashMap)的put方法,将返回结果映射为Map(或者HashMap)对象,返回Map(或者HashMap)对象对象中键--值对的键就是数据表字段名称,键是大小写敏感的,返回Map(或者HashMap)对象中的所有键都被变成了大写字母,值就是数据表字段包含的值,值的类型和数据库中对应字段的类型有关。
我们可以通过如下的声明,控制控件在调用后返回一个Map(或者HashMap)对象:
@SQL(statement = “select id,name,value from demo where id={demoId}”)
public HashMap getDemoById(int demoId) ;
在业务方法声明为返回单条记录时,如果该记录的对应字段为空,那么返回结果的对应字段将根据对应属性的类型被初始化null、0或者false,如果SQL语句实际执行时没有找到符合条件的记录,控件的默认返回结果为null,如果SQL语句实际执行时返回了多条记录,那么控件将默认将符合条件的第一条记录作为返回结果。
使用控件返回多条记录
SQL查询语句的返回结果通常是一个以上的记录,JDBC控件支持使用数组、Iterator对象、ResultSet对象和XMLBeans对象来返回可能的多条记录。控件开发者需要根据不同的情况选择合适的返回对象,既要考虑让控件使用者操作简单,也要考虑可能引起的其他问题。
使用数组返回多条记录对控件使用者而言是最好的方式,因为数组的遍历不需要更多的JavaAPI知识。然而数组只能在数据库操作完成以后一次性生成,因此整个ResultSet对象将被缓存,所以如果查询结果是一个非常大的ResultSet的时候,可能会造成系统内存耗尽的情况,这种情况下,使用数组返回多条记录的控件开发者必须考虑数据的分批提取策略。
使用Iterator对象返回多条记录对控件的使用者提出了更高的要求,这种情况下,Iterator对象封装了ResulSet的数据获取行为,控件使用者在调用Iterator对象的next方法时,容器会调用ResultSet的对应方法从数据库中获取对应的记录,这种方式不存在ResultSet集大或者小的问题。当时这种方式不适合在PageFlow中使用,因为PageFlow的Action调用完成后跳转到显示页面使用Iterator对象时,数据库连接通常已经被关闭了,ResultSet已经无法获取相应的数据了,所以Iterator对象中的数据也无法得到。
JDBC控件也支持直接返回ResulSet对象,以便控件使用者能够自由的控制SQL语句操作结果。
如何使用数组返回多条记录
这种情况下你可以有两种选择:返回JavaBean对象数组或者Map(或者HashMap)数组。这两种情况的区别请参考章节<<如何返回单条记录>>中的相关内容。
我们可以使用下面这段代码声明业务方法返回JavaBean对象数组:
@SQL(statement = “select id,name,value from demo”)
public Demo[] getDemos() ;
如果需要声明业务方法返回的结果被封装成Map(或者HashMap)数组,请参考使用下面的这段代码:
@SQL(statement = “select id,name,value from demo”)
public Map[] getDemos() ;
如果SQL语句执行后没有符合条件的记录返回,上面的这两种情况下将返回一个长度为0的数组。
如何使用Iterator对象返回多条记录
和上面的情况一样,你可以选择Iterator中包含的对象是JavaBean对象或者是Map(或者HashMap)对象。
我们可以使用下面这段代码声明业务方法返回Iterator中包含的是JavaBean对象:
@SQL(statement = “select id,name,value from demo”,
iteratorElementType=Demo.class)
public java.util.Iterator getDemos() ;
如果需要声明业务方法返回的Iterator中使用Map(或者HashMap)封装单条记录的所有属性,请参考使用下面的这段代码,其中的iteratorElementType声明返回Iterator结果中包含的是HashMap对象:
@SQL(statement = “select id,name,value from demo”,
iteratorElementType=java.util.HashMap.class)
public java.util.Iterator getDemos() ;
后面这种情况下,返回结果中的HashMap对象的所有键(Key)都已经被变成了大写,控件使用者在访问时请注意这一点,不然可能引起程序的不正常运行。
如何使用ResultSet对象返回多条记录
这种方式的声明代码如下:
@SQL(statement=“SELECT * FROM customer”)
public java.sql.ResultSet findAllCustomersResultSet();
基于大家熟知的性能方面的考虑,不推荐控件开发者使用这种方式来返回多条记录。
结束语
数据库资源是企业应用中的主要资源形式之一,所以如何访问数据库资源是企业应用中的重要内容。控件架构中的JDBC控件大大的简化了数据库访问资源的复杂性、难度,开发者只需要通过简单的继承org.apache.beehive.controls.system.jdbc.JdbcControl,然后通过提供相应的注释就可以完成数据库资源的访问和操作结果的返回。
本文中,作者首先通过简单的例子介绍了JDBC控件使用的基本步骤,然后详细的介绍了JDBC控件提供的主要注释和使用方法,最后介绍了如何通过JDBC控件返回操作结果的方式方法。 |
|