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,会出现如下所示结果:

 

转载于:https://www.cnblogs.com/EasonJim/p/6958986.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值