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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297580.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PID各种算法的基本优缺点

PID时间系数对PID本身的影响 积分时间过小积分作用增强。 微分时间过大&#xff0c;微分控制作用过强&#xff0c;容易产生振荡。 在这里的时间系统&#xff0c;一般指的是采样的时间&#xff0c;也就是PID控制的周期。在无人机当中一般采用10ms控制一次。 一般来说采样周期越小…

【Docker】容器的相关命令

上一篇&#xff1a;创建&#xff0c;查看&#xff0c;进入容器 https://blog.csdn.net/m0_67930426/article/details/135430093?spm1001.2014.3001.5502 目录 1. 关闭容器 2.启动容器 3.删除容器 4.查看容器的信息 查看容器 1. 关闭容器 从图上来看&#xff0c;容器 aa…

如何在 Xftp 中使用自定义编辑器编辑远程服务器文件

1、简介 很多时候我们使用 Xshell 远程登录linux服务器进行文本编辑&#xff0c;通过命令行窗口难以进行快速编辑&#xff0c;因此&#xff0c;借助 Xftp 工具&#xff0c;指定文本编辑器&#xff0c;能够快速帮助我们实现文本编辑。 2、Xftp 使用 在上文中&#xff08;https:…

软件工程概论------文件管理

目录 1.文件的相关概念 2.文件目录 3.位示图 4.索引文件 5.例题 1.文件的相关概念 文件:具有符号名的、在逻辑上具有完整意义的一组相关信息项的集合。 逻辑结构:有结构的记录式文件、无结构的流式文件。 物理结构: 连续结构、链接结构、索引结构、多个物理块的索引表。 …

乔布斯在斯坦福大学经典演讲

今天&#xff0c;很荣幸来到各位从世界上最好的学校之一毕业的毕业典礼上。我从来没从大学毕业过&#xff0c;说实话&#xff0c;这是我离大学毕业最近的一刻。 今天&#xff0c;我只说三个故事&#xff0c;不谈大道理&#xff0c;三个故事就好。 第一个故事&#xff0c;是关于…

【ChatGPT】提示设计的艺术:使用清晰的语法

探索清晰的语法如何使您能够将意图传达给语言模型&#xff0c;并帮助确保输出易于解析 All images were generated by Scott and Marco. 这是与Marco Tulio Ribeiro共同撰写的关于如何使用指导来控制大型语言模型&#xff08;LLM&#xff09;的系列文章的第一部分。我们将从基…

Spring中的工厂类ApplicationContext和BeanFactory

1.ApplicationContext ApplicationContext的实现类&#xff0c;如下图 ClassPathXmlApplicationContext&#xff1a;加载类路径下 Spring 的配置文件 FileSystemXmlApplicationContext&#xff1a;加载本地磁盘下 Spring 的配置文件 ApplicationContext由BeanFactory派生而…

标签函数 - 打造JavaScript组件

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

计算机基础知识——校验码概述

目录 1 码距 2 奇偶校验 3 CRC循环冗余校验码 3.1 多项式 3.2 编码的组成 3.3 生成多项式 3.4 校验码的生成 4 海明校验码和恒比码 4.1 校验方程 4.2 恒比码 1 码距 码距是恒量一种编码方式的抗错误能力的一个指标。数字信息在传输和存取的过程中&#xff0c;由于…

权威认可!甄知科技猪齿鱼产品荣获信创产品评估证书

近日&#xff0c;依据《信息技术应用创新产品评估规范 第1部分&#xff1a;应用软件》&#xff08;T/SSIA 2001-2022&#xff09;&#xff0c;经过严格评估&#xff0c;甄知科技旗下自主研发的猪齿鱼数智化开发管理平台 V2.0.0&#xff0c;通过信创测试认证&#xff0c;获得上海…

Jmeter相关知识介绍

Jmeter 是Apache 组织开发的基于JAVA 的压力测试工具,用于对软件做压力测试,特别适合于WEB 应用测试(包括压力,接口测试) 今天简单介绍Jemeter的入门相关概念的理解 一、在安装目录下有一个Bin\Jmeter.bat 双击打开 打开之后是一个这样的界面 二、测试计划 1、添加和删…

基础语法(一)(1)

常量和表达式 在这里&#xff0c;我们可以把Python当成一个计算器&#xff0c;来进行一些算术运算 例如&#xff1a; print(1 2 - 3) print(1 2 * 3) print(1 2 / 3)注意&#xff1a; print是一个python内置的函数&#xff0c;这个稍后我们会进行介绍 可以使用-*/&…

java 音乐会售票平台系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 音乐会售票平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助struts2框架开发mvc模式&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发 环境为TOCAT7.0,Myeclipse8.5开发&#xff0c;数据…

揭开 JavaScript 作用域的神秘面纱(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Halcon计算最小外接矩形Smallest_rectangle2

Halcon计算最小外接矩形Smallest_rectangle2 该算子用于求最小外接矩形。该算子的原型如下&#xff1a; smallest _rectangle2 (Regions : : : Row, Column, Phi, Lengthl, Length2)其各参数的含义如下。 参数1&#xff1a;Regions 表示输入的区域。 参数2和3&#xff1a;Row…

如何通过HACS+Cpolar实现远程控制米家和HomeKit等智能家居设备

文章目录 基本条件一、下载HACS源码二、添加HACS集成三、绑定米家设备 ​ 上文介绍了如何实现群晖Docker部署HomeAssistant&#xff0c;通过内网穿透在户外控制家庭中枢。本文将介绍如何安装HACS插件商店&#xff0c;将米家&#xff0c;果家设备接入 Home Assistant。 基本条件…

Spring AI和Ollama

概述 Spring AI 不仅提供了与 OpenAI 进行API交互&#xff0c;同样支持与 Ollama 进行API交互。Ollama 是一个发布在GitHub上的项目&#xff0c;专为运行、创建和分享大型语言模型而设计&#xff0c;可以轻松地在本地启动和运行大型语言模型。 Docker环境安装Ollama 1.获取D…

python 模块搜索路径

前言 当我们import os的时候&#xff0c;Python解释器去哪找os模块呢&#xff1f;如果多处都有os模块&#xff0c;选择哪个os模块呢&#xff1f; 去哪找os模块&#xff1f; Python解释器不是很神奇&#xff0c;它会从以下2个地方找os模块 1、内置模块 sys.builtin_module_nam…

ROS-arbotix安装

方式一&#xff1a;命令行输入&#xff1a; sudo apt-get install ros-melodic-arbotix如果ROS为其他版本&#xff0c;可将melodic替换为对应版本。 方式二&#xff1a; 先从 github 下载源码&#xff0c;然后调用 catkin_make 编译 git clone https://github.com/vanadiumla…

P59 生成式对抗网络GAN-理论介绍 Theory behind GAN

Object Normal Distribution 的数据 经过 Generator 后生成分布更加复杂的PG. 真实数据的分布为 Pdata , 希望 PG和Pdata 越近越好 LOSS 是 两者之间的分布距离 问题: 如何计算 divergence? Sampling is goog enough Discriminator 希望V越大越好 y~Pdata 代表从 Pdata里…