0x01 SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签
引用SQL标签库语法:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
标签 |
描述 |
|
指定数据源 |
|
运行SQL查询语句 |
|
运行SQL更新语句 |
|
将SQL语句中的参数设为指定值 |
|
将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
|
在共享数据库连接中提供嵌套的数据库行为元素 将所有语句以一个事务的形式来运行 |
0x02 小例子
// 目录结构
├── src
│ └── main
│ └── webapp
│ └── com
│ │ └── ...
│ └── WEB-INF
│ │ └── web.xml
│ ├── ...
│ └── JSTL库测试
│ │ ├── ...
0x02.1 前置操作
需要自己准备几个小东西
1. 引入JDBC MySQL驱动
2. 使用Navicat Premium创建个名字叫jsp_mysql的数据库
3. 创建数据表
4. 添加测试数据
不知道如何引入JDBC MySQL驱动的,可以查看下面这个文章:
(使用JDBC驱动数据库)https://www.yuque.com/pmiaowu/gpy1q8/rz3351
// 创建数据表
CREATE TABLE employee (
id INT NOT NULL,
name VARCHAR (255),
date date
);
// 创建测试数据
INSERT INTO employee
VALUES
(
100,
'Zara',
'2002/05/16'
),
(
101,
'Mahnaz',
'1978/11/28'
),
(
102,
'Zaid',
'1980/10/10'
),
(
103,
'Sumit',
'1971/05/08'
)
0x02.2
0x02.2.1 语法
<sql:setDataSource>标签用来配置数据源或者将数据源信息存储在某作用域的变量中
用来作为其它JSTL数据库操作的数据源
<sql:setDataSource>标签语法格式如下:
<sql:setDataSource
var="<string>"
scope="<string>"
dataSource="<string>"
driver="<string>"
url="<string>"
user="<string>"
password="<string>"/>
标签有如下属性 |
|
|
|
属性 |
描述 |
必选 |
默认值 |
driver |
要注册的JDBC驱动 |
否 |
无 |
url |
数据库连接的JDBC URL |
否 |
无 |
user |
数据库用户名 |
否 |
无 |
password |
数据库密码 |
否 |
无 |
dataSource |
事先准备好的数据库 |
否 |
无 |
var |
代表数据库的变量 |
否 |
默认设置 |
scope |
var属性的作用域 |
否 |
Page |
0x02.2.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/
// 文件名称: jstl_sql_setdatasource.jsp
// 注意: 接下来的范例我们会经常使用到<sql:setDataSource>标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.24.137/jsp_mysql"
user="root"
password="Zaq123456789!!!a"/>
<sql:query dataSource="${snapshot}" sql="select (1+1);" var="result" />
<c:forEach var="row" items="${result.rowsByIndex}">
<c:forEach var="column" items="${row}">
<div><c:out value="${column}"/></div>
</c:forEach>
</c:forEach>
// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_setdatasource.jsp
// 返回结果: 2
0x02.3
0x02.3.1 语法
<sql:query>标签用来运行SQL SELECT语句,然后将运行结果存储在作用域变量中
<sql:query>标签语法格式如下:
<sql:query
var="<string>"
scope="<string>"
sql="<string>"
dataSource="<string>"
startRow="<string>"
maxRows="<string>"/>
标签有如下属性 |
|
|
|
属性 |
描述 |
必选 |
默认值 |
sql |
需要执行的SQL命令 |
否 |
Body |
dataSource |
所使用的数据库连接(覆盖默认值) |
否 |
默认数据库 |
maxRows |
存储在变量中的最大结果数 |
否 |
无穷大 |
startRow |
开始记录的结果的行数 |
否 |
0 |
var |
代表数据库的变量 |
否 |
默认设置 |
scope |
var属性的作用域 |
否 |
Page |
0x02.3.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/
// 文件名称: jstl_sql_query.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.24.137/jsp_mysql"
user="root"
password="Zaq123456789!!!a"/>
<sql:query dataSource="${snapshot}" var="result">
SELECT * from employee;
</sql:query>
<html>
<head>
<title>jstl_sql_query</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>date</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.date}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_query.jsp
0x02.4
0x02.4.1 语法
<sql:update>标签用来执行一个没有返回值的SQL语句
比如SQL INSERT, UPDATE, DELETE语句
<sql:update> 语法格式如下:
<sql:update
var="<string>"
scope="<string>"
sql="<string>"
dataSource="<string>"/>
标签有如下属性 |
|
|
|
属性 |
描述 |
必选 |
默认值 |
sql |
需要执行的SQL命令 |
否 |
Body |
dataSource |
所使用的数据库连接 |
否 |
默认数据库 |
var |
用来存储所影响行数的变量 |
否 |
无 |
scope |
var属性的作用域 |
否 |
Page |
0x02.4.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/
// 文件名称: jstl_sql_update.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.24.137/jsp_mysql"
user="root"
password="Zaq123456789!!!a"/>
<sql:update dataSource="${snapshot}" var="count">
INSERT INTO employee VALUES (104, 'Nuha', '2010/05/26');
</sql:update>
<sql:query dataSource="${snapshot}" var="result">
SELECT * from employee;
</sql:query>
<html>
<head>
<title>jstl_sql_update</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>date</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.date}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_update.jsp
0x02.5
0x02.5.1 语法
<sql:param>标签与<sql:query>标签和<sql:update>标签嵌套使用, 用来提供一个值占位符
如果是一个null值, 则将占位符设为NULL
<sql:param>标签语法格式如下:
<sql:param value="<string>"/>
标签有如下属性 |
|
|
|
属性 |
描述 |
必填 |
默认值 |
value |
需要设置的参数值 |
否 |
Body |
0x02.5.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/
// 文件名称: xxxxx
// 使用<sql:update>标签来执行 SQL DELETE 语句来删除 id=104 的记录
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.24.137/jsp_mysql"
user="root"
password="Zaq123456789!!!a"/>
<c:set var="id" value="104"/>
<sql:update dataSource="${snapshot}" var="count">
DELETE FROM employee WHERE id = ?
<sql:param value="${id}"/>
</sql:update>
<sql:query dataSource="${snapshot}" var="result">
SELECT * from employee;
</sql:query>
<html>
<head>
<title>jstl_sql_param.jsp</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>date</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.date}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_param.jsp
0x02.6
0x02.6.1 语法
<sql:dateParam>标签与<sql:query>标签和<sql:update>标签嵌套使用,用来提供日期和时间的占位符
如果是一个null值,则将占位符设为NULL
<sql:dateParam>标签语法格式如下:
<sql:dateParam value="<string>" type="<string>"/>
标签有如下属性 |
|
|
|
属性 |
描述 |
必选 |
默认值 |
value |
需要设置的日期参数(java.util.Date) |
否 |
Body |
type |
DATE(只有日期), TIME(只有时间), TIMESTAMP(日期和时间) |
否 |
TIMESTAMP |
0x02.6.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/
// 文件名称: jstl_sql_dateparam.jsp
// 使用<sql:update>标签, <sql:param>标签与<sql:dateParam>标签来执行SQL UPDATE语句
// 更新id=102的date数据为2001/12/16
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.24.137/jsp_mysql"
user="root"
password="Zaq123456789!!!a"/>
<%
Date date = new Date("2001/12/16");
int id = 102;
%>
<sql:update dataSource="${snapshot}" var="count">
UPDATE employee SET date = ? WHERE id = ?
<sql:dateParam value="<%=date%>" type="DATE"/>
<sql:param value="<%=id%>"/>
</sql:update>
<sql:query dataSource="${snapshot}" var="result">
SELECT * from employee;
</sql:query>
<html>
<head>
<title>jstl_sql_dateparam</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>date</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.date}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_dateparam.jsp
0x02.7
0x02.7.1 语法
<sql:transaction>标签用来将<sql:query>标签和<sql:update>标签封装至事务中
可以将大量的<sql:query>和<sql:update>操作装入<sql:transaction>中,使它们成为单一的事务
它确保对数据库的修改不是被提交就是被回滚
<sql:transaction>语法格式如下:
<sql:transaction dataSource="<string>" isolation="<string>"/>
标签有如下属性 |
|
|
|
属性 |
描述 |
必选 |
默认值 |
dataSource |
所使用的数据库(覆盖默认值) |
否 |
默认数据库 |
isolation |
事务隔离等级: READ_COMMITTED READ_UNCOMMITTED REPEATABLE_READ SERIALIZABLE |
否 |
数据库默认 |
0x02.7.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/
// 文件名称: jstl_sql_transaction.jsp
// 使用<sql:update>和<sql:transaction>来执行SQL UPDATE语句
// <sql:transaction>中的SQL语句要么都执行成功,要么都执行失败,没有其它结果
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.24.137/jsp_mysql"
user="root"
password="Zaq123456789!!!a"/>
<sql:transaction dataSource="${snapshot}">
<sql:update var="count">
UPDATE employee SET name = 'Ali' WHERE id = 101
</sql:update>
<sql:update var="count">
UPDATE employee SET name = 'Shah' WHERE id = 102
</sql:update>
<sql:update var="count">
INSERT INTO employee VALUES (105, 'Nuha', '2010/05/26');
</sql:update>
</sql:transaction>
<sql:query dataSource="${snapshot}" var="result">
SELECT * from employee;
</sql:query>
<html>
<head>
<title>jstl_sql_transaction</title>
</head>
<body>
<table border="1">
<tr>
<th>id</th>
<th>name</th>
<th>date</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.date}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_transaction.jsp