15.2 JDBC数据库编程2
15.2.1 数据库访问步骤
使用JDBC API连接和访问数据库,一般分为以下5个步骤:
(1) 加载驱动程序
(2) 建立连接对象
(3) 创建语句对象
(4) 获得SQL语句的执行结果
(5) 关闭建立的对象,释放资源
下面将详细描述这些步骤
15.2.2 加载驱动程序
要使应用程序能够访问数据库,必须首先加载驱动程序。加载驱动程序一般使用Class类的forName()静态方法,格式如下:
public static Class<?> forName(String className)
该方法返回一个Class类的对象。参数className为字符串表示的完整驱动程序类的名称,若找不到驱动程序将抛出ClassNotFoundException异常
对于不同的数据库,驱动程序的类名不同。下面几行代码分别是加载MySQL数据库、Oracle数据库和PostgreSQL数据库驱动程序
//加载MySQL数据库驱动程序
Class.forName("com.mysql.jdbc.Driver");
//加载Oracle数据库驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
//加载PostgreSQL数据库驱动程序
Class.forName("org.postgresql.Driver");
另一种加载驱动程序的方法是使用DriverManager类的静态方法registerDriver()注册驱动程序,如下所示。
DriverManager.registerDriver(new org.postgresql.Driver());
其中,org.postgresql.Driver为PostgreSQL的驱动程序类
注:使用JDBC4.0及以上的版本,可以采用动态加载驱动程序的方法,即不需要使用Class.forName()方法加载驱动程序。只需将包含JDBC驱动程序的JAR文件添加到CLASSPATH中。例如,对MySQL数据库,在mysql-connector-java-5.1.39-bin.jar中META-INF/services/java.sql.Driver文件的内容是org.mysql.jdbc.Driver
动态加载驱动程序的优点是,不仅少写几行代码,而且不需要将JDBC驱动程序类名硬编码在程序中。如果需要更新驱动程序 ,只需用新的JAR文件替换旧的文件即可。新的类名也不必与旧的类名匹配。
15.2.3 建立连接对象
1.DriverManager类
DriverManager类是JDBC的管理层,作用于应用程序和驱动程序之间。DriverManager类跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接。
建立数据库连接的方法是调用DriverManager类的getConnection()静态方法,该方法有下面两种格式:
puiblic static Conneciton getConnection(String dburl);
puiblic static Conneciton getConnection(String dburl,String user,String password).
参数dburl表示JDBC URL,user表示数据库用户名,password表示口令。DriverManager类维护一个注册的Driver类列表。调用该方法,DriverManager类试图从注册的驱动程序中选择一个合适的驱动程序,然后建立与给定数据库的连接。如果不能建立连接将抛出SQLException异常
2.数据库URL
数据库URL与一般的URL不同,用来标识数据源,这样驱动程序就可以与它建立连接。下面是数据库URL的标准语法,包括由冒号分割的3个部分:
jdbc:<subprotocol>:<subname>
其中,jdbc表示协议,数据库URL的协议总是jdbc:subprotocol表示子协议,为驱动程序或数据库连接机制的名称,子协议名通常为数据库厂商名,如mysql,oracle,postgresql等;subname为子名称,表示数据库标识符,该部分内容随数据库驱动程序的不同而不同
String url = "jdbc:mysql://localhost:3306/haozihua?useSSL=false";
Connection conn = DriverManager.getConnection(url, user, password);
如代码所示, localhost为本机IP地址,也可以更改为127.0.0.1;3306为MySQL数据库服务器使用的端口号;数据库名为haozihua,用户名为root,密码为root.
3.Connection对象
Connection对象代表与数据库的连接,也就是在加载的驱动程序与数据库之间建立连接。一个应用程序可以与一个数据库建立一个或多个连接,或与多个数据库建立连接
得到连接对象后,可以调用Connection接口的方法创建SQL语句对象以及在连接对象上完成各种操作,下面是Connection接口的常用方法.
- public Statement createStatment():创建一个Statement对象,使用该方法执行不带参数的SQL语句。
- public PreparedStatement prepareStatement(String sql):使用给定的SQL命令创建一个预编译语句对象,使用该方法可执行带参数的SQL语句
- public void setAutoCommit(boolean autoCommit):设置通过该连接对数据库的更新操作是否自动提交,默认情况为true
- public boolean getAutoCommit():返回当前连接是否为自动提交模式
- public void commit():提交对数据库的更新操作,使更新写入数据库。只有当setAutoCommit()为false时,才应该使用该方法。
- public void rollback():回滚对数据库的更新操作。只有当setAutoCommit()为false时,才应该使用该方法。
- public void close():关闭该数据库连接。在使用连接后应该关闭,否则连接会保持一段较长的时间,直至超时
- public void isClosed():返回该连接是否已被关闭
15.2.4 创建语句对象
SQL语句对象有3种:Statement、PreparedStatement和CallableStatement。通过调用Connection接口的相应方法可以得到这3种语句对象,本节只讨论Statement对象
Statement接口对象主要用于执行一般的SQL语句,常用方法如下:
- public ResultSet executeQuery(String sql):执行SQL查询语句,参数sql为用字符串表示的SQL查询语句,查询结果以ResultSet对象返回
- public int executeUpdate(String sql):执行SQL更新语句,参数sql用来指定SQL语句更新,该语句可以是INSERT、DELETE、UPDATE语句或无返回的SQL语句,如SQL DDL语句CREATE TABLE。该方法返回值是更新的行数,如果语句没有返回则返回值为0
- public boolean execute(String sql):执行可能有多个结果集的SQL语句,sql为任何的SQL语句。如果语句执行的第一个结果为ResultSet对象,该方法返回true,否则返回false
- public Connection getConnection():返回产生该语句的连接对象
- public void close():释放Statement对象占用的数据库和JDBC资源
执行SQL语句使用Statement对象的方法。对于查询语句,调用executeQuery(String sql)方法,该方法的返回类型为ResultSet,再通过调用ResultSet的方法可以对查询结果的每行进行处理。
String sql="SELECT * FROM department";
ResultSet rst=stmt.executeQuery(sql);
while(rst.next()){
System.out.println(rst.getString(1)="\t")
}
对于更新语句,如INSERT、UPDATE、DELETE,需使用executeUpdate(String sql)方法。该方法返回值为整数,用来只是被影响行的数目
15.2.5 ResultSet对象
ResultSet对象表示SQL查询语句得到的记录集合,称为结果集。结果集一般是一个记录表,其中包含列标题和多个记录行,一个Statement对象一个时刻只能打开一个ResultSet对象。
每个结果集对象都有一个游标。所谓游标(cursor)是结果集的一个标志或指针。对新产生的ResultSet对象,游标指向第一行的前面,可以调用ResultSet对象的方法,对查询结果处理。1.ResultSet的常用方法
ResultSet接口提供了对结果集操作的方法,下面是一个常用的方法。
public boolean next() throws SQLException
该方法将游标从当前位置向下移动一行。第一次调用next()方法将使第一行成为当前行,以后调用游标依次向后移动。如果方法返回true,说明新行是有效的行;若返回false,说明已无记录。
可以使用getXxx()方法检索当前行的列值,由于结果集列的数据类型不同,所以应该使用不同的getXxx()方法获得列值。

15.2.4 关闭有关对象
数据库访问结束后,应当关闭有关对象。可以使用每种对象的close()方法关闭对象,也可以使用Java7的try-with-reso urces结构实现资源的自动关闭。
相关文章:
15.2 JDBC数据库编程2
15.2.1 数据库访问步骤 使用JDBC API连接和访问数据库,一般分为以下5个步骤: (1) 加载驱动程序 (2) 建立连接对象 (3) 创建语句对象 (4) 获得SQL语句的执行结果 (5) 关闭建立的对象,释放资源 下面将详细描述这些步骤 15.2.2 加载驱动程序 要使…...
Spark数据介绍
从趋势上看,DataFrame 和 Dataset 更加流行。 示例场景 数据仓库和 BI 工具集成: 如果你需要处理存储在数据仓库中的结构化数据,并且希望与 BI 工具集成,那么 DataFrame 和 Dataset 是首选。 机器学习流水线: 在构建机…...
【0基础】制作HTML网页小游戏——贪吃蛇(附详细解析)
我在昨天的文章(贪吃蛇HTML源码)里面分享了网页版贪吃蛇小游戏的源码,今天就来给大家详细讲解一下每部分代码是如何运作的,以及以后要如何美化贪吃蛇的UI界面,在哪里修改等。 目录 一、代码运作 1、HTML结构: 2、C…...
Vscode python无法转到函数定义
今天上午换了电脑,使用Vscode发现找不到对应的函数定义了。 使用了网上的全部教程。一点用没有。重启电脑,重启Vscode也没有作用。最后通过重装vscode,解决问题。(也不知道Vscode什么毛病) 重点语句: 去官网…...
Python中的上下文管理器(with语句)及其作用
Python中的上下文管理器(Context Manager)是一种通过with语句来管理资源(如文件、网络连接、线程锁等)的机制。with语句旨在简化常见的资源管理任务,如资源的获取、使用后的清理等。使用上下文管理器可以确保资源在使用…...
CTK框架(八):服务追踪
目录 1.简介 2.实现方式 3.具体实现 3.1.新建插件PluginA 3.2.新建插件PluginB 4.服务追踪的优势 5.应用场景 6.总结 1.简介 CTK服务追踪是一种机制,用于在CTK插件框架中追踪和管理插件提供的服务。当一个插件注册了一个服务到服务注册中心后࿰…...
[针对于个人用户] 显卡与计算卡性能对比表
笔者使用 Quadro M4000 显卡用于 LLM 相关任务,但奈何该卡发布的年代过于久远,以至于 LLM 相关任务只能使用例如:Phi3 mini、Qwen 2 2B、GLM 4 8B 以及 Gemini v2 2B等小参数模型,且速度不堪理想,也经常因为显卡过热降…...
2024年智能录屏解决方案全攻略,从桌面到云端
如果你有过录屏经验那你一定遇到过被限制录制时长或者录制的画面比较模糊之类的情况。这次我我推荐几款免费录屏软件,让我们可以更自由的录制屏幕画面。 1.福晰REC大师 链接:www.foxitsoftware.cn/REC/ 这款软件便捷好操作,而且符合我这次…...
CentOS7.9下snmp v3 inform搭建监控端
1.基础环境配置 为了防止防火墙及selinux等的影响,需关闭防火墙及selinux等,具体参考: Linux常规基础配置_linux基础配置-CSDN博客 2.安装snmp yum源配置,具体参考: Linux常规基础配置_linux基础配置-CSDN博客 snmp安装命令: yum install -y net-snmp net-snmp-ut…...
水库大坝安全监测方案,双重守护,安全无忧
水库作为重要的水利设施,在防洪、灌溉及供水等方面发挥着重要作用。然而随着时间的推移,大坝面临着自然老化、设计标准不足及极端天气等多重挑战,其安全性与稳定性日益受到关注。水库堤坝险情导致的洪涝灾害给人民生命财产和经济社会发展带来…...
yolov8实现图片验证码识别
1、环境准备 1.1、安装miniconda 地址:Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 注意:为避免不兼容的问题,推荐下载py38版本,我下载的是Miniconda3-py38_23.1.0-1-Windows-x86_…...
代码随想录训练营 Day56打卡 图论part06 108. 冗余连接 109. 冗余连接II
代码随想录训练营 Day56打卡 图论part06 一、卡码108. 冗余连接 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图&…...
QT天气预报
json 理论 什么是JSON? 规则 被大括号包括的是JSON对象,被中括号包括的是JSON数组. JSON数组JSON对象 实验 构建JSON 用代码实现如下json内容: //构建JSON void WirteJson() {QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china&quo…...
JavaWeb中处理 Web 请求的方式总结
文章目录 JavaWeb中处理 Web 请求的方式总结1. 原始的 Servlet 方式1.1. 环境搭建**创建 Maven 或 Gradle 项目**:**添加 Servlet 依赖**:**创建 Servlet 类**:**配置项目**:**配置 Tomcat**: 1.2. 路由机制1.3. 示例代…...
React的事件与原生事件的执行顺序?
react自身实现了一套自己的事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等,虽然和原生的是两码事,但也是基于浏览器的事件机制下完成的。 react 的所有事件并没有绑定到具体的dom节点上而是绑定在了document 上,然后由…...
【Java】Runtime与Properties获取系统信息
Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 代码4.2 运行结果 五、总结: 一、前言 这些都被淘汰比较少用了…...
基于SpringBoot的社团管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的社团管理系统【附源码文档】、…...
UE5.3_跟一个插件—Socket.IO Client
网上看到这个插件,挺好! 项目目前也没有忙到不可开交,索性跟着测一下吧: 商城可见,售价72.61人民币! 但是,git上有仓库哦,免费!! 跟着链接先准备起来: Documentation: GitHub - getnamo/SocketIOClient-Unreal: Socket.IO client plugin for the Unreal Engin…...
鸿蒙轻内核A核源码分析系列七 进程管理 (1)
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 轻内核A核源码分析系列一 数据结构-双向循环链表 轻内核A核源码分析系列二 数据结构-位图操作 轻内核A核源码分析系列三 物理内存(1࿰…...
qt QGraphicsScene场景坐标和场景内GraphicsItem局部坐标的相互转换
为了更清晰地解释场景坐标与局部坐标之间的转换过程,我们可以通过一个简单的实例来演示如何赋值场景坐标,并将其转换为图形项的局部坐标。 实例步骤 假设我们有一个场景 QGraphicsScene 和一个矩形图形项 QGraphicsRectItem,矩形的大小为 1…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
