<x:select>

x:select 操作用来在关系数据库中执行查询。如果查询生成非空结果集,则在应用程序服务器上的内存中对它的行进行高速缓存。始终将这些行的其中一行(最初是第一行)认为是当前行。

使用此操作将创建 DBSelect Bean,可以使用变量(名称在 id 属性中指定)访问这个 Bean。

提供了 JSP 操作来使用 DBSelect Bean 的基本功能。可以使用 x:nextRowx:previousRow 来定位至结果集中的其他行。可以使用 x:updateRowx:deleteRowx:insertRow 操作来更改结果集中的行,而不必编写其他的 SQL 语句。通过使用 x:getColumnx:setColumn 操作,您可以访问结果集中的列值。如果 SQL 语句带有参数,则可使用 x:getParameterx:parameter 操作对其进行访问。

DBSelect Bean 的所有方法也都可以使用 scriptlet 执行,并且它的所有属性都可以使用标准的 jsp:getPropertyjsp:setProperty 操作访问。

语法

<x:select	id = "name"
		scope = "page|request|session"	
		connectionSpec = "connectionSpec_id"
		connectionSpecRef = "connectionSpecRef"
		maxFieldSize = "numberOfBytes"
		maxRows = "numberOfRows"
		distinctTypesEnabled = "true|false"
		timeOut = "seconds"
		readOnly = "true|false"
		nullToken = "string"
		trace = "true|false" >
	<x:sql>
	</x:sql>
	<x:parameter	
			parmName = "name"
			position = "number"
		type = "sqltype"
		mode = "in|out|inout" 
		value = "parmValue" />
</x:select>

x:select 操作具有下列属性:

id
用来在指定名称空间中标识 DBSelect Bean 的名称,这也是它的脚本编制变量名。指定的名称区分大小写,且必须符合当前脚本语言的变量命名约定。
scope
用来定义对象的作用域。缺省值为 page。
connectionSpec
x:dataSourceSpecx:driverManagerSpec 操作的标识。值区分大小写,且必须与作用域内的 connectionSpec 操作相匹配。

引用的操作提供了连接至数据库所需的信息。如果操作发生在 x:batch 操作的主体内(在这种情况下,将使用 x:batch 操作中标识的 connectionSpec 操作),则省略此属性。如果同时在这两个位置中指定它,则会将其标记为错误。

connectionSpecRef
对将要用来获取进行连接所需信息的 DBConnectionSpec 对象的引用。

可以指定 connectionSpec 或 connectionSpecRef,但不能同时指定两者。

maxFieldSize
指定结果集中的任何列的最大大小,以字节计。0 值表示没有最大值。缺省值为 0。
maxRows
指定可以访存到高速缓存中的最大行数。0 值表示没有最大值。缺省值为 0。
distinctTypesEnabled
是否对包含用户定义的(相异)类型的结果集启用插入、更新和删除。缺省值为 False。
timeOut
允许语句执行的最大秒数。缺省值为 0,表示没有最大值。
readOnly
指定是否允许更新数据。true 值表示不允许更新,即使数据库管理器允许进行更新。false 值表示允许更新,倘若数据库管理器允许进行更新。缺省值为 false。
nullToken
指定将用来表示数据库空值的区分大小写字符串值。此属性是可选的。它作为任何对此 Select 获取或设置列或参数值的操作上的同一属性的缺省值。如果在两个位置中都省略此属性,则缺省值为 &empty。&empty 是一个特殊值,类似于 HTML 字符实体,在此属性中,将其识别为代表空字符串。有关空值表示法的更多信息,请参阅空值
trace
是否启用对数据库操作的跟踪。缺省值为 false。

x:select 操作的主体可以带有下列标记:

<x:sql>
此属性指定要执行的 SQL 语句。
<x:parameter>
此属性为 SQL 语句中的参数指定值和元数据。在 x:parameter 标记与 SQL 语句中的参数之间必须存在一一对应关系。

示例

以下操作创建一个 DBSelect Bean,其名称为 select1,其作用域为会话。它使用 conn1 中的信息连接至数据库, 并执行 Select 语句,该语句的结果集包含 EMPLOYEE 表中的职员编号和姓名。Select 不包含任何参数(对数据库而言),但带有来自进行替代的请求对象的用户输入。

<x:select id="select2" scope="session" connectionSpec="conn1">
	<x:sql>
		SELECT EMPNO, EMPNAME FROM EMPLOYEE 
		WHERE WORKDEPT = ?
	</x:sql>
	<x:parameter position="1" type="VARCHAR"
		   value='<%= request.getParameter("department") %>' />
</x:select>
	

以下操作创建一个 DBSelect Bean,其名称为 select3。此示例与前一个示例类似,但参数由名称而不是位置标识。

<x:select id="select3" scope="session" connectionSpec="conn1">
	<x:sql>
		SELECT EMPNO, EMPNAME FROM EMPLOYEE 
		WHERE WORKDEPT = :dept
	</x:sql>
	<x:parameter parmName="dept" type="VARCHAR"
		   value='<%= request.getParameter("department") %>' />
</x:select>

下列操作对上述示例生成的结果集中的行进行迭代,并使用 x:getColumn 操作将列值写入请求输出。有关 x:repeat 操作的详细信息,请参阅 <x:repeat> ,而有关 x:getColumn 操作的详细信息,请参阅 <x:getColumn>

<table border="1" width="300" height="100"><tbody>
	<tr> <td>Employee number:</td> <td>Name:</td> </tr>
	<x:repeat name="select1" over="rows">
		<tr>
			<x:repeat over="columns">
				<td><x:getColumn /></td>
			</x:repeat>
		</tr>
	</x:repeat>

下列操作对结果集中的行进行迭代,并使用 x:getColumn 操作将列值写入请求输出。有关 x:repeat 操作的详细信息,请参阅 <x:repeat> ,而有关 x:getColumn 操作的详细信息,请参阅 <x:getColumn>

<table border="1" width="300" height="100"><tbody>
	<tr> <td>Employee number:</td> <td>Name:</td> </tr>
	<x:repeat name="select1" over="rows">
		<tr>
			<td><x:getColumn colName="EMPNO"/></td>
			<td><x:getColumn colName="EMPNAME"/></td>
		</tr>
	</x:repeat></tbody></table>

反馈