JDBC数据库访问——数据库操作-程序员宅基地

技术标签: javaweb  jsp  jdbc  数据库  

与指定的数据库建立连接后,就可以使用JDBC提供的API对数据库进行操作,包括查询、新增、更新、删除等。

1.查询操作

和数据库建立连接后,对数据库表进行查询操作的步骤如下:

①创建statement对象

由已创建的Connection对象con调用createStatement()方法创建Statement对象,代码如下:

Statement smt = con.createStatement();

②执行SQL语句

创建Statement对象后,可以使用Statement对象调用executeQuery(String sql)方法执行SQL查询语句。该方法返回ResultSet对象,代表查询结果。

③处理查询结果

ResultSet对象是executeQuery(String sql)方法的返回值,被称为结果集,它代表符合SQL查询语句的所有行。

ResultSet对象自动维护指向其当前数据行的游标。每调用一次next()方法,游标向下移动一行。最初它位于结果集的第一行之前,因此第一次调用next(),将把游标置于第一行上,使它成为当前行。随着每次调用next(),游标向下移动一行,按照从上至下的次序获取ResultSet行,实现顺序查询。

ResultSet对象包含SQL查询语句的执行结果。它通过一套get()方法对这些行中的数据进行访问,即使用getXxx()方法获得数据。getXxx()方法很多,究竟使用哪一个,由列的数据类型来决定。使用getXxx()方法时,需要注意以下两点:

  • 无论列是何种数据类型,总可以使用getString(int columnIndex)或getString(String columnName)方法获得列值的字符串表示。
  • 使用getString(int columnIndex)方法查看一行记录时,不允许颠倒顺序,例如,不允许:
    rs.getString(2);
    rs.getString(1);

2.新增、更新与删除操作

和数据库建立连接后,对数据库表进行新增、更新与删除操作的具体步骤如下:

①创建Statement对象

Statement对象的创建与查询操作一样,由已创建的Connection对象con调用createStatement()方法创建。

②执行SQL语句,完成新增、更新与删除操作

创建Statement对象后,可以使用Statement对象调用executeUpdate(String sql)方法执行SQL语句,完成新增、更新与删除操作。

executeUpdate(String sql)方法主要用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,例如CREATE TABLE和DROP TABLE。该方法返回一个整数(代表被更新的行数)对于CREATE TABLE和DROP  TABLE等不操作行的指令,返回零。

【例2-1】编写两个JSP页面:addGoods.jsp和showAllGoods.jsp。用户可以在addGoods.jsp页面中输入信息,单击“添加”将按钮信息添加到goods表中。在showAllGoods.jsp页面中显示所有商品信息。在该例中需要编写一个Servlet(GoodServlet.java)实现添加和查询记录,还需要实体类Goods封装查询的商品信息。

页面addGoods.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" %>
<! DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="goodServlet" method="post">
    <table border="1">
       <tr>
           <td>商品名称:</td>
           <td><input type="text" name="gname"></td>
       </tr>
       <tr>
           <td>商品价格:</td>
           <td><input type="text" name="gprice"></td>
       </tr>
       <tr>
           <td><input type="submit" value="添加"></td>
           <td><input type="reset" value="重置"></td>
       </tr>
    </table>
    </form>
</body>
</html>

实体类Goods.java

package entity;
public class Goods {
    private int id;
    private String gname;
    private Double gprice;
//此处省略了setter和getter方法
}

 GoodServlet.java

package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HTTPServlet;
import javax.servlet.http.HTTPServletRequest;
import javax.servlet.http.HTTPServletResponse;
import entity.Goods;
@WebServlet("/goodsServlet")
public class GoodsServlet extends HttpServlet {
private static fianl long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,HttpServlet response) throws ServletException,IOException {
      Connection con = null;
      Statement st = null;
      ResultSet rs = null;
      //将查询结果装到集合ArrayList<Goods>中,并返回页面显示
      ArrayList<Goods> allGoods = null;
      //加载驱动
      try{
          Class.forName("com.mysql.jdbc.Driver");
      } catch (ClassNotFoundException e){
         e.printStackTrace();
      }
      //建立连接
      try{
          con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8","root","root");
           st = con.creatStatement();
      //发送添加SQL语句,实现添加的功能
      request.setCharacterEncoding("utf-8");
      st.executeUpdate("insert into goods values(null,'"+request.getParameter("gname")+"',"+request.getParameter("gprice")+")");
      //发送查询SQL语句,返回结果集
      rs = st.executeQuery("select * from goods");
      //将查询结果装到集合ArrayList<Goods>中
      allGoods = new Goods();
      while(rs.next()){
           Goods g = new Goods();
           g.setId(rs.getInt(1));
           g.setGName(rs.getString(2));
           g.setGPrice(rs.getDouble(3));
           allGoods.add(g);
      }
      rs.close();
      st.close();
      con.close();
     } catch (SQLException e) {
         e.printStackTrace();
     }
     //存到request对象,以便页面showAllGoods.jsp中显示
     request.setAttribute("allGoods",allGoods);
     //跳转到showAllGoods.jsp显示商品
     RequestDispather dis = request.getRequestDispatcher("showAllGoods.jsp");
     dis.forward(request,response);
     }
     protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
         doGet(request,response);
   } 
}

页面showAllGoods.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<! DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <table border="1">
       <tr>
           <th>商品编号</th>
           <th>商品名称</th>
           <th>商品价格</th>
       </tr>
     <c:forEach items="${allGoods}" var="goods">
       <tr>
           <td>${goods.id}</td>
           <td>${goods.gname}</td>
           <td>${goods.gprice}</td>
       </tr>
     <c:forEach>
    </table>
</body>
</html>

3.游动查询

有时候需要结果集的游标前后移动,这时可使用滚动结果集。为了获得滚动结果集,必须首先用下面的方法得到一个Statement对象:

Statement st = con.createStatement(int type,int concurrency);

根据tyoe和concurrency的取值,当执行ResultSet = st.executeQuery(String sql)时,会返回不同类型的结果集。

type的取值决定滚动方式,它的取值如下:

  • ResultSet.TYPE_FORWORD_ONLY:表示结果集只能向下滚动。
  • ResultSet.TYPE_SCROLL_INSENSITIVE:表示结果集可以上下滚动,当数据库变化时,结果集不变。
  • ResultSet.TYPE_SCROLL_SENSITIVE:表示结果集可以上下滚动,当数据库变化时,结果集同步改变。

concurrency的取值表示是否可以用结果集更新数据库,它的取值如下:

  • ResultSet.CONCUR_READ_ONLY:表示不能用结果集更新数据库表。
  • ResultSet.CONCUR_UPDATETABLE:表示能用结果集更新数据库表。

游动查询经常用到ResultSet的方法如下:

  • public void afterLast():将游标移到结果集的最后一行之后
  • public void beforeFirst():将游标移到结果集的第一行之后
  • public void first():将游标移到结果集的第一行
  • public int getRow():得到当前游标所指定的行号,如果没有行,则返回0
  • public boolean isAfterLast():判断游标是不是在结果集的最后一行之后
  • public boolean isBeaforeLast():判断游标是不是在结果集的第一行之前
  • public void last():将游标移到结果集的最后一行
  • public boolean previous():将游标向上移动(和next方法相反),当移动到结果集的第一行之前时返回false
【例3-1】编写一个Servlet(MoveSelectServlet.java),在Servlet中查询goods表中的记录,并在showMoveGoods.jsp页面中逆序显示偶数行的记录。本例中需要利用【例2-1】的实体类Goods,但需要为Goods添加一个属性rowno封装行号。

4.使用连接池

与数据库建立连接是一个耗资源的活动,每次都要花费一定的时间。这个时间对于一次或几次数据库连接,系统的开销或许不明显。可是对于大型电子商务网站,同时有成千上万人频繁地进行数据库连接操作,势必占用很多系统资源,网站的响应速度必定下降,严重时甚至会造成服务器的崩溃。因此,合理地建立数据库连接是非常重要的。

数据库连接池的基本思想是:为数据库建立一个“缓冲池”。预先在“缓冲池”中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。可以通过设定连接池最大连接数来防止系统无限度地与数据库连接。更为重要的是,通过连接池的管理机制见识数据库连接的数量及使用情况,为系统开发、测试和性能调整提供依据。

第一次访问连接池时,需要耗费一定的时间,这是因为在第一次访问时连接池中没有可用连接,但是第二次访问时连接池中就有了一些可用的连接,可以直接从连接池中获得连接来访问数据库。

【例4-1】编写一个JSP页面conPool.jsp,在该页面中使用scope作为application的Bean(由ConnectionPool对象负责创建)。该Bean创建时,将建立一定数量的连接对象。因此,所有的用户将共享这些连接对象。在JSP页面中使用Bean获得一个连接对象,然后使用该连接对象访问数据库中的goods表(查询出商品价格大于50的商品)。

5.其他典型数据库的连接

连接SQL SERVER数据库

加载驱动程序

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

建立连接

Connection con=DriverManager.getConnection("jdbc:oracle:thin:@主机:端口号:数据库名","用户名","密码");
Connection con= DriverManager.getConnection(
"jdbc:sqlserver://localhost:1433;DatabaseName=mydatabase","用户名","密码");

连接Oracle数据库

加载驱动程序

Class.forName("oracle.jdbc.OracleDriver");

建立连接

Connection con= DriverManager.getConnection(
"jdbc:oracle:thin:@主机:端口:数据库名","用户名","密码");

6.使用PreparedStatement语句访问数据库

与Statement语句一样,PrepareStatement语句同样可以完成向数据库发送SQL语句、获取数据库操作结果的功能。PreparedStatement语句习惯地称为预处理语句。

7.分页查询

分页查询一般有两种实现方式:一次查询出所有数据,在页面中进行分页显示;每页查询一次,每次只查询本页显示的数据。本节采用后者。

首先获得查询数据总条数totalCount,然后根据totalCount计算总页数totalPage,最后计算起始位置startIndex。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_60415234/article/details/135408508

智能推荐

芯片验证从零开始系列(一)——芯片验证概论-程序员宅基地

文章浏览阅读1w次,点赞7次,收藏78次。芯片验证从零开始系列(一)——芯片验证概论芯片开发流程动态验证技术静态验证技术Emulation和FPGA原型开发由于最近一个比赛要用到UVM验证,顺便多一门以后求职的手艺,准备系统地学习一下SV和UVM,也可以为之后的毕业论文和发展方向做一些准备。芯片开发流程1)市场人员和客户沟通确定用户需求2)系统设计人员按照功能划分为各个子系统3)子系统由设计团队开发实现4)验证人员对设计功能展开验证,发现设计缺陷,交由设计人员修正5)验证没有出现漏洞后,交由后端人员进行综合,布局布线6)后端人员将_芯片验证

RabbitMQ详解(一):RabbitMQ相关概念_obpmq-程序员宅基地

文章浏览阅读8.9k次,点赞24次,收藏26次。RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,本系列是RabbitMQ快速入门文章,主要内容包括RabbitMQ是什么、RabbitMQ核心概念、五种消息模型、用Docker安装RabbitMQ等。_obpmq

HTML 网页自动刷新_html多线程刷新网页-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏24次。HTML网页自动刷新方法在进行HTML网页编写的过程中,往往需要及时的编写反馈,反复的在编辑器和浏览器窗之间进行切换是一个很繁琐的事情,如果在编辑器上使用插件,我也不太愿意,繁琐而且不安全。下面介绍三种不需要插件的自动刷新方法。第一种使用meta标签在html的文档头中,在<head>标签中添加meta属性,像下面“ <meta http-equiv="refresh" content="10">其中前面是刷新所需的meta标识,后面的content是刷新的秒数。第二_html多线程刷新网页

使用@EventListener注解,只启动一次监听事件_@eventlistener 被启动了2次-程序员宅基地

文章浏览阅读726次。背景:当在写一个Spring项目时,配置了事件监听器,在项目启动的时候会自己启动一次,之后如果再调用Controller接口的时候,他还会自己再启动,这个时候我们的业务场景只需要启动一次该怎么办呢?解答: @EventListener public void listener1(ApplicationEvent event) { //解决controller调用接口的时候多次启动event实例 ContextRefreshedEvent event1 = _@eventlistener 被启动了2次

python脚本编程:实时监控日志文件_linux实时监控日志 python-程序员宅基地

文章浏览阅读5k次。用python可以很小巧轻便的实时监控日志文件增量刷新,根据某些关键字进行匹配,方便做运维异常告警代码import timeimport re# specify log file pathlog_path = "my.log"# open file and monitor newst linenumber = 0position = 0with open(log_path,..._linux实时监控日志 python

svn 分支(branch)和标签(tag)管理-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏61次。svn的分支管理_svn 分支

随便推点

用 Hadoop 进行分布式并行编程, 第 3 部分_hdfs dfs -copyfromlocal /home/hadoop/temp/* /tempd-程序员宅基地

文章浏览阅读706次。Hadoop 是一个实现了 MapReduce 计算模型的开源分布式并行编程框架,借助于 Hadoop, 程序员可以轻松地编写分布式并行程序,将其运行于计算机集群上,完成海量数据的计算。在本文中,详细介绍了如何部署 Hadoop 分布式运行环境,如何让程序分布式运行于多台普通的计算机上,如何使用 IBM MapReduce Tools 轻松地将 MapReduce 程序部署到 Hadoop 分_hdfs dfs -copyfromlocal /home/hadoop/temp/* /tempdir

Linux进阶 apache服务器;虚拟主机_虚拟机安装开启httpd服务-程序员宅基地

文章浏览阅读309次。1.关闭防火墙systemctlstopfirewalld(暂时关闭,重启后恢复)修改前------将index.html改为hello.html。2.设置宽容模式setenforce0(暂时性设置)配置同一ip不同端口的虚拟主机访问apache服务器。(1)安装httpd(先挂载,用yum安装)(4)修改配置文件httpd.html。(3)创建文件hello.html。(2)启动httpd服务。(5)重启httpd服务。(5)重启httpd服务。(5)重启httpd服务。..._虚拟机安装开启httpd服务

软件测试随笔-程序员宅基地

文章浏览阅读73次。记录一些软件测试工作中的想法。1)软件测试岗位价值在IT行业里是比较低的,为了更好的体现自身价值,我认为软件测试从业者应该比业务更懂技术,比技术更懂业务。同时具备很好的沟通协调能力。让自己变成万能胶。2)软件测试体现价值的点:1.发现bug2.提供信心3.提供信息4.预防缺陷3)软件测试一定要考虑测试的覆盖率4)测试工作要体现测试技术,而不是测试工..._软件测试随笔

VB程序设计教程(第四版) 龚沛曾_龚沛曾vb.pdf-程序员宅基地

文章浏览阅读1.6w次,点赞17次,收藏47次。VB程序设计教程(第四版) 龚沛曾 课后习题答案目录第一章课后答案第二章课后答案第三章课后答案第四章课后答案第五章课后答案第六章课后答案第七章课后答案第八章课后答案....第一章课后答案1、简述Visual Basic的特点。答:(1)具有基于对象的可视化设计工具(2)事件驱动的编程机制(3)提供易学易用的应用程序集成开发环境(4..._龚沛曾vb.pdf

Matlab神经网络语音增强,基于BP神经网络的语音增强研究-程序员宅基地

文章浏览阅读452次。曰髯?分类号:论文编号:2丛坦丝旦生丛密级:公开贵州大学2009届硕士研究生学位论文基于即神经网络的语音增强研究学科专业:电路与系统研究方向:模式识别导师:刘宇红教授研究生:周元芬中国贵州’贵阳2009年5月摘要-5Abstract-6第一章绪言11.1引言11.2语音增强的意义与研究现状21.2.1语音增强的目的21.2.2语音增强的意义21.2.3国内外语音增强研究现状41.2.4语音增强的算..._基于神经网络的语音增强

java.lang.ClassNotFoundException: org.springframework.core.io.Resource 解决办法-程序员宅基地

文章浏览阅读1.7w次。问题描述: 在使用maven依赖项spring MVC、Hibernate和Struts2构建REST web项目之后,我将项目进行打包 “ProcjectName.war”,并通过tomcat manager html页面将其上传到 Linux 的tomcat 服务器,它可以正常工作。但是当我尝试在本地tomcat服务器 (Windows平台)上部署war时,我从tomcat catali..._org.springframework.core.io.resource