最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > jsp教程

JSP里快速使JDBC控件访问数据库

日期:07-23    来源:中国设计秀    作者:cnwebshow.com

  JDBC控件是Beehive1.0中提供的访问JDBC数据源的java控件。通过继承JDBC控件,我们根本无须关注访问数据库资源的通讯细节,只需要定义自己的业务方法,增加相应的注释来描述该继承子类,我们就可以非常轻松的实现企业应用中JDBC数据源的访问。ajF中国设计秀

  JDBC控件的所有注释在org.apache.beehive.controls.system.jdbc.JdbcControl接口中定义,Beehive编译器在编译时将检查这些注释是否使用正确。ajF中国设计秀

  本节中首先将通过一个简单的例子来演示如何通过继承JDBC控件来访问JDBC数据源,完成一个数据表的增加、删除、修改、查询等业务逻辑,随后将介绍如何使用JDBC控件访问JDBC数据源的更多技巧。ajF中国设计秀

  本文中所有例子的源代码可以通过下载资源区的链接下载。ajF中国设计秀

  本节中所有演示例子对应的JDBC数据源均为MySQL数据库。ajF中国设计秀

  第一个JDBC控件的例子ajF中国设计秀

  接下来的这段例子将演示如何通过继承JDBC控件来完成JDBC数据源的访问,实现JDBC数据源中一个数据表中记录增加、删除、修改和查询的业务逻辑。ajF中国设计秀

  在演示例子中,为了保证演示的简洁,我们使用JDBC直接连接到数据库,而没有使用通常访问数据库所采用的DataSource技术。ajF中国设计秀

  建立数据表ajF中国设计秀

  在本地MySQL数据库的Demo数据库实例中按照如下DDL建立相应的数据表。ajF中国设计秀

create table demo(ajF中国设计秀
 id int(5) PRimary key auto_increment,ajF中国设计秀
 name varchar(20) not null default '',ajF中国设计秀
 value varchar(20) not null default ''ajF中国设计秀
);ajF中国设计秀

  建立表征Demo对象的JavaBeanajF中国设计秀

  创建新的应用目录,然后创建表征Demo对象的JavaBeanajF中国设计秀

  清单1 srcorgvivianjbeehivecontrolsexamplescontrolsbeansajF中国设计秀

  Demo.javaajF中国设计秀

1. package org.vivianj.beehive.controls.examples.beans;ajF中国设计秀
2.ajF中国设计秀
3.ajF中国设计秀
4. /**ajF中国设计秀
5. * Demo 用于表征Beehive JDBC控件例子中的Demo对象ajF中国设计秀
6. */ajF中国设计秀
7. public class Demo implements java.io.Serializable{ajF中国设计秀
8. private int id;ajF中国设计秀
9.ajF中国设计秀
10. private String name;ajF中国设计秀
11.ajF中国设计秀
12. private String value;ajF中国设计秀
13.ajF中国设计秀
14. public int getId() {ajF中国设计秀
15. return id;ajF中国设计秀
16. }ajF中国设计秀
17.ajF中国设计秀
18. public void setId(int id) {ajF中国设计秀
19. this.id = id;ajF中国设计秀
20. }ajF中国设计秀
21.ajF中国设计秀
22. public String getName() {ajF中国设计秀
23. return name;ajF中国设计秀
24. }ajF中国设计秀
25.ajF中国设计秀
26. public void setName(String name) {ajF中国设计秀
27. this.name = name;ajF中国设计秀
28. }ajF中国设计秀
29.ajF中国设计秀
30. public String getValue() {ajF中国设计秀
31. return value;ajF中国设计秀
32. }ajF中国设计秀
33.ajF中国设计秀
34. public void setValue(String value) {ajF中国设计秀
35. this.value = value;ajF中国设计秀
36. }ajF中国设计秀
37.ajF中国设计秀
38. }ajF中国设计秀

  继承JDBC控件,增加自己的业务方法ajF中国设计秀

  清单2 srcorgvivianjbeehivecontrolsexamplescontrolsajF中国设计秀

  DemoMySQLControl.javaajF中国设计秀

1. package org.vivianj.beehive.controls.examples.controls;ajF中国设计秀
2.ajF中国设计秀
3. import org.apache.beehive.controls.api.bean.ControlExtension;ajF中国设计秀
4. import org.apache.beehive.controls.system.jdbc.JdbcControl;ajF中国设计秀
5. import org.vivianj.beehive.controls.examples.beans.Demo;ajF中国设计秀
6.ajF中国设计秀
7. /**ajF中国设计秀
8. * DemoMySQLControl 用于封装访问MySQL数据库中的Demo数据ajF中国设计秀
9. 表的所有业务逻辑ajF中国设计秀
10. * 包括新增、删除、修改、根据id查找对应的记录、查找所有DemoajF中国设计秀
11. 数据表中的记录、根据条件查找所有数据表中的记录ajF中国设计秀
12. * 数据库访问时根据参数从DriverManager中获取数据库连接ajF中国设计秀
13. */ajF中国设计秀
14.ajF中国设计秀
15. @ControlExtensionajF中国设计秀
16. @JdbcControl.ConnectionDriver(ajF中国设计秀
17. databaseDriverClass = "org.gjt.mm.mysql.Driver",ajF中国设计秀
18. databaseURL = "jdbc:mysql://localhost/estore ",ajF中国设计秀
19. userName = “root”, password = “root”)ajF中国设计秀
20. public interface DemoMySQLControl extends JdbcControl {ajF中国设计秀
21. /**ajF中国设计秀
22. * 向数据表demo中增加新的记录ajF中国设计秀
23. *ajF中国设计秀
24. * @param demoajF中国设计秀
25. * 新增加的Demo对象ajF中国设计秀
26. */ajF中国设计秀
27. @SQL(statement = "insert into demo(name,value)ajF中国设计秀
28. values({demo.name},{demo.value})")ajF中国设计秀
29. public void createDemo(Demo demo);ajF中国设计秀
30.ajF中国设计秀
31. /**ajF中国设计秀
32. * 修改数据表demo中demo.id对应记录的name和value信息ajF中国设计秀
33. *ajF中国设计秀
34. * @param demoajF中国设计秀
35. * 被修改的Demo对象ajF中国设计秀
36. */ajF中国设计秀
37. @SQL(statement = "update demo set name={demo.name},ajF中国设计秀
38. value={demo.value} where id={demo.id}")ajF中国设计秀
39. public void updateDemo(Demo demo);ajF中国设计秀
40.ajF中国设计秀
41. /**ajF中国设计秀
42. * 删除数据表demo中demoId对应的记录ajF中国设计秀
43. *ajF中国设计秀
44. * @param demoIdajF中国设计秀
45. * 被删除的Demo对象的id属性ajF中国设计秀
46. */ajF中国设计秀
47. @SQL(statement = "delete from demo where id={demoId}")ajF中国设计秀
48. public void deleteDemo(int demoId);ajF中国设计秀
49.ajF中国设计秀
50. /**ajF中国设计秀
51. * 根据demoId查找Demo数据库中对应的记录,返回对应的ajF中国设计秀
52. Demo对象ajF中国设计秀
53. *ajF中国设计秀
54. * @param demoIdajF中国设计秀
55. * 查找Demo对象的id属性ajF中国设计秀
56. * @return id属性为demoId的记录ajF中国设计秀
57. */ajF中国设计秀
58. @SQL(statement = "select id,name,value from demoajF中国设计秀
59. where id={demoId}")ajF中国设计秀
60. public Demo getDemoById(int demoId);ajF中国设计秀
61.ajF中国设计秀
62. /**ajF中国设计秀
63. * 返回Demo数据表中所有记录集合ajF中国设计秀
64. *ajF中国设计秀
65. * @return Demo数据表中所有记录集合ajF中国设计秀
66. */ajF中国设计秀
67. @SQL(statement = "select id,name,value from demo")ajF中国设计秀
68. public Demo[] getDemos();ajF中国设计秀
69.ajF中国设计秀
70. /**ajF中国设计秀
71. *ajF中国设计秀
72. * @param nameajF中国设计秀
73. * @returnajF中国设计秀
74. */ajF中国设计秀
75. @SQL(statement = "select id,name,value from demoajF中国设计秀
76. where name like {sql: name}")ajF中国设计秀
77. public Demo[] getDemosFilterByName(String name);ajF中国设计秀
78. } ajF中国设计秀
  控件调用ajF中国设计秀

  我们可以编写DemoMySQLControl控件的测试类,然后通过如下方式来完成控件中业务方法的调用。ajF中国设计秀

  在测试类中采用声明式控件实例化方式来实例化DemoMySQLControl控件。ajF中国设计秀

  ·@ControlajF中国设计秀

  DemoMySQLControl _control;ajF中国设计秀

  调用控件的相关业务方法来实现业务逻辑。ajF中国设计秀

  下面的代码段可以完成Demo对象的新增功能。ajF中国设计秀

Demo demo = new Demo();ajF中国设计秀
demo.setName(“name”);ajF中国设计秀
demo.setValue(“value”);ajF中国设计秀
_control.createDemo(demo);ajF中国设计秀

  实例分析ajF中国设计秀

  从上面的例子中我们可以看到,通过继承JDBC控件来完成JDBC数据源的访问是一件非常简单的事情,开发者需要完成的工作被简化为两项:编写表征访问对象的JavaBean和使用声明完成业务方法和逻辑的实现,这样的开发过程大大的简化了开发者的工作,极大地减少了开发者的代码编写量。ajF中国设计秀

  下面我们详细的分析一下继承JDBC控件的子类DemoMySQLControl:ajF中国设计秀

15. @ControlExtensionajF中国设计秀

  在程序的第15行,我们使用@ControlExtension来注释将要创建的这个接口继承了另外的控件接口ajF中国设计秀

16.@JdbcControl.ConnectionDriver(ajF中国设计秀
17.databaseDriverClass = “org.gjt.mm.mysql.Driver”,ajF中国设计秀
18.databaseURL = "jdbc:mysql://localhost/estore ",ajF中国设计秀
19.userName = “root”, password = “king”)ajF中国设计秀

  在程序的第16~19行我们使用@JdbcControl.ConnectionDriver注释来为将要创建的接口指定一些需要传递的参数,这里主要是一些数据库访问时所需要的JDBC驱动类、JDBC访问URL、数据库访问用户名和密码等必要信息。ajF中国设计秀

20.public interface DemoMySQLControl extends JdbcControl { 在程序的第20行使用extends关键字表示将要创建的接口DemoMySQLControl和JdbcControl接口之间的继承关系 ajF中国设计秀
27.@SQL(statement = "insert into demo(name,value) ajF中国设计秀
28.values({demo.name},{demo.value})")ajF中国设计秀

  在程序的第27~28行使用@SQL关键字注释接下来定义的这个业务方法所需要执行的业务逻辑,其中的{}表示对传入参数的调用,{}包含的内容表示了需要处理的参数,这些参数的表示方法遵循面向对象的属性调用方式,JDBC控件的解析器会将这些代码转化为对应的getter方法调用。ajF中国设计秀

29.public void createDemo(Demo demo);ajF中国设计秀

  在程序的第29行,采用常用的接口方法声明了该控件的一个访问接口。ajF中国设计秀

  后面的代码采用和27~29行相应的原理定义了其它需要实现的业务方法。需要注意的是,定义查询类方法时,如果只需要返回一条记录,目前通常的做法是返回一个Demo对象。如果返回的记录有超过一条的可能性,返回的是符合查询条件的Demo对象数组、List对象等,请参考《JDBC控件返回类型》部分的内容。ajF中国设计秀

  前面的内容中,我们已经通过继承JDBC控件完成了访问数据库资源的全部内容,现在你可以编写单元测试代码来测试控件是否符合要求了。请大家参考《控件入门》中的步骤完成JDBC控件的编译和单元测试工作。ajF中国设计秀

  到现在为止,我们已经知道了如何使用JDBC控件和注释来访问数据库资源的基本步骤和方法,但是还没有学习如何使用注释来让JDBC控件和业务内容的结合起来。这部分的内容分作两部分进行介绍:一是如何通过注释定制JDBC控件,提供访问数据库的信息(比如数据库访问方式、URL、用户名和密码等),一是如何确定每次业务方法执行的返回对象。ajF中国设计秀

  使用注释订制JDBC控件ajF中国设计秀

  本节中的内容将给大家介绍如何使用JDBC控件提供的注释根据不同的环境和要求来订制JDBC控件,完成JDBC数据源的访问和业务逻辑的封装。ajF中国设计秀

  JDBC控件支持的四个注释:ConnectionDataSource、ConnectionDriver、ConnectionOptions、SQL。四个注释中ConnectionDataSource、ConnectionDriver、ConnectionOptions是用于类级别的注释,用于描述JDBC控件继承类,SQL注释是方法级别的注释,用于描述JDBC继承类中的业务方法。ajF中国设计秀

  使用ConnectionDataSource注释可以指定JDBC控件访问数据库时根据采用DataSource方式获取数据库连接。使用ConnectionDriver注释可以指定JDBC控件访问数据库时使用指定的参数通过DriverManager获取数据库连接。ConnectionOptions注释描述了数据库访问时的一些扩展特性,比如数据库访问时是否使用READONLY优化(仍然可以进行UPDATE操作)等。ajF中国设计秀

  下面开始详细的介绍这些注释,并且通过提供简单的代码段来说明如何使用这些注释来配置JDBC控件的继承类。ajF中国设计秀

  ConnectionDriver注释ajF中国设计秀

  ConnectionDriver用于注释JDBC控件的继承类,控制JDBC控件在访问数据库的时候通过DriverManager获取数据库连接。ConnectionDriver注释支持5个参数:databaseDriverClass、databaseURL、userName、password、properties。ajF中国设计秀

  ·databaseDriverClassajF中国设计秀

  String类型,用于设定数据库驱动类的全名。使用ConnectionDriver注释时必须设置的参数。ajF中国设计秀

  比如访问MySQL数据库,可以使用databaseDriverClass= “org.gjt.mm.mysql.Driver”,访问Oracle数据库的时候可以使用databaseDriverClass= “oracle.jdbc.driver.OracleDriver”ajF中国设计秀

  ·databaseURLajF中国设计秀

  String类型,用于设定数据库访问的JDBC URL,使用ConnectionDriver注释时必须设置的参数。ajF中国设计秀

  比如访问MySQL可以使用databaseURL=“ jdbc:mysql://localhost/estore”,访问Oracle数据库时可以使用databaseURL=“ jdbc:oracle:thin:@localhost:1521:www”ajF中国设计秀

  ·userNameajF中国设计秀

  String类型,设置访问数据库时使用的用户名,可选参数。ajF中国设计秀

  ·passwordajF中国设计秀

  String类型,设置访问数据库时使用的密码,可选参数。ajF中国设计秀

  ·propertiesajF中国设计秀

  String类型,设置访问数据库时的一些其它参数,可以一次性传递多个参数,两个参数之间用逗号隔开。ajF中国设计秀

  在《第一个JDBC控件的例子》中,我们提供的代码已经演示了如何使用ConnectionDriver注释JDBC控件,请参见 清单2 。ajF中国设计秀

  ConnectionDriver注释的JDBC控件运行时,必须保证databaseDriverClass中指定的数据库驱动类位于classpath中,否则控件运行时将抛出违例。ajF中国设计秀

  ConnectionDataSource注释ajF中国设计秀

  ConnectionDataSource注释用于指定JDBC控件在访问数据库时通过DataSource获取数据库连接,它有两个属性:jndiName和jndiContextFactory。ajF中国设计秀

  ·jndiNameajF中国设计秀

  String类型,用于设置DataSource在目标容器内的jndiName属性ajF中国设计秀

  ·jndiContextFactoryajF中国设计秀

  Class类型,用于设置数据库访问时可以获取jndi上下文环境的类,被传入的参数类必须继承org.apache.beehive.controls.system.jdbc.JdbcControl. JndiContextFactory类,并且覆盖JndiContextFactory类的getContext()方法,getContext()将获取访问目标容器的上下文环境(Context)。ajF中国设计秀

  下面的章节中我们将看到如何通过JDBC控件和ConnectionDataSource注释访问Tomcat服务器,获取jndiName为jndi/samplesDataSource的DataSource资源,该DataSource连接到MySQL数据库的Demo实例,Web应用部署在Tomcat环境中。ajF中国设计秀
  修改Tomct配置文件,创建DataSource资源ajF中国设计秀

  ·如何创建Tomcat环境下的DataSource资源请参考Tomcat的帮助文档。ajF中国设计秀

  修改Web应用的配置文件web.xml,增加如下内容,增加对资源的引用ajF中国设计秀

Datasource exampleajF中国设计秀
jndi/samplesDataSourceajF中国设计秀
javax.sql.DataSourceajF中国设计秀
Container ajF中国设计秀
  ajF中国设计秀
  ·创建访问Tomcat服务器Jndi上下文的类JndiContextFactoryajF中国设计秀

  JndiContextFactory类继承自JdbcControl.JndiContextFactory父类,覆盖父类中的抽象方法----getContext(),清单3 中显示了JndiContextFactory类定义和实现的完整代码。ajF中国设计秀

  清单3 src orgvivianjbeehivecontrolsexamplescontrolsajF中国设计秀

jndicontextJndiContextFactory.javaajF中国设计秀

1. package org.vivianj.beehive.controls.examples.controls.jndicontext;ajF中国设计秀
2.ajF中国设计秀
3. import java.util.Hashtable;ajF中国设计秀
4.ajF中国设计秀
5. import javax.naming.Context;ajF中国设计秀
6. import javax.naming.InitialContext;ajF中国设计秀
7.ajF中国设计秀
8. import org.apache.beehive.controls.system.jdbc.JdbcControl;ajF中国设计秀
9.ajF中国设计秀
10. /**ajF中国设计秀
11. * JndiContextFactory 用于从Tomcat服务器中获取访问JNDI内容的上下文环境ajF中国设计秀
12. */ajF中国设计秀
13. public class JndiContextFactory extends JdbcControl.JndiContextFactory {ajF中国设计秀
14. /**ajF中国设计秀
15. * 获得本地Tomcat服务器中访问JNDI内容的上下文环境ajF中国设计秀
16. *ajF中国设计秀
17. */ajF中国设计秀
18. public Context getContext() {ajF中国设计秀
19.ajF中国设计秀
20. Context ctx = null;ajF中国设计秀
21.ajF中国设计秀
22. try {ajF中国设计秀
23. ctx = (Context)(new InitialContext().lookup("java:/comp/env"));ajF中国设计秀
24. } catch (Exception e) {ajF中国设计秀
25.ajF中国设计秀
26. }ajF中国设计秀
27.ajF中国设计秀
28. return ctx;ajF中国设计秀
29. }ajF中国设计秀
30. }ajF中国设计秀

  我们可以使用ConnectionDataSource注释和新创建的JndiContextFactory类来注释JDBC控件了。ajF中国设计秀

  下面的代码片断就是一个简单的例子,使用这段代码注释的JDBC控件,调用任何业务方法时,将通过本地Tomcat服务器上、JNDI名为“jndi/ samplesDataSource”的DataSource资源获取数据库连接。ajF中国设计秀

@JdbcControl.ConnectionDataSource(ajF中国设计秀
  jndiName = "jndi/samplesDataSource",ajF中国设计秀
  jndiContextFactory=JndiContextFactory.class)ajF中国设计秀

  ConnectionOptions注释ajF中国设计秀

  ConnectionOptions可以用于定义访问数据库时的一些扩展特性,可以选择性的和ConnectionDataSource或者ConnectionDriver一起使用。ConnectionOptions支持三个参数:readOnly、resultSetHoldability、typeMappers。ajF中国设计秀

  ·readOnlyajF中国设计秀

  boolean类型,如果设置为true,数据库连接将优化为ReadOnly的访问方式,但是仍然可以进行更新和删除操作。默认为false。ajF中国设计秀

  ·resultSetHoldabilityajF中国设计秀

  org.apache.beehive.controls.system.jdbc.JdbcControl.HoldabilityType类型,可以选择为HOLD_CURSORS_OVER_COMMIT或者CLOSE_CURSORS_AT_COMMIT,用于设置ResultSet指针的关闭策略,默认值是CLOSE_CURSORS_AT_COMMIT,表示在每次commit之后关闭ResulSet对象指针。ajF中国设计秀

  ·typeMappersajF中国设计秀

  org.apache.beehive.controls.system.jdbc.JdbcControl.TypeMapper数组类型。设置SQL自定义类型和Java类型之间的映射。TypeMappers类中指定的Java类型必须实现java.sql.SQLData接口ajF中国设计秀

  SQL注释ajF中国设计秀

  SQL注释用于描述JDBC控件继承类中定义的方法,主要设置被注释方法调用时需要执行的SQL语句和其它功能。我们可以回头看一看清单2,里面的每一个业务方法之前均有@SQL注释。ajF中国设计秀

  SQL注释支持很多属性设置,包括statement、arrayMaxLength等,其中最重要的就是statemet,本节中我们讨论statement属性的设置,其他属性的设置方法请大家参考Beehive的帮助文档,在大多数的情况下最好不要设置这些属性,因为里面可能用到JDBC3.0规范中的新特性,而现在很多数据库驱动并不支持这些特性。ajF中国设计秀

  statement内容描述了我们需要完成的业务逻辑,在statement中我们可以使用变量的方式访问被注释方法中传递进来的参数,JDBC控件的解析器在运行时保证这些参数的正确传递。ajF中国设计秀

  statement编写规则ajF中国设计秀

  SQL注释的statement属性提供了被注释方法调用时执行的SQL语句的内容,SQL语言中可以使用JdbcControl提供的特殊语法直接访问Java对象或者它的属性。编写statement必须满足以下条件。ajF中国设计秀

  ·statement中的sql语句编写方式和要求参考目标数据库的sql语句编写方式和要求。ajF中国设计秀

  ·statement中使用{…}声明变量来获取业务方法调用时所传递参数或者它的属性。ajF中国设计秀

  ·statement中变量声明的第一个字符和最后一个字符不能是空格,也就是说不能出现{ a}或者{a }这样的情况,否则可能执行结果和您期望的会有很大的出入ajF中国设计秀

  ·{}中间的内容是大小写敏感的。如果传入的参数名为a,而{}中引用为A,他们之间将无法匹配。ajF中国设计秀

  ·{}中间的内容可以是参数名(传入的参数是Java基本数据类型时适用),或者是参数对象的某个成员变量(传入的参数是Java类对象时)。ajF中国设计秀

  ·{}中引用Java对象的字段时,必须保证该字段符合以下条件之一,否则Java控件调用时将会返回一个违例:ajF中国设计秀

   * 该字段被public关键字声明为公共字段,可以使用 对象名.字段名 直接访问ajF中国设计秀

   * 该字段被private关键字声明为私有字段,但是提供了公共的getter方法,可以通过 对象名.get属性名 方式访问。ajF中国设计秀

   * 该Java对象继承了java.util.Map接口,可以通过 对象名.get(“属性名”)方式访问ajF中国设计秀

  statement中引用业务方法中传递的参数时必须保证这些参数和对应的数据表的字段类型保持一致,不能出现数据表的字段是NUMBER类型,而对应的参数却是String类型。ajF中国设计秀

  当业务方法传递的日期或者时间类型的参数需要在statement中被引用时,请保证这些传递的日期和时间使用的是java.sql包中的对应类,比如我们应该使用java.sql.Date而不要使用java.util.Date来传递日期类型的变量给statementajF中国设计秀

  statement中不能出现单引号。如果确实需要使用单引号,必须采用特别的方法解决。ajF中国设计秀

  statement创建实例ajF中国设计秀

  ·不从业务方法获取参数ajF中国设计秀

  下面的业务方法声明可以从demo表中取出所有所有记录,返回一个Demo对象的数组。ajF中国设计秀

@SQL(statement=“select * from demo” )ajF中国设计秀
Public Demo[] getDemos();ajF中国设计秀

  ·从业务方法中获取基本类型参数ajF中国设计秀

  下面的statement中,我们使用{demoId}变量从getDemoById()方法调用中获取传入的参数demoId。ajF中国设计秀

@SQL(statement=“select * from demo where id={demoId}” )ajF中国设计秀
Public Demo[] getDemoById(int demoId);ajF中国设计秀

  ·从业务方法中获取Java对象类型参数ajF中国设计秀

  下面的statement中,我们使用{demo.name}变量表示从createDemo ()方法调用中获取传入的Java类对象demo的name属性的内容。ajF中国设计秀

@SQL(statement = “insert into demo(name,value)ajF中国设计秀
 values({demo.name},{demo.value})”)ajF中国设计秀
public void createDemo(Demo demo);ajF中国设计秀

  ·从业务方法中获取完整SQL语句ajF中国设计秀

  有些时候,SQL语句可能需要动态生成,这时候statement默认的方式无法帮开发者完成这个过程,而是需要在Java代码中完成SQL语句的组装后传递给业务方法,这种情况下我们可以使用{sql: …}的方式向statement中传递一个完整的sql语句。ajF中国设计秀

@SQL(statement=“{sql: totalsql}” )ajF中国设计秀
Public Demo[] getDemos(String totalsql);ajF中国设计秀

  ·从业务方法中获取SQL语句片断ajF中国设计秀

  statement还支持某一段SQL语句从业务方法的参数中获取,比如下面的这个例子中,只有最后的{sql: name}来源于业务方法中的参数。ajF中国设计秀

@SQL(statement = “select id,name,value from demoajF中国设计秀
 where name like {sql: name}”)ajF中国设计秀
public Demo[] getDemosFilterByName(String name);ajF中国设计秀

  这种方式可以解决SQL语句中包含引号等特殊字符的问题,解决方法是你可以在业务方法调用之前使用Java代码创建包含这些特殊字符串的内容,然后通过sql片断的方式发送给statement。ajF中国设计秀

  这种方式另外一种用途是可以解决SQL语句部分片断需要动态生成的问题,举个例子,我们的多条件查询的条件下,用户可以选择按照一个或者多个条件进行查询,所以where语句后面的条件是动态的,这种情况下,我们就可以把判断和SQL语句中where语句的生成这部分功能实现分离到Java语句中,然后作为业务方法调用参数传递到statement中来。ajF中国设计秀

  调用存储过程ajF中国设计秀

  JDBC控件支持对存储过程的调用,只需要在statement中配置里面采用{call …}这样的方式表示当前执行的是一个存储过程就可以了,下面的例子演示了如何调用存储过程以及如何向调用过程传递参数。ajF中国设计秀

@SQL(statement=“call sp_updateData({keyVal}, {intVal})”ajF中国设计秀
void call_sp_updateCust(short keyVal, int intVal);ajF中国设计秀

  控件返回类型ajF中国设计秀

  继承JDBC控件后声明业务方法时,查询类业务方法需要返回数据,在业务逻辑中,需要返回的业务数据通常可以分为三种:ajF中国设计秀

  ·简单字段。ajF中国设计秀

  比如要查询今天有多少人访问了我们的系统、编号Id为1000的用户他的真实姓名是什么?。ajF中国设计秀

  ·单条记录。ajF中国设计秀

  比如查询结果需要返回编号为1000的用户。ajF中国设计秀

  ·多条记录。ajF中国设计秀

  比如查询结果需要返回所有系统用户。ajF中国设计秀

  本节中将按照这三种不同的情况给大家介绍JDBC控件所支持的返回类型以及内部处理机制。ajF中国设计秀

  使用控件返回简单字段ajF中国设计秀

  JDBC控件支持所有Java基本类型及其对应对象类型的返回,比如int、Integer、String等,在继承JDBC控件后声明业务方法时,只需要声明所需要的返回类型,JDBC控件会自动将SQL操作结果造型为所需要的返回类型。ajF中国设计秀

  比如我们声明一个业务方法:ajF中国设计秀

@SQL(statement = “select count(*) from demo”)ajF中国设计秀
public int getDemosCount();]ajF中国设计秀

  控件调用后的结果将返回一个int数值,而如果你声明的业务方法如下:ajF中国设计秀

@SQL(statement = “select count(*) from demo”)ajF中国设计秀
public Integer getDemosCount();ajF中国设计秀

  控件调用后的结果将返回一个Integer对象。ajF中国设计秀

  返回结果为简单字段时,如果SQL语句执行后没有符合要求的结果,控件将根据声明的返回类型返回不同的值,如果声明返回结果为数值型,那么返回结果为0;如果声明返回结果为boolean,那么将返回false,而如果声明的返回结果为类类型,那么控件调用返回结果为null。ajF中国设计秀

  使用控件返回单条记录ajF中国设计秀

  当SQL查询语句需要返回单条记录时,控件支持两种不同的返回类型:JavaBean对象或者Map(或者HashMap)对象。如果能够确定返回对象的属性,通常采用返回JavaBean对象,比如要查找id为1000的系统访问者的详细信息,通常我们知道系统访问者的所有细节,所以使用JavaBean对象作为访问信息。如果无法确定返回对象的详细属性或者时返回对象的属性经常发生变化,比如我们的业务方法中可能返回一个系统访问者的信息,也可能返回的是一个管理员的信息,那么我们可以选择使用Map(或者HashMap)对象声明为业务方法的返回对象。ajF中国设计秀

  返回JavaBean对象ajF中国设计秀

  这种情况下,控件将在SQL语句执行结束后,自动构造一个返回结果声明类型的对象,调用它的相关setter方法初始化这个对象,然后返回这个对象。如果初始化过程中没有找到合适的setter方法,系统将抛出违例信息。ajF中国设计秀

  我们可以通过如下的声明,控制控件在调用后返回一个Demo对象:ajF中国设计秀

@SQL(statement = “select id,name,value from demoajF中国设计秀
 where id={demoId}”)ajF中国设计秀
public Demo getDemoById(int demoId) ;ajF中国设计秀

  可声明为返回JavaBean类型的Java类必须符合以下条件:ajF中国设计秀

  ·Java类必须提供和statement中声明的返回字段对应的getter和setter方法。这些getter和setter方法必须支持大小写敏感。Java类中必须包含但不仅限于这些getter和setter方法。ajF中国设计秀

  ·Java类中每个getter和setter方法定义的数据类型必须和数据库表中的数据类型保持一致。ajF中国设计秀

  如果该Java类是某个类的内部类,那么这个类必须使用public static关键字定义类声明。ajF中国设计秀

  返回Map(或者HashMap)对象ajF中国设计秀

  在不确定返回对象详细信息的情况下,我们可以声明返回对象类型为Map(或者HashMap),这种情况下,控件在SQL调用完成以后,将调用Map(或者HashMap)的put方法,将返回结果映射为Map(或者HashMap)对象,返回Map(或者HashMap)对象对象中键--值对的键就是数据表字段名称,键是大小写敏感的,返回Map(或者HashMap)对象中的所有键都被变成了大写字母,值就是数据表字段包含的值,值的类型和数据库中对应字段的类型有关。ajF中国设计秀

  我们可以通过如下的声明,控制控件在调用后返回一个Map(或者HashMap)对象:ajF中国设计秀

@SQL(statement = “select id,name,value from demo where id={demoId}”)ajF中国设计秀
public HashMap getDemoById(int demoId) ;ajF中国设计秀

  在业务方法声明为返回单条记录时,如果该记录的对应字段为空,那么返回结果的对应字段将根据对应属性的类型被初始化null、0或者false,如果SQL语句实际执行时没有找到符合条件的记录,控件的默认返回结果为null,如果SQL语句实际执行时返回了多条记录,那么控件将默认将符合条件的第一条记录作为返回结果。ajF中国设计秀

  使用控件返回多条记录ajF中国设计秀

  SQL查询语句的返回结果通常是一个以上的记录,JDBC控件支持使用数组、Iterator对象、ResultSet对象和XMLBeans对象来返回可能的多条记录。控件开发者需要根据不同的情况选择合适的返回对象,既要考虑让控件使用者操作简单,也要考虑可能引起的其他问题。ajF中国设计秀

  使用数组返回多条记录对控件使用者而言是最好的方式,因为数组的遍历不需要更多的JavaAPI知识。然而数组只能在数据库操作完成以后一次性生成,因此整个ResultSet对象将被缓存,所以如果查询结果是一个非常大的ResultSet的时候,可能会造成系统内存耗尽的情况,这种情况下,使用数组返回多条记录的控件开发者必须考虑数据的分批提取策略。ajF中国设计秀

  使用Iterator对象返回多条记录对控件的使用者提出了更高的要求,这种情况下,Iterator对象封装了ResulSet的数据获取行为,控件使用者在调用Iterator对象的next方法时,容器会调用ResultSet的对应方法从数据库中获取对应的记录,这种方式不存在ResultSet集大或者小的问题。当时这种方式不适合在PageFlow中使用,因为PageFlow的Action调用完成后跳转到显示页面使用Iterator对象时,数据库连接通常已经被关闭了,ResultSet已经无法获取相应的数据了,所以Iterator对象中的数据也无法得到。ajF中国设计秀

  JDBC控件也支持直接返回ResulSet对象,以便控件使用者能够自由的控制SQL语句操作结果。ajF中国设计秀

  如何使用数组返回多条记录ajF中国设计秀

  这种情况下你可以有两种选择:返回JavaBean对象数组或者Map(或者HashMap)数组。这两种情况的区别请参考章节<<如何返回单条记录>>中的相关内容。ajF中国设计秀

  我们可以使用下面这段代码声明业务方法返回JavaBean对象数组:ajF中国设计秀

@SQL(statement = “select id,name,value from demo”)ajF中国设计秀
public Demo[] getDemos() ;ajF中国设计秀

  如果需要声明业务方法返回的结果被封装成Map(或者HashMap)数组,请参考使用下面的这段代码:ajF中国设计秀

@SQL(statement = “select id,name,value from demo”)ajF中国设计秀
public Map[] getDemos() ;ajF中国设计秀

  如果SQL语句执行后没有符合条件的记录返回,上面的这两种情况下将返回一个长度为0的数组。ajF中国设计秀

  如何使用Iterator对象返回多条记录ajF中国设计秀

  和上面的情况一样,你可以选择Iterator中包含的对象是JavaBean对象或者是Map(或者HashMap)对象。ajF中国设计秀

  我们可以使用下面这段代码声明业务方法返回Iterator中包含的是JavaBean对象:ajF中国设计秀

@SQL(statement = “select id,name,value from demo”,ajF中国设计秀
iteratorElementType=Demo.class)ajF中国设计秀
public java.util.Iterator getDemos() ;ajF中国设计秀

  如果需要声明业务方法返回的Iterator中使用Map(或者HashMap)封装单条记录的所有属性,请参考使用下面的这段代码,其中的iteratorElementType声明返回Iterator结果中包含的是HashMap对象:ajF中国设计秀

@SQL(statement = “select id,name,value from demo”,ajF中国设计秀
iteratorElementType=java.util.HashMap.class)ajF中国设计秀
public java.util.Iterator getDemos() ;ajF中国设计秀

  后面这种情况下,返回结果中的HashMap对象的所有键(Key)都已经被变成了大写,控件使用者在访问时请注意这一点,不然可能引起程序的不正常运行。ajF中国设计秀

  如何使用ResultSet对象返回多条记录ajF中国设计秀

  这种方式的声明代码如下:ajF中国设计秀

@SQL(statement=“SELECT * FROM customer”)ajF中国设计秀
public java.sql.ResultSet findAllCustomersResultSet();ajF中国设计秀

  基于大家熟知的性能方面的考虑,不推荐控件开发者使用这种方式来返回多条记录。ajF中国设计秀

  结束语ajF中国设计秀

  数据库资源是企业应用中的主要资源形式之一,所以如何访问数据库资源是企业应用中的重要内容。控件架构中的JDBC控件大大的简化了数据库访问资源的复杂性、难度,开发者只需要通过简单的继承org.apache.beehive.controls.system.jdbc.JdbcControl,然后通过提供相应的注释就可以完成数据库资源的访问和操作结果的返回。ajF中国设计秀

  本文中,作者首先通过简单的例子介绍了JDBC控件使用的基本步骤,然后详细的介绍了JDBC控件提供的主要注释和使用方法,最后介绍了如何通过JDBC控件返回操作结果的方式方法。ajF中国设计秀

本文引用地址:/bc/article_46693.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明