您的位置:首页 > 数据库

JSP基础(二十四)——JSTL数据库标签

2017-12-06 19:01 381 查看
    在Web应用中,常需要访问关系数据库来获取动态数据。尽管对于Web应用的设计要求数据库操作的处理应用在业务逻辑层内,但是在某些情况下,需要在JSP页面直接访问数据库。利用JSTL提供的数据库标签可以查询和更新数据库的数据。

JSTL中与SQL相关的标签
分类标签说明
联机:setDataSource设置数据源
SQL操作指令:query设置SQL查询
 param设置SQL参数
 update设置SQL更新
 dataParam日期参数解析
 transaction批量交易
使用前引入:<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

使用SQL标签访问数据库步骤:①指定数据源     ②进行查询或更新操作    ③对返回的结果进行处理

一、指定数据源

    在操作数据之前,需要先确定要操作的数据库。SQL标记使用数据源(类型为javax.sql.DataSource)来指定操作的数据库。数据源对象提供物理数据源的连接。

<sql:setDataSource>指定数据源语法:

①使用dataSource属性:

<sql:setDataSource dataSource="jdbc:mysql://localhost/DBName,com.mysql.jdbc.Driver" />
②使用dataSource属性:

<sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/DBName" />

(user属性和password属性则分别用于指定用户名、密码。如果使用var属性,则只是将该数据原保存到一个变量中。)

二、进行查询或更新操作

2.1、<sql:update>标签

    数据库更新操作如:创建表、插入、删除记录(create、drop、insert、update、delete)等。语法格式如下:

    ①将更新语句作为属性值:

<sql:update sql="更新语句" dataSource="dataSource" var="varName" scope="page/..." />
    ②将更新语句放在标记本体中:

<sql:update dataSource="dataSource" var="varName" scope="page/..." >
更新语句
</sql:update>

    var指定修改操作影响的数据记录行数(数据更新的条数),该变量可以指定的有效范围;如果没有在设置默认数据源,还需要使用属性dataSource来指定数据源。

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sql:update</title>
</head>
<body>
<sql:setDataSource url="jdbc:mysql://localhost/test"
driver="com.mysql.jdbc.Driver" user="root" password="123456" var="ds"/>

<%--有dataSource属性 --%>
<%-- 更新books表中书的数量bookCount<50,把价格price调为50.0 --%>
<sql:update dataSource="${ds }" sql="update books set price=50.0 where bookCount<50 " var="updateCount"/>
<c:out value="${'数据变动的数目:' }"/>
<c:out value="${updateCount }"/> <br>

<%--没有dataSource属性 --%>
<%--更新books表中书的数量bookCount>200,把价格price-10 --%>
<sql:update dataSource="${ds }" sql="update books set price=price-10? where bookCount>? " var="updateCounts">
<sql:param value="${10.0 }"/>
<sql:param value="${200 }"/>
</sql:update>
<c:out value="${'数据变动的数目:' }"/>
<c:out value="${updateCounts }"/>
</body>
</html>
结果:






2.2、<sql:query>标签

     执行一个数据库查询,结果存储在属性var指定的变量中。var为必有属性!

    ① 将查询语句作为属性值

<sql:query sql="查询语句" var="varName" dataSource="dataSource" scope="page/..." maxRows="rowMax" startRow="startRow" />
    ②将查询语句放在标记本体中

<sql:query var="varName" dataSource="dataSource" scope="page/..." maxRows="rowMax" startRow="startRow" >
查询语句
</sql:query>
    ③包含指定搜寻参数与选择性参数的本体内容:

<sql:query var="varName" dataSource="dataSource" scope="page/..." maxRows="rowMax" startRow="startRow" >
查询语句
<sql:param />
</sql:query>
     属性maxRows用于指定查询的最大行数(不指定或指定为-1表示 不限制行数);属性startRow值指定查询结果的一个开始行的索引(查询结果的第一行索引为0,startRow默认为0)。

示例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>sql:query</title>
</head>
<body>
<sql:setDataSource url="jdbc:mysql://localhost/test"
driver="com.mysql.jdbc.Driver" user="root" password="123456" var="ds"/>

<h3>找到价格为¥50.0的书的信息:</h3>
<sql:query dataSource="${ds }" sql="select * from books where price=50.0" var="selectResult"/>
<c:forEach var="row" items="${selectResult.rows }">
<c:out value="${'id:' }" />
<c:out value="${row.id }" /><br>
<c:out value="${'name:' }" />
<c:out value="${row.name }" /><br>
<c:out value="${'bookCount:' }" />
<c:out value="${row.bookCount }" />   
<c:out value="${'author:' }" />
<c:out value="${row.author }" />
<br> <br>

</c:forEach>

</body>
</html>
结果:



三、对返回的结果进行处理

在执行了查询操作之后,会将返回结果保存在Result类型的变量中(一般是一张二维表),该变量一般会有以下几个属性:

rows:以字段名称当作索引的查询结果。

<sql:query sql="select * from test" var="x"/>
<c:forEach items="${x.rows }" var="temp">
${temp.name },${temp.sex },${temp.age },${temp.score }<br>
</c:forEach>

rowsByIndex:以数字当作索引的查询结果。

<sql:query sql="select * from test" var="x"/>
<c:forEach items="${x.rowsByIndex }" var="temp">
${temp[0] },${temp[1] },${temp[2] },${temp[3] }<br>
</c:forEach>
columnNames:字段名称。

<sql:query sql="select * from test" var="x"/>
<c:forEach items="${x.columnNames }" var="temp">
${temp }<br>
</c:forEach>
rowCount:返回结果的行数。

<sql:query sql="select * from test" var="x"/>
${x.rowCount }
limitedByMaxRows:查询是否有最大行数限制,为Boolean类型。

四、其他SQL标签

4.1、动态地设定变量的标签

<sql:param>和<sql:dateParam>标记用来动态地设定变量。

假如SQL指令需要一些动态变量,可以写成:

<sql:query var="result">
select * from user where userid='${userid}'
</sql:query>

将上面的语句改成:
<sql:query var="result">
select * from user where userid=?
<sql:param value=${userid}>
</sql:query>

<sql:dateParam>只是用来设置日期相关的参数,如timeStamp、date、time:
<sql:dateParam value="value" type="type">

4.2、事务处理标签

单个事务需要多条SQL才能执行,这些SQL语句要么全部执行,要么都不执行,这时可以使用<sql:transaction>标记,其语法:

<sql:transaction dataSource="dataSource"
isolation="read_committed/read_uncommitted/repeatable/serializable">
多个<sql:query>、<sql:update/>标记
</sql:transaction>
dataSource属性为数据源(可选),isolation为事务的隔离级别(必有)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: