设为首页 收藏本站
查看: 1390|回复: 0

[经验分享] JSTL SQL标签

[复制链接]

尚未签到

发表于 2016-11-8 10:12:09 | 显示全部楼层 |阅读模式
  推荐博客:http://blog.sina.com.cn/s/blog_4f925fc30101820u.html
  怕博主把原文删了,所以在这里先保存一下、
SQL标签库
  JSTL提供了与数据库相关操作的标签,可以直接从页面上实现数据库操作的功能,在开发小型网站是可以很方便的实现数据的读取和操作。本章将详细介绍这些标签的功能和使用方法。
  SQL标签库从功能上可以划分为两类:设置数据源标签、SQL指令标签。
  引入SQL标签库的指令代码为:
  <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
1 设置数据源
  使用<sql:setDataSource>标签可以实现对数据源的配置。
  【语法1】:直接使用已经存在的数据源。
  <sql:setDataSource dataSource=”dataSource”[var=”name”]
  [scope=”page|request|session|application”]/>
  【语法2】:使用JDBC方式建立数据库连接。
  <sql:setDataSource driver=”driverClass” url=”jdbcURL”
  user=”username”
                                              password=”pwd”                
  [var=”name”]
  [scope=”page|request|session|application”]/>
  【参数说明】:见表9-15
  表9-15 <sql:DataSource>标签属性说明
  
  参数名
  说明
  EL
  类型
  必须
  默认值
  dataSource
  数据源
  是
  String
  Javax.sql.DataSource
  否
  无
  driver
  使用的JDBC驱动
  是
  String
  否
  无
  url
  连接数据库的路径
  是
  String
  否
  无
  user
  连接数据库的用户名
  是
  String
  否
  无
  password
  连接数据库的密码
  是
  String
  否
  无
  var
  指定存储数据源的变量名
  否
  String
  否
  无
  scope
  指定数据源存储的JSP范围
  否
  String
  否
  page
  
  提示:是否必须是相对的,比如说如果使用数据源则,driver、url等就不再被使用。如果使用JDBC则要用到driver、url、user、password属性。
  例如连接SQL Server需要进行如下配置:
  Driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
  url=” jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=pubs"
  user=”sa”
  password=””
  使用<fmt:setDataSource>配置的代码如下:
  <fmt:setDataSource driver=”com.microsoft.jdbc.sqlserver.SQLServerDriver”
  url=”jdbc.microsoft:sqlserver://localhost:1433;DatabaseName=pubs”
  user=”sa”
  password=””>
  如果连接其他数据库,只须把相对应的项修改即可。
  提示:可以把数据连接的配置存入session中,如果再用到数据库连接只须配置使用DataSource属性。
2 SQL操作标签
  JSTL提供了<sql:query>、<sql:update>、<sql:param>、<sql:dateParam>和<sql:transaction>这5个标签,通过使用SQL语言操作数据库,实现增加、删除、修改等操作。下面将介绍这5个标签的功能和使用方式。
  1.<sql:query>标签
  <sql:query>标签用来查询数据。
  【语法1】:
  <sql:query sql=”sqlQuery” var=”name” [scope=”page|request|session|application”]
  [dataSource=”dateSource”]
  [maxRow=”maxRow”]
  [startRow=”starRow”]/>
【语法2】:
  <sql:query var=”name” [scope=”page|request|session|application”]
  [dataSource=”dateSource”]
  [maxRow=”maxRow”]
  [startRow=”starRow”]
  > 
  sqlQuery
  </sql:query>
  【属性说明】:见表9-16。
  表9-16 <sql:query>标签属性说明
  
  参数名
  说明
  EL
  类型
  必须
  默认值
  sql
  查询数据的SQL语句
  是
  String
  是
  无
  dataSource
  数据源对象
  是
  String
  Javax.sql.DataSoutce
  否
  无
  maxRow
  设定最多可以暂存数据的行数
  是
  String
  否
  无
  startRow
  设定从那一行数据开始
  是
  String
  否
  无
  var
  指定存储查询结果的变量名
  否
  String
  是
  无
  scope
  指定结果的作用域
  否
  String
  否
  page
  
使用<sql:query>必须指定数据源,dataSource是可选的,如果未给定该属性标签会在page范围内查找是否设置过数据源,如果没有找到将抛出异常。
一般情况下使用<sql:setDateSource>标签设置一个数据源存储在session范围中,当需要数据库连接时使用dataSource属性并实现数据库的操作。
<sql:query>的var属性是必须的用来存放结果集,如果没有指定scope范围则默认为page,即在当前页面我们可以随时输出查询结果。结果集有一系列的属性如表9-17所示。
maxRows和startRow属性用来操作结果集,使用SQL语句首先吧数据放入内存中,检查是否设置了startRow属性,如果设置了就从starRow指定的那一行开始取maxRows个值,如果没有设定则从第一行开始取。
  表9-17 结果集参数说明
  
  属性名
  类型
  说明
  rowCount
  int
  结果集中的记录总数
  Rows
  Java.util.Map
  以字段为索引查询的结果
  rowsByIndex
  Object[]
  以数字为作索引的查询结果
  columnNames
  String[]
  字段名称数组
  limitedByMaxRows
  boolean
  是否设置了maxRows属性来限制查询记录的数量
  
  提示:limitedByMaxRows用来判断程序是否收到maxRows属性的限制。并不是说设定了maxRows属性,得到结果集的limitedByMaxRows的属性都为true,当取出的结果集小于maxRows时,则maxRows没有对结果集起到作用此时也为false。例如可以使用startRow属性限制结果集的数据量。
结果集的作用就是定义了数据在页面中的显示方式。下面给出了结果集每个属性的作用。
  q        rowCount属性。该属性统计结果集中有效记录的量,可以使用于大批量数据分页显示。
  q        Rows属性。等到每个字段对应的值。返回的结果为:字段名={字段值···}
  q        rowsByIndex属性。常用得到数据库中数据的方式,从有效行的第一个元素开始遍历,到最后一个有效行的最后一个元素。
  q        columnNames属性。用于得到数据库中的字段名。
  q        limitedByMaxRows属性。用于判断是否受到了maxRows的限制。
【示例代码】:代码9.20给出了配置数据库连接,和使用<sql:query>查询数据以及结果集属性的使用。
代码9.20 数据库示查询示例:sqldemo01.jsp

  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
  <%@ page contentType="text/html;charset=GBK"%>
  <html>
  <head>
  <title>JSTL: SQL标签</title>
  </head>
  <body >
  <h3>SQL标签库</h3>
  <hr>
  <sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
  url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
  user="sa" password="" />
  <sql:query var="result" sql="select * from person" maxRows="2" startRow="1"/>
  结果集的实质是:${result}<br>
  得到的行数为:${result.rowCount}<br>
  是否收到了maxRows的限制:${result.limitedByMaxRows}
  <hr>
  <table border="1" align="center">
  <tr><c:forEach var="columnName" items="${result.columnNames}">
  <td>
  <c:out value="${columnName}"/>
  </td>
  </c:forEach> </tr>
  <c:forEach var="row" items="${result.rowsByIndex}">
  <tr>
  <c:forEach var="column" items="${row}">
  <td><c:out value="${column}"/></td>
  </c:forEach>
  </tr>
  </c:forEach>
  </table>
  </body>
  </html>
【代码解析】:
(1)配置数据源。使用<sql:dataSource>标签配置数据源,因为只共本页使用因此存储在默认的page范围中。
(2)使用<sql:query>标签进行数据库查询,并定义了maxRows和startRow属性。并把结果集存储于作用于page范围的result变量。使用${result}输出可以发现结果集就是一个ResultImpl类。
  提示:在进行数据源配置时程序不会检查数据库连接是否配置正确,直接根据设定的数据库及连接访问,如果没有找到则抛出操作的表异常,因此要放如<c:catch></c:catch>同时在编写程序时一定要注意数据源是否配置正确。
(3)使用结果集的rowCount属性得到记录的总量。代码为:
  ${result.rowCount}
(4)使用结果集的limitedMaxRows属性判断是否收到maxRows设定的影响。代码为:
  ${result.limitedMaxRows}
(5)从结果集中得到数据库中定义的所有的字段。${result.columnnames}得到的结果是一个字符串数组,因此需要使用<c:forEach>循环输出。代码如下:
  <c:forEach var="columnName" items="${result.columnNames}">
  <c:out value="${columnName}"/>
  </c:forEach>
(6)从结果集中得到所有的值。首先要遍历每一行,然后遍历每一行中的元素,因此需要循环嵌套。代码如下:
  <c:forEach var="columnName" items="${result.columnNames}">
  <c:out value="${columnName}"/>
  </c:forEach>
  <c:forEach var="row" items="${result.rowsByIndex}">
  <c:forEach var="column" items="${row}">
  <c:out value="${column}"/></td>
  </c:forEach>
  </c:forEach>
  提示:在代码解析中省略了html元素表格等标签的元素,本示例适用于任何数据库表,只要把数据库的URL、使用的JDBC进行相应的配置和操作的数据表名进行相应的修改即可看到结果。
  2.<sql:update>标签
  <sql:update>用来实现操作数据库如:使用create、update、delete和insert等SQL语句,并返回影响记录的条数。
  【语法1】:SQL语句放在标签属性中。
  <sql:update sql=”SQL语句” [var=”name”] [scope=”page|request|session|application”]
  [dateSource=”dateSource”]/>
  【语法2】:SQL语句放在标签体内。
  <sql:update [var=”name”] [scope=”page|request|session|application”]
  [dateSource=”dateSource”]
  > 
  SQL语句
  </sql:update>
  【参数说明】:见表9-18。
  表9-18 <sql:update>标签属性说明
  
  参数名
  说明
  EL
  类型
  必须
  默认值
  sql
  查询数据的SQL语句
  是
  String
  是
  无
  dataSource
  数据源对象
  是
  String
  Javax.sql.DataSoutce
  否
  无
  var
  指定存储查询结果的变量名
  否
  String
  是
  无
  scope
  指定结果的作用域
  否
  String
  否
  page
  
  提示:<sql:update>标签的属性同<sql:query>标签的属性相比只减少了maxRows和startRow2个属性。其他参数用法一样。
  使用<sql:update>可以实现数据表的创建、插入数据、更行数据、删除数据。使用时只须在标签中放入正确的SQL语句即可,同时要捕获可能产生的异常。本节只对一个简单的插入操作进行说明。
  【示例代码】:代码9.21实现了创建一个表、实现数据的插入。
代码9.21 数据库创建、数据插入示例:sqldemo02.jsp

  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
  <%@ page contentType="text/html;charset=GBK"%>
  <html>
  <head>
  <title>JSTL: SQL标签</title>
  </head>
  <body >
  <h3>SQL标签库</h3>
  <hr>
  <sql:setDataSource driver="com.microsoft.jdbc.sqlserver.SQLServerDriver"
  url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs"
  user="sa" password="" />
  实现数据库表的创建<br>
  <sql:update var="result1">
  create table c_user (
  id int primary key ,
  name varchar(80),
  sex varchar(80),
  )
  </sql:update>
  <c:catch var="error">
  <sql:update var="result2" >
  insert c_user values(05,'Linda','女')
  insert c_user values(01,'Rom','男' )
  </sql:update>
  影响的记录数为:<c:out value="${result2}"></c:out>
  </c:catch>
  <c:out value="${error}"></c:out><br>
  <hr>
  </body>
  </html>
  【代码解析】:
  (1)配置数据源。
  (2)使用<sql:update>标签创建一个新表。
  (3)向表中插入两行数据。
  提示:本示例也没有针对固定的表进行操作,在使用时直接运行即可,如果使用的是其他数据库,需要更改数据源配置和SQL语句部分修改。
  使用<sql:update>的var属性记录结果是不准确的,尤其是在一个标签中使用多条sql语句只能记录下第一条。
  3.<sql:param>标签
  <sql:param>标签用于动态的为SQL语句设定参数,同<sql:query>标签共同使用。可以防止SQL注入作用类似于java.sql.PreparedStatement。
  【语法1】:
  <sql:param value=”value”/>
  【语法2】:
  <sql:param>
  Value
  </sql:param>
  【参数说明】:
  value的作用为SQL中的参数赋值。
  【使用示例】:
  <sql:query var=”result”>
  select * from person where 序号=?
  <sql:query>
  4.<sql:dateParam>标签
  <sql:dataParam>标签主要用于为SQL标签填充日期类型的参数值。
  【语法】:
  <sql:dateParam value=”date”[type=”timestamp|time|date”]/>
  【参数说明】:
  q        value属性:java.util.Date类型的参数。
  q        type属性:指定填充日期的类型timestamp(全部日期和时间)、time(填充的参数为时间)、date(填充的参数为日期)。
  5.<sql:transaction>标签
  <sql:transaction>标签提供了数据操作的一种安全机制(即事务回滚),当操作数据库的某条SQL语句发生异常时,取消<sql:transaction>标签体中的所有操作,恢复原来的状态,重新对数据库进行操作。
  【语法】:
  <sql:transaction [dataSource=”dataSource”]
  [isolation=”read_committed|read_uncommitted|repeatable|serializable”]
  > 
  <sql:query>
  <sql:uptade>
  </sql:transation>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-297318-1-1.html 上篇帖子: Sql 连接串 下篇帖子: JDBC连接SQL Server2005
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表