0x01 SQL标签

  1. JSTL SQL标签库提供了与关系型数据库(OracleMySQLSQL Server等等)进行交互的标签
  2. 引用SQL标签库语法:
  3. <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
标签 描述
指定数据源
运行SQL查询语句
运行SQL更新语句
将SQL语句中的参数设为指定值
将SQL语句中的日期参数设为指定的java.util.Date 对象值
在共享数据库连接中提供嵌套的数据库行为元素
将所有语句以一个事务的形式来运行

0x02 小例子

  1. // 目录结构
  2. ├── src
  3. └── main
  4. └── webapp
  5. └── com
  6. └── ...
  7. └── WEB-INF
  8. └── web.xml
  9. ├── ...
  10. └── JSTL库测试
  11. ├── ...

0x02.1 前置操作

  1. 需要自己准备几个小东西
  2. 1. 引入JDBC MySQL驱动
  3. 2. 使用Navicat Premium创建个名字叫jsp_mysql的数据库
  4. 3. 创建数据表
  5. 4. 添加测试数据
  6. 不知道如何引入JDBC MySQL驱动的,可以查看下面这个文章:
  7. (使用JDBC驱动数据库)https://www.yuque.com/pmiaowu/gpy1q8/rz3351
  8. // 创建数据表
  9. CREATE TABLE employee (
  10. id INT NOT NULL,
  11. name VARCHAR (255),
  12. date date
  13. );
  14. // 创建测试数据
  15. INSERT INTO employee
  16. VALUES
  17. (
  18. 100,
  19. 'Zara',
  20. '2002/05/16'
  21. ),
  22. (
  23. 101,
  24. 'Mahnaz',
  25. '1978/11/28'
  26. ),
  27. (
  28. 102,
  29. 'Zaid',
  30. '1980/10/10'
  31. ),
  32. (
  33. 103,
  34. 'Sumit',
  35. '1971/05/08'
  36. )

0x02.2

0x02.2.1 语法

  1. <sql:setDataSource>标签用来配置数据源或者将数据源信息存储在某作用域的变量中
  2. 用来作为其它JSTL数据库操作的数据源
  1. <sql:setDataSource>标签语法格式如下:
  2. <sql:setDataSource
  3. var="<string>"
  4. scope="<string>"
  5. dataSource="<string>"
  6. driver="<string>"
  7. url="<string>"
  8. user="<string>"
  9. password="<string>"/>
标签有如下属性
属性 描述 必选 默认值
driver 要注册的JDBC驱动
url 数据库连接的JDBC URL
user 数据库用户名
password 数据库密码
dataSource 事先准备好的数据库
var 代表数据库的变量 默认设置
scope var属性的作用域 Page

0x02.2.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_sql_setdatasource.jsp
  3. // 注意: 接下来的范例我们会经常使用到<sql:setDataSource>标签
  4. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  6. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  7. <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
  8. url="jdbc:mysql://192.168.24.137/jsp_mysql"
  9. user="root"
  10. password="Zaq123456789!!!a"/>
  11. <sql:query dataSource="${snapshot}" sql="select (1+1);" var="result" />
  12. <c:forEach var="row" items="${result.rowsByIndex}">
  13. <c:forEach var="column" items="${row}">
  14. <div><c:out value="${column}"/></div>
  15. </c:forEach>
  16. </c:forEach>
  17. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_setdatasource.jsp
  18. // 返回结果: 2

0x02.3

0x02.3.1 语法

  1. <sql:query>标签用来运行SQL SELECT语句,然后将运行结果存储在作用域变量中
  1. <sql:query>标签语法格式如下:
  2. <sql:query
  3. var="<string>"
  4. scope="<string>"
  5. sql="<string>"
  6. dataSource="<string>"
  7. startRow="<string>"
  8. maxRows="<string>"/>
标签有如下属性
属性 描述 必选 默认值
sql 需要执行的SQL命令 Body
dataSource 所使用的数据库连接(覆盖默认值) 默认数据库
maxRows 存储在变量中的最大结果数 无穷大
startRow 开始记录的结果的行数 0
var 代表数据库的变量 默认设置
scope var属性的作用域 Page

0x02.3.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_sql_query.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  6. <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
  7. url="jdbc:mysql://192.168.24.137/jsp_mysql"
  8. user="root"
  9. password="Zaq123456789!!!a"/>
  10. <sql:query dataSource="${snapshot}" var="result">
  11. SELECT * from employee;
  12. </sql:query>
  13. <html>
  14. <head>
  15. <title>jstl_sql_query</title>
  16. </head>
  17. <body>
  18. <table border="1">
  19. <tr>
  20. <th>id</th>
  21. <th>name</th>
  22. <th>date</th>
  23. </tr>
  24. <c:forEach var="row" items="${result.rows}">
  25. <tr>
  26. <td><c:out value="${row.id}"/></td>
  27. <td><c:out value="${row.name}"/></td>
  28. <td><c:out value="${row.date}"/></td>
  29. </tr>
  30. </c:forEach>
  31. </table>
  32. </body>
  33. </html>
  34. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_query.jsp

image.png

0x02.4

0x02.4.1 语法

  1. <sql:update>标签用来执行一个没有返回值的SQL语句
  2. 比如SQL INSERT, UPDATE, DELETE语句
  1. <sql:update> 语法格式如下:
  2. <sql:update
  3. var="<string>"
  4. scope="<string>"
  5. sql="<string>"
  6. dataSource="<string>"/>
标签有如下属性
属性 描述 必选 默认值
sql 需要执行的SQL命令 Body
dataSource 所使用的数据库连接 默认数据库
var 用来存储所影响行数的变量
scope var属性的作用域 Page

0x02.4.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_sql_update.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  6. <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
  7. url="jdbc:mysql://192.168.24.137/jsp_mysql"
  8. user="root"
  9. password="Zaq123456789!!!a"/>
  10. <sql:update dataSource="${snapshot}" var="count">
  11. INSERT INTO employee VALUES (104, 'Nuha', '2010/05/26');
  12. </sql:update>
  13. <sql:query dataSource="${snapshot}" var="result">
  14. SELECT * from employee;
  15. </sql:query>
  16. <html>
  17. <head>
  18. <title>jstl_sql_update</title>
  19. </head>
  20. <body>
  21. <table border="1">
  22. <tr>
  23. <th>id</th>
  24. <th>name</th>
  25. <th>date</th>
  26. </tr>
  27. <c:forEach var="row" items="${result.rows}">
  28. <tr>
  29. <td><c:out value="${row.id}"/></td>
  30. <td><c:out value="${row.name}"/></td>
  31. <td><c:out value="${row.date}"/></td>
  32. </tr>
  33. </c:forEach>
  34. </table>
  35. </body>
  36. </html>
  37. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_update.jsp

image.png

0x02.5

0x02.5.1 语法

  1. <sql:param>标签与<sql:query>标签和<sql:update>标签嵌套使用, 用来提供一个值占位符
  2. 如果是一个null值, 则将占位符设为NULL
  1. <sql:param>标签语法格式如下:
  2. <sql:param value="<string>"/>
标签有如下属性
属性 描述 必填 默认值
value 需要设置的参数值 Body

0x02.5.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: xxxxx
  3. // 使用<sql:update>标签来执行 SQL DELETE 语句来删除 id=104 的记录
  4. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  6. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  7. <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
  8. url="jdbc:mysql://192.168.24.137/jsp_mysql"
  9. user="root"
  10. password="Zaq123456789!!!a"/>
  11. <c:set var="id" value="104"/>
  12. <sql:update dataSource="${snapshot}" var="count">
  13. DELETE FROM employee WHERE id = ?
  14. <sql:param value="${id}"/>
  15. </sql:update>
  16. <sql:query dataSource="${snapshot}" var="result">
  17. SELECT * from employee;
  18. </sql:query>
  19. <html>
  20. <head>
  21. <title>jstl_sql_param.jsp</title>
  22. </head>
  23. <body>
  24. <table border="1">
  25. <tr>
  26. <th>id</th>
  27. <th>name</th>
  28. <th>date</th>
  29. </tr>
  30. <c:forEach var="row" items="${result.rows}">
  31. <tr>
  32. <td><c:out value="${row.id}"/></td>
  33. <td><c:out value="${row.name}"/></td>
  34. <td><c:out value="${row.date}"/></td>
  35. </tr>
  36. </c:forEach>
  37. </table>
  38. </body>
  39. </html>
  40. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_param.jsp

image.png

0x02.6

0x02.6.1 语法

  1. <sql:dateParam>标签与<sql:query>标签和<sql:update>标签嵌套使用,用来提供日期和时间的占位符
  2. 如果是一个null值,则将占位符设为NULL
  1. <sql:dateParam>标签语法格式如下:
  2. <sql:dateParam value="<string>" type="<string>"/>
标签有如下属性
属性 描述 必选 默认值
value 需要设置的日期参数(java.util.Date) Body
type DATE(只有日期), TIME(只有时间), TIMESTAMP(日期和时间) TIMESTAMP

0x02.6.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_sql_dateparam.jsp
  3. // 使用<sql:update>标签, <sql:param>标签与<sql:dateParam>标签来执行SQL UPDATE语句
  4. // 更新id=102的date数据为2001/12/16
  5. <%@ page import="java.util.Date" %>
  6. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  7. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  8. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  9. <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
  10. url="jdbc:mysql://192.168.24.137/jsp_mysql"
  11. user="root"
  12. password="Zaq123456789!!!a"/>
  13. <%
  14. Date date = new Date("2001/12/16");
  15. int id = 102;
  16. %>
  17. <sql:update dataSource="${snapshot}" var="count">
  18. UPDATE employee SET date = ? WHERE id = ?
  19. <sql:dateParam value="<%=date%>" type="DATE"/>
  20. <sql:param value="<%=id%>"/>
  21. </sql:update>
  22. <sql:query dataSource="${snapshot}" var="result">
  23. SELECT * from employee;
  24. </sql:query>
  25. <html>
  26. <head>
  27. <title>jstl_sql_dateparam</title>
  28. </head>
  29. <body>
  30. <table border="1">
  31. <tr>
  32. <th>id</th>
  33. <th>name</th>
  34. <th>date</th>
  35. </tr>
  36. <c:forEach var="row" items="${result.rows}">
  37. <tr>
  38. <td><c:out value="${row.id}"/></td>
  39. <td><c:out value="${row.name}"/></td>
  40. <td><c:out value="${row.date}"/></td>
  41. </tr>
  42. </c:forEach>
  43. </table>
  44. </body>
  45. </html>
  46. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_dateparam.jsp

image.png

0x02.7

0x02.7.1 语法

  1. <sql:transaction>标签用来将<sql:query>标签和<sql:update>标签封装至事务中
  2. 可以将大量的<sql:query><sql:update>操作装入<sql:transaction>中,使它们成为单一的事务
  3. 它确保对数据库的修改不是被提交就是被回滚
  1. <sql:transaction>语法格式如下:
  2. <sql:transaction dataSource="<string>" isolation="<string>"/>
标签有如下属性
属性 描述 必选 默认值
dataSource 所使用的数据库(覆盖默认值) 默认数据库
isolation 事务隔离等级:
READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
SERIALIZABLE
数据库默认

0x02.7.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_sql_transaction.jsp
  3. // 使用<sql:update>和<sql:transaction>来执行SQL UPDATE语句
  4. // <sql:transaction>中的SQL语句要么都执行成功,要么都执行失败,没有其它结果
  5. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  6. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  7. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
  8. <sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
  9. url="jdbc:mysql://192.168.24.137/jsp_mysql"
  10. user="root"
  11. password="Zaq123456789!!!a"/>
  12. <sql:transaction dataSource="${snapshot}">
  13. <sql:update var="count">
  14. UPDATE employee SET name = 'Ali' WHERE id = 101
  15. </sql:update>
  16. <sql:update var="count">
  17. UPDATE employee SET name = 'Shah' WHERE id = 102
  18. </sql:update>
  19. <sql:update var="count">
  20. INSERT INTO employee VALUES (105, 'Nuha', '2010/05/26');
  21. </sql:update>
  22. </sql:transaction>
  23. <sql:query dataSource="${snapshot}" var="result">
  24. SELECT * from employee;
  25. </sql:query>
  26. <html>
  27. <head>
  28. <title>jstl_sql_transaction</title>
  29. </head>
  30. <body>
  31. <table border="1">
  32. <tr>
  33. <th>id</th>
  34. <th>name</th>
  35. <th>date</th>
  36. </tr>
  37. <c:forEach var="row" items="${result.rows}">
  38. <tr>
  39. <td><c:out value="${row.id}"/></td>
  40. <td><c:out value="${row.name}"/></td>
  41. <td><c:out value="${row.date}"/></td>
  42. </tr>
  43. </c:forEach>
  44. </table>
  45. </body>
  46. </html>
  47. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_sql_transaction.jsp

image.png