eclipse 下使用JSTL SQL标签库。
一.准备工作。
首先需要能够确保工程能够成功连接数据库和能够从数据库源中直接使用数据库。
然后导入JSTL所需要的两个jar包,并且使用taglib指令将其导入:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
二.JSTL SQL 标签库主要包括的标签。
1.<sql:setDataSource>:设置数据源。
该标签可以使用var属性来将数据库连接保存到该命名变量中,使用scope可以设置该变量的范围。
可以有两种方法来设置数据源。
(1).直接使用标签自身创建数据源。
<sql:setDataSource
url="jdbc:mysql://localhost:3306/bookdb"
driver="com.mysql.jdbc.Driver"
user="root"
password="hello1"/>
此时并没有使用var属性,所以该数据库连接会成为默认的数据库使用(下面如果使用数据库时没有指定数据库时,则默认使用这个),也没有使用scope属性,所以默认的范围为page。
(2).直接从数据库源中使用数据库链接。
之前已经配置成功一个名字为jdbc/bookdb的数据源,此时便可以直接调用。
<sql:setDataSource dataSource="jdbc/bookdb" var="myRes" />
并且使用var属性,将该数据库连接保存到myRes变量中,由于没有指明scope所以使用的是默认范围page。
2.<sql:query>:执行SQL的select语句。
该标签主要用于执行SQL的select查询语句,主要有以下属性:
sql:指定select查询语句。
dataSource:指定数据源。如果没有设定该属性,则使用<sql:setDataSource>标签设置的默认数据源。
maxRows:指定从原始查询结果中取出的最大记录数目。
startRow:指定从原始查询结果中第几条记录开始取出记录,第一个是0.
var:指定查询结果的命名变量名。
scope:指定查询结果的存放范围,默认为page。
使用该标签查询将会返回的结果是一个javax.servlet.jsp.jstl.sql.Result类型的,在这个接口中定义了5个方法:
String[] getColumnNames():返回查询结果中的所有字段的名字。
int getRowCount():返回查询结果中的所有记录的数目。
SortedMap[] getRows():返回查询结果中的所有记录。每个SortedMap对象表示一个记录,它以字段的名字作为Key,以相应的字段值作为Value。
Object[][] getRowsByIndex(): 以二维数组形式返回查询结果。第一维表示查询结果的记录(行),第二维表示查询结果的字段(列)。
boolean isLimitedByMaxRows(): 判断查询结果的记录数目是否受到<sql:query>的maxRows属性的限制。若原始查询结果的记录数目大于maxRows返回true,否则返回false。
eg:
在数据库中建立了一个表test。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="javax.servlet.jsp.jstl.sql.Result" %>
<!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>Insert title here</title>
</head>
<body>
<sql:setDataSource dataSource="jdbc/bookdb" />
<sql:query sql="select id,name from test" var="Test" />
getRowCount()方法:一共查询了${Test.rowCount }条记录。
<br>
getColumnNames()方法第一个字段名:${Test.columnNames[0] }
第二个字段名:${Test.columnNames[1] }
<br>
isLimitedByIndex()属性:是否受到了maxRows属性限制:
<%
Result rs =(Result) pageContext.findAttribute("Test");
out.println(rs.isLimitedByMaxRows());
%>
<br>
getRows()方法:
<c:forEach var="test" items="${Test.rows }">
${test.id }
${test.name }
</c:forEach>
<br>
getRowsByIndex()方法:
<c:forEach var="test" items="${Test.rowsByIndex }">
${test[0] }
${test[1] }
</c:forEach></body></html>
运行结果:
这里尽可能使使用了所有的方法进行测试,getColumnNames、getRowCount直接使用El表达式输出即可。isLimitedByMaxRows 采用java代码测试,先是得到该对象,然后在调用方法测试。getRows、getRowsByIndex 在这里使用了<c:forEach> 标签将其结果进行迭代输出,这个方法好处是省略了大量的转换代码,该标签将其自动转换为所需要的类型然后将其输出。
3.<sql:param>:为Sql语句中的“?”参数进行设置。
将上述的代码进行稍微的修改进行测试:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="javax.servlet.jsp.jstl.sql.Result" %>
<!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>Insert title here</title>
</head>
<body>
<sql:setDataSource dataSource="jdbc/bookdb" />
<sql:query sql="select ?,? from test" var="Test" >//这里的Sql语句没有进行具体的设置
<sql:param>id</sql:param>//在这里使用param标签设置参数值
<sql:param>name</sql:param>
</sql:query>
getRowCount()方法:一共查询了${Test.rowCount }条记录。
<br>
getColumnNames()方法第一个字段名:${Test.columnNames[0] }
第二个字段名:${Test.columnNames[1] }
<br>
isLimitedByIndex()属性:是否受到了maxRows属性限制:
<%
Result rs =(Result) pageContext.findAttribute("Test");
out.println(rs.isLimitedByMaxRows());
%>
<br>
getRows()方法:
<c:forEach var="test" items="${Test.rows }">
${test.id }
${test.name }
</c:forEach>
<br>
getRowsByIndex()方法:
<c:forEach var="test" items="${Test.rowsByIndex }">
${test[0] }
${test[1] }
</c:forEach>
这里的sql语句使用了?将id和name代替,然后在标签中嵌套使用<sql:param>标签进行设置参数值。
但是运行结果确实如此的:
所查询的内容全部都是id和name,此时是将查询结果所有设置为param中对象的内容。
正确的使用<sql:param>方法应该如下:
<sql:query sql="select id,name from test where id<?" var="Test" >//这里的Sql语句没有进行具体的设置
<sql:param>5</sql:param>//在这里使用param标签设置参数值
</sql:query>
将查询语句修改,查询id小于5的内容,此时输出的内容:
这样才是预期的结果。
4.<sql:update>:该标签用于执行SQL insert、update、delete语句,并且可以执行SQL DDL 语句(也就是说可以用来创建表、视图、索引等)。
<sql:update>标签具有以下属性。
sql:指定待执行的SQL语句。
dataSource:指定数据源。如果没有设置该属性,将使用由<sq;setDataSource>标签设置的默认数据源。
var:指定执行结果的命名变量名。执行结果表示数据库中受影响的记录数目(只能代表受影响的记录数目,不能像上述query那样输出内容)。
scope:指定执行结果存放的范围,默认为page。
eg:
还是上述中创建的test表。
首先测试DDL语句,用该标签创建一个数据库的表。
<sql:setDataSource dataSource="jdbc/bookdb" />
<sql:update sql="create table test2(test varchar(20))" var="Test"/>
${Test }
这里将执行的结果Test输出,显示为0,因为此时是创建了一个表,并没有影响到数据库中的记录,打开数据库可以发现已经成功创建一个表。
测试其他的insert、delete语句。
运行前的数据库表内容:
jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="javax.servlet.jsp.jstl.sql.Result" %>
<!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>Insert title here</title>
</head>
<body>
<sql:setDataSource dataSource="jdbc/bookdb" />
<sql:query sql="select id,name from test" var="Test" >
</sql:query>
添加前一共有${Test.rowCount }条记录。
<c:forEach var="test" items="${Test.rows }">
${test.id }
${test.name }
</c:forEach>
<br>
<sql:update sql="insert into test values(?,?)" var="Test1">
<sql:param>98</sql:param>
<sql:param>hello98</sql:param>
</sql:update>
添加了${Test1 }条记录。
<sql:query sql="select id,name from test" var="Test" >
</sql:query>
添加后一共有${Test.rowCount }条记录。
<c:forEach var="test" items="${Test.rows }">
${test.id }
${test.name }
</c:forEach>
<br>
<sql:update sql="delete from test where id<?" var="Test3">
<sql:param>98</sql:param>
</sql:update>
删除了${Test3 }条记录。
<sql:query sql="select id,name from test" var="Test" >
</sql:query>
删除后一共有${Test.rowCount }条记录。
<c:forEach var="test" items="${Test.rows }">
${test.id }
${test.name }
</c:forEach>
<br> </body>
</html>
运行结果:
运行后数据库表中的数据:
5.<sql:dataParam>和<sql:transaction>
<sql:dataParam>:这个标签和<sql:param>标签类型,唯一的区别这个是为SQL语句中的时间或者日期类型的参数赋值。
<sql:transaction>:这个标签用于为嵌套在其中的<sql:query>和<sql:update>标签声明数据库事务,位于同一个transaction标签下的所有query和update标签所执行的SQL操作作为一个数据库事务,(因本人对此不够了解且暂时使用不到,在此不做讨论)。