[转载]开发CMP类型实体Bean(2)

开发CMP类型实体Bean(2)

3.2.9 JBoss查询语言

由于JBoss是遵守Sun公司J2EE规范的产品,所以JBoss支持J2EE标准中的EJB-QL查询语言。EJB-QL查询语言写在ejb-jar.xml中。除此以外,JBoss还支持JBossQL语言、DynamicQL语言和DeclaredSQL语言,这3种语言是JBoss为补充EJB-QL的功能而提供的,这些语言写在jbosscmp-jdbc.xml中。

3.2.9.1 EJB-QL查询语言

EJB标准为了实现CMP组件中的查找方法(Finder)和选择方法(Select)而建立了EJB查询语言。最新的EJB 2.0规范以92版结构化查询语言(SQL-92)为参考,定义了EJB规范中标准的查询语言,即EJB-QLEJB-QL统一了J2EE服务器产品的CMP方法,使不同J2EE服务器产品内的CMP组件可以统一起来,成为通用组件,从而提高了EJB组件的可移植性。

另外,EJB 2.0规范在CMP类型实体Bean组件的标准定义中新增了容器管理关系字段(Container-Managed Relationship,简称CMR),CMR用于表示实体组件所代表的数据库记录之间的对应关系。

1EJB QL查询语言的通用语法规则

SELECT [DISTINCT] OBJECT(变量) FROM abstract-schema-name [AS] 变量

[WHERE value comparison value]

上述查询语句包括三部分子句:SELECT, FROMWHERE

SELECT子句定义了该EJB QL查询语句执行的操作类型,并且能够声明查询语句返回对象的数据类型;FROM子句定义了EJB QL语句的对象查询范围;WHERE子句是查询语句的可选项,用于标识查询语句返回被查询对象的条件。

2SELECT子句

SELECT子句定义EJB-QL语句要执行的操作类型,并且通过该子句定义了返回对象的类型。例如:

select object(g) from node g where g.title =?1

注:这里的?1是指输入的第一个参数值。

在这语句中,如果在SELECT关键字后附加"DISTINCT"标识,则查询语句将返回EJB容器中具有惟一类型标识的node对象实例。

3FROM子句

FROM子句通过XML部署描述文件中abstract-schema-name标识或ejb-name标识中的内容来定义查询语句所查询的对象范围。查询对象的范围可以用一种类型对象来确定,如前面第一个查询语句中的"node g"字符串。

4WHERE子句

WHERE子句通常由条件表达式构成,用于确定查询语句返回对象的条件。例如上面语句中的“where g.title =?1部分,用于判断对象的title属性值是否与查询值一致。

本书简单地介绍了EJB-QL的语法,如果你想深入了解EJB-QL,可以参看SunJ2EE标准文档。

3.2.9.2 JBossQL查询语言

JBossQLJBoss实现的一种查询语言,作为对EJB-QL的有力补充。JBossQL的语句结构如下:

JBossQL := SELECT子句 FROM子句[WHERE子句] [ORDER BY子句]

JBossQLSELECT子句、FROM子句、可选的WHERE子句和ORDER BY子句组成。其中SELECT子句、FROM子句和WHERE子句与EJB-QL相近,ORDER BY子句为CMP增加了排序功能。

JBossQL中,还可以使用IN, LIKE关键字,也可以套用一些内建函数,包括UCASE, LCASE, CONCATSUBSTRING

JBossQL的使用示例:

SELECT OBJECT(g) FROM node g WHERE g.id > ?1 ORDER BY g.id

例如将前面NodeBeanfindAll方法用JBoss-QL来完成:

findAll

3.2.9.3 DeclaredSQL

DeclaredSQLJBoss支持的另外一种查询语言,这种语言的查询功能主要通过WHERE语句来实现,并且支持SELECT子句和FROM子句。

例如将前面NodeBeanfindByTitle方法用DeclaredSQL来完成:

findByTitle

java.lang.String

DeclaredSQL保持了XML的结构,所实现的查询功能是对EJB-QL的补充。

3.2.9.4 其他查询方式

JBoss还支持DynamicQL方式和类似于BMP的查询方式。DynamicQL需要用户自己分析输入的参数,根据情况可以动态生成查询语句,其声明方式如下:

ejbSelectTitle

java.lang.String

java.lang.Object[]

JBossCMP引擎实现了EJB 2.0CMP规范中的内容。对于BMP类型实体Bean,本章会在后面的小节中介绍。在这里使用CMP的配置文件可以借助JBoss CMP引擎来生成查询方法,但是如果在CMP的实现类中添加类似BMP那样的查询方法,也会被JBoss调用。

3.2.10 CMPJBoss中的描述

从前面的介绍中可以看到,JBoss除了EJB标准中规定的内容外,对于CMP的实现还有一些特殊的支持,这些内容是JBoss所特有的,开发者通过在jbosscmp-jdbc.xml中添加适当的描述,就可以利用JBoss所提供的针对CMP类型实体Bean的特殊支持。

下面的内容详细介绍了在JBoss中描述CMP类型实体Beanjbosscmp-jdbc.xml文件部分。

作为CMP描述的起始标记

CMP描述主要包括:默认部分、值对象类声明、EJB声明、关系描述、数据类型映射、用户数据类型映射和其他部分。

默认部分

<dependent-value-classes> 值对象类声明

EJB声明

关系描述

数据类型映射

用户数据类型映射

保留字声明

1.默认设置

作为默认设置描述的起始标记

设置CMP在创建时如果对应的数据库表不存在,是否需要服务器创建这个数据表,可以选择true或者false

设置CMP在结束时是否需要服务器删除对应的数据表,可以选择true或者false

设定数据资源的JNDI名称

设定数据库资源的映射名称

通过属性来设定实体命令

一次性读取的实体数量

外键是否被添加到关系角色中,可以选择true或者false

设定查询缓冲的最大值

创建数据表时是否增加主键,可以选择true或者false

数据库表创建时执行的SQL语句

每个sql-statement代表一条SQL语句

首选的关系映射方式,可以选择foreign-keyrelation-table

设置将关系添加到预读的内容中

设置优先预读的字段组

设置一次预读的实体数量

设置预读策略,可以选择none, on-load或者on-find

设置只读属性,可以选择true或者false

当一个只读字段被执行方法时的超时设定

是否锁定行选择,可以选择true或者false

设定自动增加

设定列名

设定字段名

设定JDBC类型,如VARCHAR

设置只读属性,可以选择true或者false

当一个只读字段被执行方法时的超时设定

设定数据库的SQL类型,如VARCHAR(32)

设定主键类型,如java.lang.String

2.值对象类声明

<dependent-value-classes>作为值对象类部分描述的起始标记dependent-value- classes>

关于这个值对象类的描述

值对象类对应的类名

值对象类通常包含不止一个属性

包含对应字段的列名

设定JDBC类型,如VARCHAR

设定此处字段不为空

属性名

设定数据库的SQL类型,如VARCHAR(32)

3EJB声明

作为CMP描述中EJB声明的起始标记

EJB声明中可以包含若干个entity子元素,每个entity代表一个实体Bean

实体Bean声明中最关键的描述是:ejb-name, table-name, querycmp-field

作为实体Bean声明的起始标记

设置EJB的名称

设置对应数据表的名称

4EJB查询

一个query代表一个查询方法

查询方法的描述

查询方法的名称

查询方法的参数类型全称,可以有多个

JBoss特有的查询语句

JBoss特有的查询语句,使用下面5个子元素来描述查询

from子句

order子句

select子句

where子句

写在Declared-SQl中的其他语句

代表JBoss实现的另一种查询方式,在这种方式中,查询的方法参数将被传递给实现方法

设置将关系添加到预读的内容中

设置优先预读的字段组

设置一次预读的实体数量

设置预读策略,可以选择none, on-load或者on-find

5CMP的数据字段

设定自动增加

字段返回后检查状态,可以选择true或者false

设定列名

设定字段名

设置服务器为字段数据创建一个索引表

设定JDBC类型,如VARCHAR

设定此处字段不为空

设定数据库的SQL类型,如VARCHAR(32)

包含对应字段的列名

设定JDBC类型,如VARCHAR

设定此处字段不为空

属性名

设定数据库的SQL类型,如VARCHAR(32)

设置只读属性,可以选择true或者false

当一个只读字段被执行方法时的超时设定

设置状态工厂类的全称

设置CMP在创建时如果对应的数据库表不存在,是否需要服务器创建这个数据表,可以选择true或者false

设置CMP在结束时是否需要服务器删除对应的数据表,可以选择true或者false

设定数据资源的JNDI名称

设定数据库资源的映射名称

设置优先预读的字段组

通过属性来设定实体命令

一次性读取的实体数量

设置查询时不被先加载的字段组

设定查询缓冲的最大值

包含多个load-group

有些字段通常会一起被读取,此时可以将它们设为一个组

描述信息

这个组中的一个字段,一个组里可以有多个字段

这个组的名称

创建数据表时是否增加主键,可以选择true或者false

数据库表创建时执行的SQL语句

每个sql-statement代表一条SQL语句

设置将关系添加到预读的内容中

设置优先预读的字段组

设置一次预读的实体数量

设置预读策略,可以选择none, on-load或者on-find

设置只读属性,可以选择true或者false

当一个只读字段被执行方法时的超时设定

是否锁定行选择,可以选择true或者false

设定自动增加

设定列名

设定字段名

设定JDBC类型,如VARCHAR

设置只读属性,可以选择true或者false

当一个只读字段被执行方法时的超时设定

设定数据库的SQL类型,如VARCHAR(32)

设定主键类型,如java.lang.String

记录一些统计信息

6.关系描述

作为关系描述的起始标记

每个relationships中包含若干个关系描述ejb-relation,具体如下:

关系的名称

设置对应数据表的名称

设置只读属性,可以选择true或者false

当一个只读字段被执行方法时的超时设定

映射的外键

设置CMP在创建时如果对应的数据库表不存在,是否需要服务器创建这个数据表,可以选择true或者false

设置CMP在结束时是否需要服务器删除对应的数据表,可以选择true或者false

设定数据资源的JNDI名称

设定数据库资源的映射名称

创建数据表时是否增加主键,可以选择true或者false

数据库表创建时执行的SQL语句

每个sql-statement代表一条SQL语句

是否锁定行选择,可以选择true或者false

关系角色名称,如book-has-page

7.数据类型映射表

数据类型映射表的作用是建立Java数据、JDBC数据和SQL数据之间的映射关系。

作为数据类型映射的起始标记

一个type-mappings中包含多个type-mapping子元素,每个type-mapping代表一个映射关系。

类型映射序列的名称

一个数据类型映射表中包含多个mapping

Java数据类型,如java.lang.Byte

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-131574/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-131574/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值