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-QL。EJB-QL统一了J2EE服务器产品的CMP方法,使不同J2EE服务器产品内的CMP组件可以统一起来,成为通用组件,从而提高了EJB组件的可移植性。
另外,EJB 2.0规范在CMP类型实体Bean组件的标准定义中新增了容器管理关系字段(Container-Managed Relationship,简称CMR),CMR用于表示实体组件所代表的数据库记录之间的对应关系。
1.EJB QL查询语言的通用语法规则
SELECT [DISTINCT] OBJECT(变量) FROM abstract-schema-name [AS] 变量
[WHERE value comparison value]
上述查询语句包括三部分子句:SELECT, FROM和WHERE。
SELECT子句定义了该EJB QL查询语句执行的操作类型,并且能够声明查询语句返回对象的数据类型;FROM子句定义了EJB QL语句的对象查询范围;WHERE子句是查询语句的可选项,用于标识查询语句返回被查询对象的条件。
2.SELECT子句
SELECT子句定义EJB-QL语句要执行的操作类型,并且通过该子句定义了返回对象的类型。例如:
select object(g) from node g where g.title =?1
注:这里的?1是指输入的第一个参数值。
在这语句中,如果在SELECT关键字后附加"DISTINCT"标识,则查询语句将返回EJB容器中具有惟一类型标识的node对象实例。
3.FROM子句
FROM子句通过XML部署描述文件中abstract-schema-name标识或ejb-name标识中的内容来定义查询语句所查询的对象范围。查询对象的范围可以用一种类型对象来确定,如前面第一个查询语句中的"node g"字符串。
4.WHERE子句
WHERE子句通常由条件表达式构成,用于确定查询语句返回对象的条件。例如上面语句中的“where g.title =?1”部分,用于判断对象的title属性值是否与查询值一致。
本书简单地介绍了EJB-QL的语法,如果你想深入了解EJB-QL,可以参看Sun的J2EE标准文档。
3.2.9.2 JBossQL查询语言
JBossQL是JBoss实现的一种查询语言,作为对EJB-QL的有力补充。JBossQL的语句结构如下:
JBossQL := SELECT子句 FROM子句[WHERE子句] [ORDER BY子句]
JBossQL由SELECT子句、FROM子句、可选的WHERE子句和ORDER BY子句组成。其中SELECT子句、FROM子句和WHERE子句与EJB-QL相近,ORDER BY子句为CMP增加了排序功能。
在JBossQL中,还可以使用IN, LIKE关键字,也可以套用一些内建函数,包括UCASE, LCASE, CONCAT和SUBSTRING。
JBossQL的使用示例:
SELECT OBJECT(g) FROM node g WHERE g.id > ?1 ORDER BY g.id
例如将前面NodeBean的findAll方法用JBoss-QL来完成:
findAll
3.2.9.3 DeclaredSQL
DeclaredSQL是JBoss支持的另外一种查询语言,这种语言的查询功能主要通过WHERE语句来实现,并且支持SELECT子句和FROM子句。
例如将前面NodeBean的findByTitle方法用DeclaredSQL来完成:
findByTitle
java.lang.String
DeclaredSQL保持了XML的结构,所实现的查询功能是对EJB-QL的补充。
3.2.9.4 其他查询方式
JBoss还支持DynamicQL方式和类似于BMP的查询方式。DynamicQL需要用户自己分析输入的参数,根据情况可以动态生成查询语句,其声明方式如下:
ejbSelectTitle
java.lang.String
java.lang.Object[]
JBoss的CMP引擎实现了EJB 2.0的CMP规范中的内容。对于BMP类型实体Bean,本章会在后面的小节中介绍。在这里使用CMP的配置文件可以借助JBoss CMP引擎来生成查询方法,但是如果在CMP的实现类中添加类似BMP那样的查询方法,也会被JBoss调用。
3.2.10 CMP在JBoss中的描述
从前面的介绍中可以看到,JBoss除了EJB标准中规定的内容外,对于CMP的实现还有一些特殊的支持,这些内容是JBoss所特有的,开发者通过在jbosscmp-jdbc.xml中添加适当的描述,就可以利用JBoss所提供的针对CMP类型实体Bean的特殊支持。
下面的内容详细介绍了在JBoss中描述CMP类型实体Bean的jbosscmp-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-key和relation-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)
3.EJB声明
作为CMP描述中EJB声明的起始标记
EJB声明中可以包含若干个entity子元素,每个entity代表一个实体Bean
实体Bean声明中最关键的描述是:ejb-name, table-name, query和cmp-field。
作为实体Bean声明的起始标记
设置EJB的名称
设置对应数据表的名称
4.EJB查询
一个query代表一个查询方法
查询方法的描述
查询方法的名称
查询方法的参数类型全称,可以有多个
JBoss特有的查询语句
JBoss特有的查询语句,使用下面5个子元素来描述查询
from子句
order子句
select子句
where子句
写在Declared-SQl中的其他语句
代表JBoss实现的另一种查询方式,在这种方式中,查询的方法参数将被传递给实现方法
设置将关系添加到预读的内容中
设置优先预读的字段组
设置一次预读的实体数量
设置预读策略,可以选择none, on-load或者on-find
5.CMP的数据字段
设定自动增加
字段返回后检查状态,可以选择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/