快速应用JDBC控件访问数据库资源_JSP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

快速应用JDBC控件访问数据库资源

作者:黑客防线网安JSP教程基地 来源:黑客防线网安JSP教程基地 浏览次数:0

黑客防线网安网讯:  JDBC控件是Beehive1.0中提供的访问JDBC数据源的Java控件。通过继承JDBC控件,我们根本无须关注访问数据库资源的通讯细节,只需要定义自己的业务方法,增加相应的注释来描述该继承子类,...

  ·如何创建Tomcat环境下的DataSource资源请参考Tomcat的帮助文档。

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

  Datasource example
jndi/samplesDataSource
javax.sql.DataSource
Container

·创建访问Tomcat服务器Jndi上下文的类JndiContextFactory

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

  清单3 src orgvivianjeehivecontrolsexamplescontrols

  jndicontextJndiContextFactory.java

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

  我们可以使用ConnectionDataSource注释和新创建的JndiContextFactory类来注释JDBC控件了。

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

  @JdbcControl.ConnectionDataSource(
jndiName = "jndi/samplesDataSource",
jndiContextFactory=JndiContextFactory.class)

  ConnectionOptions注释

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

  ·readOnly

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

  ·resultSetHoldability

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

  ·typeMappers

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

  SQL注释

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

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

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

  statement编写规则

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

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

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

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

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

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

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

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

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

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

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

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

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

  statement创建实例

  ·不从业务方法获取参数

  下面的业务方法声明可以从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)对象中的所有键都被变成了大写字母,值就是数据表字段包含的值,值的类型和数据库中对应字段的类型有关。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-16391-1.html
网站维护教程更新时间:2023-02-17 17:31:48  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer