JSTL-SQL标签库
主页:http://www.cnblogs.com/EasonJim/p/6958992.html的分支页。
本章的前提需要先新建数据表及添加默认数据,脚本如下:
-- -- 数据库: `test` -- -- -------------------------------------------------------- -- -- 表的结构 `student` -- CREATE TABLE IF NOT EXISTS `student` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `NAME` varchar(20) NOT NULL, `AGE` int(11) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ; -- -- 转存表中的数据 `student` -- INSERT INTO `student` (`ID`, `NAME`, `AGE`) VALUES (1, 'Zara', 11), (2, 'Nuha', 2), (3, 'Ayan', 15);
及MySQL的JAR包:
<!-- mysql-connector-java --> <!-- http://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency>
一、<sql:setDataSource>
<sql:setDataSource>
标签设置了数据源配置变量或将数据源信息保存到一个指定范围的变量中,该变量可用作为其他JSTL数据库操作的输入。
属性:
<sql:setDataSource>
标签具有如下所示属性:
属性 | 描述 | 是否必需 | 默认值 |
---|---|---|---|
driver | 要被注册的JDBC驱动程序类名 | 否 | 无 |
url | 数据库连接的JDBC URL | 否 | 无 |
user | 数据库用户名 | 否 | 无 |
password | 数据库密码 | 否 | 无 |
password | 数据库密码 | 否 | 无 |
dataSource | 预先准备的数据库 | 否 | 无 |
var | 展示数据库的变量名 | 否 | 设置默认 |
scope | 展示数据库的变量范围 | 否 | 页面 |
实例:
对MySQL数据库设置考虑下述信息:
-
使用的是JDBC MySQL驱动。
-
将要连接到本地计算机的TEST数据库中。
- 将使用user_id和password来访问TEST数据库。
所有上述参数会随着MySQL或任何其他数据库设置而变化。记住上述参数,下面是使用setDataSource标签的一个简单的例子:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html> <head> <title>JSTL sql:setDataSource Tag</title> </head> <body> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/TEST?serverTimezone=UTC" user="root" password="root"/> <sql:query dataSource="${snapshot}" sql="select * from student" var="result" /> <c:forEach var="row" items="${result.rows}"> <c:out value="${row.name}"/>:<c:out value="${row.age}"/><br/> </c:forEach> </body> </html>
这将产生如下所示结果:
二、<sql:query>
<sql:query>
标签执行SQL SELECT语句并将结果保存到给定范围的变量中。
属性:
<sql:query>
标签具有如下所示属性:
属性 | 描述 | 是否必需 | 默认值 |
---|---|---|---|
sql | 要执行的SQL命令(应返回ResultSet) | 否 | Body |
dataSource | 要用的数据库连接(覆盖默认值) | 否 | 默认数据库 |
maxRows | 存储在变量中的结果的最大值 | 否 | 不限 |
startRow | 结果中开始记录的行数 | 否 | 0 |
var | 显示数据库的变量名 | 否 | 设置默认 |
scope | 显示来自数据库的结果的变量范围 | 否 | 页面 |
实例:
现在编写一个JSP,使用<sql:query>
来执行SQL SELECT语句,如下所示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html> <head> <title>JSTL sql:setDataSource Tag</title> </head> <body> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/TEST?serverTimezone=UTC" user="root" password="root"/> <sql:query dataSource="${snapshot}" sql="select * from student" var="result" /> <c:forEach var="row" items="${result.rows}"> <c:out value="${row.name}"/>:<c:out value="${row.age}"/><br/> </c:forEach> </body> </html>
现在尝试访问上述JSP,会出现如下所示结果:
三、<sql:update>
<sql:update>
标签执行不返回数据的SQL语句,例如SQL INSERT,UPDATE,或DELETE语句。
属性:
<sql:update>
标签具有如下所示属性:
属性 | 描述 | 是否必需 | 默认值 |
---|---|---|---|
sql | 要执行的SQL语句(应不返回ResultSet) | 否 | Body |
dataSource | 要使用的数据库连接 (覆盖默认值) | 否 | 默认数据库 |
var | 存储受影响行数的变量名 | 否 | 无 |
scope | 存储受影响行数的变量范围 | 否 | 页面 |
实例:
现在编写JSP,使用<sql:update>
标签来执行SQL INSERT语句,从而在表中创建一条记录,如下所示:
<%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html> <head> <title>JSTL sql:update Tag</title> </head> <body> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/TEST?serverTimezone=UTC" user="root" password="root"/> <sql:update dataSource="${snapshot}" var="count"> INSERT INTO Student (name,age) VALUES ('Jim', '27'); </sql:update> <sql:query dataSource="${snapshot}" var="result"> SELECT * from Student; </sql:query> <table border="1" width="100%"> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.name}"/></td> <td><c:out value="${row.age}"/></td> </tr> </c:forEach> </table> </body> </html>
现在尝试访问上述JSP,将显示如下所示结果:
四、<sql:param>
<sql:param>
标签用于<sql:query>
和<sql:update>
标签的嵌套操作,来为一个值的占位符提供值。如果提供了一个空值,那么占位符就会被设置为SQL NULL。
属性:
<sql:param>
标签具有如下属性:
属性 | 描述 | 是否必需 | 默认值 |
---|---|---|---|
value | 要设置的参数值 | 否 | Body |
实例:
现在编写JSP,使用<sql:update>
标签来执行SQL DELETE语句来从表中删除一条id=3的记录,如下所示:
<%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html> <head> <title>JSTL sql:param Tag</title> </head> <body> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/TEST?serverTimezone=UTC" user="root" password="root"/> <c:set var="id" value="3"/> <sql:update dataSource="${snapshot}" var="count"> DELETE FROM Student WHERE Id = ? <sql:param value="${id}" /> </sql:update> <sql:query dataSource="${snapshot}" var="result"> SELECT * from Student; </sql:query> <table border="1" width="100%"> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.name}"/></td> <td><c:out value="${row.age}"/></td> </tr> </c:forEach> </table> </body> </html>
现在尝试访问上述JSP,会显示如下所示的结果:
五、<sql:dateParam>
<sql:dateParam>
标签用作<sql:query>
和<sql:update>
的嵌套操作,为值占位符提供日期和时间值。如果提供的是一个空值,那么该占位符的值就会被设置为SQL NULL。
属性:
<sql:dateParam>
标签具有如下所示属性:
属性 | 描述 | 是否必需 | 默认值 |
---|---|---|---|
value | 要设置的日期参数的值(java.util.Date) | 否 | Body |
type | 日期(只能是日期), 时间(只能是时间),或TIMESTAMP(日期和时间) | 否 | TIMESTAMP |
实例:
1、建表及添加模拟数据:
create table Students2 ( id int not null, first varchar (255), last varchar (255), dob date ); INSERT INTO Students2 VALUES (100, 'Zara', 'Ali', '2002/05/16'); INSERT INTO Students2 VALUES (101, 'Mahnaz', 'Fatma', '1978/11/28');
现在编写JSP,将<sql:update>
标签与<sql:param>
和<sql:dataParam>
标签一起使用来执行SQL UPDATE语句来更新:
<%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*" %> <%@ page import="java.util.Date,java.text.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html> <head> <title>JSTL sql:dataParam Tag</title> </head> <body> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/TEST?serverTimezone=UTC" user="root" password="root"/> <% Date DoB = new Date("2001/12/16"); int studentId = 100; %> <sql:update dataSource="${snapshot}" var="count"> UPDATE Students2 SET dob = ? WHERE Id = ? <sql:dateParam value="<%=DoB%>" type="DATE" /> <sql:param value="<%=studentId%>" /> </sql:update> <sql:query dataSource="${snapshot}" var="result"> SELECT * from Students2; </sql:query> <table border="1" width="100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>DoB</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.first}"/></td> <td><c:out value="${row.last}"/></td> <td><c:out value="${row.dob}"/></td> </tr> </c:forEach> </table> </body> </html>
现在尝试访问上述 JSP,会出现如下所示结果:
六、<sql:transaction>
注意:表类型应为InnoDB才支持事务。
<sql:transaction>
标签用于将<sql:query>
和<sql:update>
标签分组到事物中。可以在<sql:transaction>
标签中放入和语句一样多的<sql:query>
和<sql:update>
标签,使它们成为单独的事物。
如果任何嵌套操作抛出一个异常,它确保由嵌套操作执行的数据库修改要么提交要么回滚。
属性:
<sql:transaction>
标签具有如下所示属性:
属性 | 描述 | 是否必需 | 默认值 |
---|---|---|---|
dataSource | 要使用的数据库连接(覆盖默认值) | 否 | 默认数据库 |
isolation | 事务隔离(READ_COMMITTED,READ_UNCOMMITTED,EPEATABLE_READ,或SERIALIZABLE) | 否 | 数据库的默认值 |
实例:
现在编写JSP,使用<sql:update>
和<sql:transaction>
标签来执行SQL UPDATE语句。在这里<sql:transaction>
标签内的代码要么被完全执行,要么一点也不执行(但经过测试,会只执行不会报错的SQL,所以还必须增加isolation属性,不过会抛出异常,此时需要使用异常标签进行包装处理):
<%@ page import="java.io.*,java.util.*,java.sql.*"%> <%@ page import="javax.servlet.http.*,javax.servlet.*"%> <%@ page import="java.util.Date,java.text.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%> <html> <head> <title>JSTL sql:transaction Tag</title> </head> <body> <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/TEST?serverTimezone=UTC" user="root" password="root"/> <% Date DoB = new Date("2001/12/16"); int studentId = 100; %> <sql:transaction dataSource="${snapshot}"> <sql:update var="count"> UPDATE Students2 SET last = 'Ali' WHERE Id = 102 </sql:update> <sql:update var="count"> UPDATE Students2 SET last = 'Shah' WHERE Id = 103 </sql:update> <sql:update var="count"> INSERT INTO Students2 VALUES (104,'Nuha', 'Ali', '2010/05/26'); </sql:update> </sql:transaction> <sql:query dataSource="${snapshot}" var="result"> SELECT * from Students2; </sql:query> <table border="1" width="100%"> <tr> <th>Emp ID</th> <th>First Name</th> <th>Last Name</th> <th>DoB</th> </tr> <c:forEach var="row" items="${result.rows}"> <tr> <td><c:out value="${row.id}"/></td> <td><c:out value="${row.first}"/></td> <td><c:out value="${row.last}"/></td> <td><c:out value="${row.dob}"/></td> </tr> </c:forEach> </table> </body> </html>
现在尝试访问上述 JSP,会出现如下所示结果: