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。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js逆向第8例:猿人学第1题-js 混淆-源码乱码

题目1:抓取所有(5页)机票的价格,并计算所有机票价格的平均值,填入答案。 老规矩打开控制台调试,出现debugger 过掉这个很简单了,右键点击“一律不在此处暂停” 这样就可以查看具体的网络请求如下: m是加密值,熟悉的大佬能发现这串加密字符非常像md5,|后面的就是时…

抓包工具:fiddler和wireshark对比

了解过网络安全技术的人都知道一个名词“抓包”。那对于局外人&#xff0c;一定会问什么是抓包&#xff1f;考虑到&#xff0c;大家的技术水平不一&#xff0c;我尽可能用非专业的口吻简单的说一下。 抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&a…

【Leetcode】2487. 从链表中移除节点

文章目录 题目思路代码 题目 2487. 从链表中移除节点 思路 1、递归移除节点&#xff1a; 如果头节点为空&#xff0c;直接返回空。递归调用函数处理下一个节点 head->next。在递归返回后&#xff0c;判断当前节点的值是否小于之前记录的最大值 maxVal。如果小于 maxVal…

力扣1944.队列中可以看到的人数--单调栈

思路&#xff1a; 由题知一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 &#xff0c;也就是说&#xff0c;在自己右边第一个比自己高的人后面的人就肯定看不到了那么只需要找到右边第一个比自己高的人与自己之间的所有满足要求的人就行了&#xff0…

【Python可视化实战】钻石数据可视化

一、项目引言 1.背景和目标 钻石作为一种珍贵的宝石&#xff0c;其价格受到多种因素的影响。为了深入了解钻石价格的决定因素&#xff0c;我们收集了大量关于钻石的数据&#xff0c;并希望通过数据可视化来揭示钻石特征与价格之间的关系。 2.内容 收集钻石的各项特征数据&a…

QT5.14 实现ModbusTCP客户端 Demo

本文在QT5.14平台&#xff0c;基于QModbusClientTcp类&#xff0c;实现了客户端对单个寄存器的读写&#xff0c;用ModbusSlave做服务器做测试。 1.界面 (1)更改读按钮的名称为bt_Read (2)更改写按钮的名称为bt_Write 2.修改pro文件的第三行 greaterThan(QT_MAJOR_VERSION, 4)…

UE5 C++(十一)— 碰撞检测

文章目录 代理绑定BeginOverlap和EndOverlapHit事件的代理绑定碰撞设置 代理绑定BeginOverlap和EndOverlap 首先&#xff0c;创建自定义ActorC类 MyCustomActor 添加碰撞组件 #include "Components/BoxComponent.h"public:UPROPERTY(VisibleAnywhere, BlueprintRea…

vmware安装centos 7.6 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.6 操作系统镜像文件2、安装centos 7.6操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.6 操作系统镜像文件 这里选择 2018年10月发布的 7.6 版本 官方下载链…

1月5日代码随想录完全二叉树的节点个数

222.完全二叉树的节点个数 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在…

基于入侵杂草算法优化的Elman神经网络数据预测 - 附代码

基于入侵杂草算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于入侵杂草算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于入侵杂草优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

蟹目标检测数据集VOC格式400张

蟹&#xff0c;一种独特的海洋生物&#xff0c;以其强壮的身体和独特的生活习性而闻名。 蟹的身体宽厚&#xff0c;有一对锐利的大钳子&#xff0c;这使得它们在寻找食物和保护自己时非常有力。蟹的外观颜色多样&#xff0c;有绿色、蓝色、棕色和红色等&#xff0c;这使得它们在…

Go语言中的HTTP路由处理

在Web开发中&#xff0c;路由处理是至关重要的部分。它决定了当用户访问某个URL时&#xff0c;服务器应该如何响应。Go语言提供了多种库和工具来处理HTTP路由。下面&#xff0c;我们将深入了解如何在Go语言中处理HTTP路由。 Go语言的net/http包本身提供了基本的功能来处理路由…