JSTL SQL标签库

SQL标签库,顾名思义,提供对数据库的操作,包括连接数据库,查询,修改,事务等。只需提供相应属性值,即可完成对数据库的相关操作,比JSP中使用一大堆Scriptlet操作数据库简单。
SQL标签库的taglib:<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

<sql:setDataSource />

JSTL的SQL标签所有的操作都是通过data source,也就是基于javax.sql.DataSource接口获取数据库连接。
通过<sql:setDataSource />标签我们可以获取javax.sql.DataSource对象。
语法结构:
XML/HTML代码
<sql:setDataSource
{
dataSource="dataSource" | url="jdbcUrl"
[driver="driverClassName"]
[user="userName"]
[password="password"]
}
[var="varName"]
[scope=”{page|request|session|application}”]
/>

dataSource属性:定义数据源。可以为String字符串,或者javax.sql.DataSource。如果为字符串类型,可以是JDNI资源的相对路径。
使用dtaSource属性后将忽略driver,url,user,password四个属性,以dataSource属性指定的资源(比如JNDI配置的内容)为主。
比如,现在使用JNDI资源,Tomcat的conf目录下,打开context.xml,没有可以新建一个,输入下面内容:

XML/HTML代码
<xml version='1.0' encoding='utf-8'>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/mysql"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
maxIdle="5"
maxWait="5000"
username="root"
password="198910"
url="jdbc:mysql://localhost:3306/product"
maxActive="10"
/>
</Context>
其中的Resource节点,定义DataSource的相关属性,在服务器启动的时候,这些信息将被自动加载。

Resource节点的常见属性作用:

driverClassName – 加载的数据库驱动类名。这里我用的是mysql数据库,如果是SqlServer数据库,则为"com.microsoft.sqlserver.jdbc.SQLServerDriver"
username – 用户名
password – 密码
url – url,么啥好说的,不同数据库不同写法。这里使用mysql数据库,product是需要连接的数据库名称。
initialSize – 线程池初始化时被创建的connection个数,默认为0。
maxActive – 线程池中同一时间最多允许的connection个数,默认为8。
minIdle – 线程池中同一时间最少允许的闲置connection个数,默认为0。
maxIdle -线程池中同一时间最多允许的闲置connection个数,默认为8。
maxWait – 在没有可用的connection时,线程池抛出异常前等待可用connection的最长的毫秒数,默认为-1(无限大)。
关于Resource节点的更多属性信息,以及JNDI资源配置,请参考Tomcat文档中的【JNDI Resourse HOW-TO】。

配置好后,JSP页面代码为:

XML/HTML代码
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource dataSource="jdbc/mysql" var="datasource"/>
${datasource }
dataSource属性值对应context.xml中<Resource>节点中的name属性,var属性保存获得的DataSource对象。使用EL表达式显示这个对象,输出内容为:

org.apache.tomcat.dbcp.dbcp.BasicDataSource@94e858

Tomcat中的DataSource默认是基于Apache DBCP项目的。

driver属性,url属性,user属性,passowrd属性:这四个就么啥好说的,建立一个新的DataSource对象。

var属性:保存生成的DataSource对象。在其他sql标签中引用此对象获得相应的DataSource,相应的Connection。

scope属性:也么啥说的,var的作用域。

下面是使用4个JDBC 参数配置的例子:

XML/HTML代码
<sql:setDataSource var="datasource"
driver="com.mysql.jdbc.Driver"
user="root"
password="10000"
url="jdbc:mysql://localhost:3306/product"
/>
${datasource }
输出的对象为:

org.apache.taglibs.standard.tag.common.sql.DataSourceWrapper@f8a000

<sql:query />

XML/HTML代码
Syntax 1: 不带标签体

<sql:query sql="sqlQuery"

var="varName"

[scope="{page|request|session|application}"]

[dataSource="dataSource"]

[maxRows="maxRows"]

[startRow="startRow"]

/>

Syntax 2: 带标签体,param子标签

<sql:query sql="sqlQuery"

var="varName"

[scope="{page|request|session|application}"]

[dataSource="dataSource"]

[maxRows="maxRows"]

[startRow="startRow"]>

<sql:param> actions

</sql:query>

Syntax 3: 标签体内定义查询语句,可选的param标签

<sql:query var="varName"

[scope="{page|request|session|application}"]

[dataSource="dataSource"]

[maxRows="maxRows"]

[startRow="startRow"]>

query

optional <sql:param> actions

</sql:query>

 

 

sql属性:针对syntax1,2,需要执行的SQL语句。syntax3中,可以写在标签体内。

返回结果保持在var属性,var属性是必须的,其类型为javax.servlet.jsp.jstl.sql.Result接口实例。Result接口对象中可用的对象有:

 

属性 说明
rows 一排SortedMap对象,每个对象对应列名和结构集中的当单行
rowsByIndex 一排数组,每个对应于结果集中的单行
columnNames 一排对结果集中的列名的字符串,采用与rowsByIndex属性相同的顺序。
rowCount 查询结果集种行数
limitedByMaxRows 如果查询受限于maxRows属性为true

 

XML/HTML代码
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<sql:setDataSource var="datasource"
driver="com.mysql.jdbc.Driver"
user="root"
password="10000"
url="jdbc:mysql://localhost:3306/product"
/>
<sql:query var="rs" dataSource="${datasource}">
select * from usertable
</sql:query>
<table>
<tr class="title">
<td>ID</td>
<td>Name</td>
<td>password</td>
</tr>
<c:forEach var="row" items="${ rs.rows }">
<tr>
<td>${ row.id }</td>
<td>${ row.uname }</td>
<td>${ row.upassword }</td>
</tr>
</c:forEach>
</table>
使用<sql:setDataSource />获取DataSource对象,保存在datasource对象中,然后执行<sql:query />将结果保存在re对象中,然后循环每行内容,输出用户的id,姓名和密码信息。

这只是简单的不带参数的查询操作,如果select语句后还有where条件,则可以在适当位置使用占位符:问号(?),在标签体内声明<sql:param />子标签,对应着每个占位符的值。

上面的例子中的<sql:query />标签那段改为:

 

XML/HTML代码
<sql:query var="rs" dataSource="${datasource}">
select * from usertable where id=?
<sql:param value="1" />
</sql:query>
如果有多个占位符,则param子标签的值以其在标签体内出现的顺序,依次赋值给每一个占位符。

注意,有n个占位符,就有n个param子标签,如果不匹配个数会抛出异常。

如果查询结果为空,则返回一个empty的Result接口对象。

dataSource属性:查询操作所需的DataSource,可以是DataSource对象,即<sql:setDataSource />中声明的var对象,也可以是某个JDNI资源的相对路径字符串。

如果dataSource属性值为null,将抛出JspException异常。

使用<sql:SetDataSource />产生的DataSource对象,可以参考上面一个例子。

使用JDNI资源的相对路径作为dataSource属性值,首先配置JNDI资源,然后dataSource属性值为JNDI资源的路径,比如"jdbc/mysql",具体信息可以查看上文内容。

maxRows属性:查询结果中包含的最多行数。如果未定义或者设置为-1,则不限制行数,查出多少条,结果集中就有多少条。

相当于MSSQLServer中的Top(n)函数,Mysql中的LIMIT子句,作用均是限制返回的行数。

maxRows必须>=-1.

startRows属性:返回的Result对象中包含的数据从第几行开始。第一行的索引号为0,如果startRows属性值为1,则结果集中从第二行开始。如果未定义此属性,则默认从索引0开始,即从结果集的第一行开始。

var属性:保持查询结果,为javax.servlet.jsp.jstl.sql.Result接口实例,具体查看sql属性。

scope属性:var的作用域。

<sql:update />

 

执行insert,update,delete操作。

语法结构:

XML/HTML代码
Syntax 1: 不带标签体

<sql:update sql="sqlUpdate"

[dataSource="dataSource"]

[var="varName"]

[scope="{page|request|session|application}"]

/>

Syntax 2: 在标签体内带有<sql:param>子标签

<sql:update sql="sqlUpdate"

[dataSource="dataSource"]

[var="varName"]

[scope="{page|request|session|application}"]>

<sql:param>子标签

</sql:update>

Syntax 3: 在标签体内带有执行语句和<sql:param>子标签

<sql:update [dataSource="dataSource"]

[var="varName"]

[scope="{page|request|session|application}"]>

需要执行的SQL语句update statement

可选的 <sql:param>子标签

</sql:update>


sql属性:需要执行的SQL语句。在syntax3中,可以直接写在标签体内,无需再声明此属性。如果执行语句需要参数,则在标签体内使用<sql:param />子标签声明执行语句中占位符的值。用法和<sql:query />类似,这里不多讲了。

dataSource属性:执行SQL语句所需的DataSource,可以使用<sql:setDataSource />标签返回的DataSource对象,也可以直接使用JNDI数据源的相对路径。如果属性值为null,将抛出异常。具体请参考上文。

var属性:保存执行SQL语句后受影响的行数。类型为java.lang.Integer。

scope属性:var的作用域。定了scope属性,则var属性也必须声明。

<sql:transaction />

针对<sql:query />,<sql:update />标签实现事务管理。

语法结构:

XML/HTML代码
<sql:transaction [dataSource="dataSource"]

[isolation=isolationLevel]>

<sql:query> and <sql:update> statements

</sql:transaction>

isolationLevel ::= "read_committed"

| "read_uncommitted"

| "repeatable_read"

| "serializable"

 

 

dataSource属性:JNDI数据源的相对路径或者<sql:setDataSource />标签中返回的DataSource对象。在标签体内的<sql:query />和<sql:update />就不能再使用dataSource属性,否则将抛出异常。如果dataSource属性为null,将抛出异常。

isolation属性:事务类型。可取的类型有(参考JAVA SE6 文档中的java.sql.Connection类):

XML/HTML代码
read_commited,禁止事务读取其中带有未提交更改的行。

read_uncommited,此级别允许被某一事务更改的行在已提交该行所有更改之前被另一个事务读取(“脏读”)。如果所有更改都被回滚,则第二个事务将获取无效的行。

repatable_read,此级别禁止事务读取带有未提交更改的行,它还禁止这种情况:一个事务读取某一行,而另一个事务更改该行,第一个事务重新读取该行,并在第二次读取时获得不同的值(“不可重复读”)。

serializable,此级别包括 TRANSACTION_REPEATABLE_READ 中禁止的事项,同时还禁止出现这种情况:某一事务读取所有满足 Where 条件的行,另一个事务插入一个满足 Where 条件的行,第一个事务重新读取满足相同条件的行,并在第二次读取时获得额外的“虚”行。

标签体内的<sql:query />和<sql:update />标签,如果有一步操作发生异常,则其他所有操作都不会生效。

与Connection.commit()方法,Connection.rollback()方法类似,所有操作均成功则commit,否则rollback。

<sql:param />

 

设置SQL语句中占位符部分(?)的值,常见的类型如String,int,用在<sql:query />或者<sql:update />的标签体内。

语法结构:

XML/HTML代码
Syntax 1: 使用value属性声明值

<sql:param value="value"/>

Syntax 2: 在标签体内声明值

<sql:param>

parameter value

</sql:param>

只有一个value属性,需要设置的值。如果value为null,则SQL语句的占位符值也为null。

<sql:dataParam />

 

<sql:param />可以设置String,int这些基本类型,<sq:dataParam/>可以设置Date类型数据。

语法结构:

<sql:dateParam value="value" [type="{timestamp|time|date}"]/>

 

value属性:为java.util.Date类型,可以使用useBean声明一个Date对象。

XML/HTML代码
<jsp:useBean id="date" class="java.util.Date" />
<sql:query var="rs">
select * from usertable where date=?
<sql:dataParam value="${date}" />
</sql:query>

posted @ 2012-12-07 10:23  七郎  Views(2786)  Comments(0Edit  收藏  举报