当前位置: 首页 > news >正文

JDBC(2)基础篇2——增删改查及常见问题

目录

一、基于PreparedStatement实现CRUD

1.查询单行单列

2.查询单行多列

3.查询多行多列

4.新增

5.修改

6.删除

7.总结

二、常见问题

1.资源的管理

2.SQL语句问题

3.SQL语句未设置参数问题

4.用户名或密码错误问题

5.通信异常

总结


一、基于PreparedStatement实现CRUD

1.查询单行单列

package com.myblog;import java.sql.*;
import org.junit.Test;public class JdbcExample {@Testpublic void testQuerySingleRowAndCol() throws Exception {//1.注册驱动(可以省略)//2.获取连接Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码//3.预编译SQL语句得到PreparedStatement对象PreparedStatement preparedStatement = connection.prepareStatement("SELECT COUNT(*) as count FROM employee");//4.执行SQL语句,获取结果ResultSet resultSet = preparedStatement.executeQuery();//5.处理结果// 如果自己明确一定只有一个结果,那么resultSet最少要做一next的判断,才能拿到我们要的列的结果if (resultSet.next()) {int count = resultSet.getInt("count");System.out.println(count);}//6.释放资源resultSet.close();preparedStatement.close();connection.close();}
}

2.查询单行多列

package com.myblog;import java.sql.*;
import org.junit.Test;public class JdbcExample {@Testpublic void testQueryRowAndCol() throws Exception {//1.注册驱动(略)//2.获取连接对象Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码//3.预编译SQL语句得到PreparedStatement对象PreparedStatement preparedStatement = connection.prepareStatement("SELECT id, name, salary, age FROM employee WHERE id = ?");//4.执行SQL语句,获取结果//有占位符要赋值preparedStatement.setInt(1, 5);ResultSet resultSet = preparedStatement.executeQuery();//5.处理结果while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");double salary = resultSet.getDouble("salary");int age = resultSet.getInt("age");System.out.println(id + "\t" + name + "\t" + salary + "\t" + age);}//6.资源释放resultSet.close();preparedStatement.close();connection.close();}
}

3.查询多行多列

package com.myblog;import java.sql.*;
import org.junit.Test;public class JdbcExample {@Testpublic void testQueryMoreRow() throws Exception {// 获取连接对象Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码// 预编译SQL语句得到PreparedStatement对象PreparedStatement preparedStatement = connection.prepareStatement("SELECT id, name, salary, age FROM employee WHERE age > ?");// 为占位符赋值,并接受结果preparedStatement.setInt(1, 25);ResultSet resultSet = preparedStatement.executeQuery();// 处理结果while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");double salary = resultSet.getDouble("salary");int age = resultSet.getInt("age");System.out.println(id + "\t" + name + "\t" + salary + "\t" + age);}// 释放资源resultSet.close();preparedStatement.close();connection.close();}
}

4.新增

package com.myblog;import java.sql.*;
import org.junit.Test;public class JdbcExample {@Testpublic void testInsert() throws Exception {// 获取连接对象Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码// 预编译SQL语句得到PreparedStatement对象PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO employee(name, salary, age) VALUES(?,?,?)");// 为占位符赋值preparedStatement.setString(1, "rose");preparedStatement.setDouble(2, 345.67);preparedStatement.setInt(3, 28);// 执行插入操作int result = preparedStatement.executeUpdate();// 根据受影响行数,判断操作是否成功if (result > 0) {System.out.println("插入成功");} else {System.out.println("插入失败");}// 释放资源preparedStatement.close();connection.close();}
}

5.修改

package com.myblog;import java.sql.*;
import org.junit.Test;public class JdbcExample {@Testpublic void testUpdate() throws Exception {// 获取连接对象Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码// 预编译SQL语句得到PreparedStatement对象PreparedStatement preparedStatement = connection.prepareStatement("UPDATE employee SET salary = ? WHERE id = ?");// 为占位符赋值preparedStatement.setDouble(1, 8888.88);preparedStatement.setInt(2, 6);// 执行更新操作int result = preparedStatement.executeUpdate();// 根据受影响行数,判断操作是否成功if (result > 0) {System.out.println("更新成功");} else {System.out.println("更新失败...");}// 释放资源preparedStatement.close();connection.close();}
}

6.删除

package com.myblog;import java.sql.*;
import org.junit.Test;public class JdbcExample {@Testpublic void testDelete() throws Exception {// 获取连接对象Connection connection = DriverManager.getConnection("jdbc:mysql:///myblog_db", "root", "your_password"); // 请替换为你的数据库密码// 预编译SQL语句得到PreparedStatement对象PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM employee WHERE id = ?");// 为占位符赋值preparedStatement.setInt(1, 6);// 执行删除操作int result = preparedStatement.executeUpdate();// 根据受影响行数,判断操作是否成功if (result > 0) {System.out.println("删除成功");} else {System.out.println("删除失败...");}// 释放资源preparedStatement.close();connection.close();}
}

7.总结

  • 注册驱动:通常通过Class.forName()注册JDBC驱动(这一步可以省略)。
  • 获取连接:通过DriverManager.getConnection()获取数据库连接。
  • 创建PreparedStatement对象:编写SQL语句,使用Connection.prepareStatement()创建PreparedStatement对象。
  • 设置参数:通过setXXX方法为SQL语句中的占位符赋值。
  • 执行操作:通过executeQuery()执行查询操作,通过executeUpdate()执行插入、更新或删除操作。
  • 处理结果:查询操作需要遍历ResultSet对象,处理结果。插入、更新和删除操作通过受影响的行数判断操作是否成功。
  • 释放资源:按顺序关闭ResultSet、PreparedStatement和Connection对象,确保资源不泄露。

二、常见问题

1.资源的管理

        在使用JDBC的相关资源时,比如Connection、PreparedStatement、ResultSet,使用完毕后,要及时关闭这些资源以释放数据库服务器资源和避免内存泄漏是很重要的。

2.SQL语句问题

java.sql.SQLSyntaxErrorException:SQL语句错误异常,一般有几种可能:

  • SQL语句有错误,检查SQL语句!建议SQL语句在SQL工具中测试后再复制到Java程序中!

  • 连接数据库的URL中,数据库名称编写错误,也会报该异常!

3.SQL语句未设置参数问题

java.sql.SQLException:No value specified for parameter 1

在使用预编译SQL语句时,如果有?占位符,要为每一个占位符赋值,否则报该错误!

4.用户名或密码错误问题

java.sql.SQLException: Access denied for user 'root123'@'localhost' (using password: YES)

连接数据库时,如果用户名或密码输入错误,也会报SQLException,容易混淆!所以一定要看清楚异常后面的原因描述

5.通信异常

在连接数据库的URL中,如果IP或端口写错了,会报如下异常:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure


总结

        本篇对JDBC技术的基础增删改查和常见错误进行了汇总,便于理解和运用。部分内容源自网络,如有侵权请联系作者删除,谢谢!

相关文章:

JDBC(2)基础篇2——增删改查及常见问题

目录 一、基于PreparedStatement实现CRUD 1.查询单行单列 2.查询单行多列 3.查询多行多列 4.新增 5.修改 6.删除 7.总结 二、常见问题 1.资源的管理 2.SQL语句问题 3.SQL语句未设置参数问题 4.用户名或密码错误问题 5.通信异常 总结 一、基于PreparedStatement实…...

JVM知识点梳理

目录标题 1.类加载机制1.1 Java 运行时一个类是什么时候被加载的?1.2 JVM 一个类的加载过程?1.3 一个类被初始化的过程?1.4 继承时父子类的初始化顺序是怎样的?1.5 究竟什么是类加载器?1.6 JVM 有哪些类加载器?1.7 JVM 中不同的类加载器加载哪些文件?1.8 JVM 三层类加载…...

产品经理-一份标准需求文档的8个模块(14)

一份标准优秀的产品需求文档包括: ❑ 封面; ❑ 文档修订记录表; ❑ 目录; ❑ 引言; ❑ 产品概述:产品结构图 ❑ 详细需求说明:产品逻辑图、功能与特性简述列表、交互/视觉设计、需求详细描述&am…...

如何用一个例子向10岁小孩解释高并发实时服务的单线程事件循环架构

I/O密集型进程和CPU密集型进程 聊天应用程序、MMO(大型多人在线)游戏、金融交易系统、等实时服务需要处理大量并发流量和实时数据。 这些服务是I/O密集型的,因为它们花费大量资源处理输入输出操作,例如高吞吐量、低延迟网络通信…...

如何为帕金森病患者选择合适的步行辅助设备?

选择步行辅助设备的步骤和建议 为帕金森病患者选择合适的步行辅助设备时,应考虑以下几个关键因素: 患者的具体症状和需求:帕金森病患者的步行困难可能包括冻结步态、平衡能力下降和肌肉僵硬。选择设备时,应考虑这些症状&#xff…...

【排序算法】1.冒泡排序-C语言实现

冒泡排序(Bubble Sort)是最简单和最通用的排序方法,其基本思想是:在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直…...

Unity最新第三方开源插件《Stateful Component》管理中大型项目MonoBehaviour各种序列化字段 ,的高级解决方案

上文提到了UIState, ObjectRefactor等,还提到了远古的NGUI, KBEngine-UI等 这个算是比较新的解决方法吧,但是抽象出来,问题还是这些个问题 所以你就说做游戏是不是先要解决这些问题? 而不是高大上的UiImage,DoozyUI等 Mono管理引用基本用法 ① 添加Stateful Component …...

Spark SQL----INSERT TABLE

Spark SQL----INSERT TABLE 一、描述二、语法三、参数四、例子4.1 Insert Into4.2 Insert Overwrite 一、描述 INSERT语句将新行插入表中或覆盖表中的现有数据。插入的行可以由值表达式指定,也可以由查询结果指定。 二、语法 INSERT [ INTO | OVERWRITE ] [ TABL…...

socket功能定义和一般模型

1. socket的功能定义 socket是为了使两个应用程序间进行数据交换而存在的一种技术,不仅可以使同一个主机上两个应用程序间可以交换数据,而且可以使网络上的不同主机间上的应用程序间进行通信。 2. 图解socket的服务端/客户端模型...

如何在linux中给vim编辑器添加插件

在Linux系统中给Vim编辑器添加插件通常通过插件管理器来完成,以下是一般的步骤: 1.使用插件管理器安装插件 安装插件管理器(如果尚未安装): 常见的插件管理器包括 Vundle、vim-plug 和 Pathogen 等。你可以根据个人喜…...

Web 中POST为什么会发送两次请求

文章目录 前言一、浏览器的重试机制二、跨域请求与预检请求三、表单的自动提交四、服务器配置问题五、前端代码的重复执行六、同源策略与CORS总结 前言 我们在做Web开发时,经常会使用浏览器F12查看请求参数是否正确,但是会发现POST请求,一个地…...

C语言经典程序100案例

C语言经典程序100题(完整版) 【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数都是多少 程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。 #include "stdio…...

南京邮电大学统计学课程实验3 用EXCEL进行方差分析 指导

一、实验描述 实验目的 1、学会在计算机上利用EXCEL进行单因素方差分析; 2、学会在计算机上利用EXCEL进行无重复的双因素方差分析。 二、实验环境 实验中使用以下软件和硬件设备 (1)Windows XP操作系统; (2&am…...

2024-07-13 Unity AI状态机2 —— 项目介绍

文章目录 1 项目介绍2 模块介绍2.1 BaseState2.2 ...State2.2.1 PatrolState2.2.2 ChaseState / AttackState / BackState 2.3 StateMachine2.4 Monster 3 其他功能4 类图 项目借鉴 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 项目介绍 ​ 本项目使用 Unity 2…...

shell脚本-linux如何在脚本中远程到一台linux机器并执行命令

需求:我们需要从11.0.1.17远程到11.0.1.16上执行命令 实现: 1.让11.0.1.17 可以免密登录到11.0.1.16 [rootlocalhost ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created d…...

Spring Data Redis + Redis数据缓存学习笔记

文章目录 1 Redis 入门1.1 简介1.2 Redis服务启动与停止(Windows)1.2.1 服务启动命令1.2.2 客户端连接命令1.2.3 修改Redis配置文件1.2.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍 3. Redis常用命令3.1 字符串操作命令3.2 哈希操作…...

在项目中,如何使用springboot+vue+springsecurity+redis缓存+Axios+MySQL数据库+mybatis

要在项目中使用springbootvuespringsecurityredis缓存AxiosMySQL数据库mybatis,可以按照以下步骤进行操作: 创建一个Spring Boot项目,并添加所需的依赖。在pom.xml文件中添加Spring Boot、Spring Security、Redis、MySQL和MyBatis的依赖项。 …...

微调 Florence-2 - 微软的尖端视觉语言模型

Florence-2 是微软于 2024 年 6 月发布的一个基础视觉语言模型。该模型极具吸引力,因为它尺寸很小 (0.2B 及 0.7B) 且在各种计算机视觉和视觉语言任务上表现出色。 Florence 开箱即用支持多种类型的任务,包括: 看图说话、目标检测、OCR 等等。虽然覆盖面…...

【数据结构】二叉树全攻略,从实现到应用详解

​ 💎所属专栏:数据结构与算法学习 💎 欢迎大家互三:2的n次方_ ​ 🍁1. 树形结构的介绍 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做…...

微信小程序加载动画文件

最近在做微信小程序的动画,调研了几种方案 PAG 腾讯自家的,分为完整版和lite版,对于矢量动画挺好的,但是位图会有问题 完整版会逐渐卡死,lite虽然不会卡死,但是很模糊,优点是动画文件很的很小。…...

[计算机网络] VPN技术

VPN技术 1. 概述 虚拟专用网络(VPN)技术利用互联网服务提供商(ISP)和网络服务提供商(NSP)的网络基础设备,在公用网络中建立专用的数据通信通道。VPN的主要优点包括节约成本和提供安全保障。 优…...

SQL 中的 EXISTS 子句:探究其用途与应用

目录 EXISTS 子句简介语法 EXISTS 与 NOT EXISTSEXISTS 子句的工作原理实际应用场景场景一:筛选存在关联数据的记录场景二:优化查询性能 EXISTS 与其他 SQL 结构的比较EXISTS vs. JOINEXISTS vs. IN 多重 EXISTS 条件在 UPDATE 语句中使用 EXISTS常见问题…...

OpenSearch分析WAF日志

Web应用防火墙(WAF)是保护web应用程序的重要工具,而分析WAF日志可以帮助我们更好地了解安全威胁并优化防护策略。本文将介绍15个使用OpenSearch分析WAF日志的实用例子,涵盖基础统计、安全分析、性能监控等多个方面。 准备工作 在开始之前,请确保: WAF日志已经被发送到OpenSea…...

【前端】零基础学会编写CSS

一、什么是CSS CSS (Cascading Style Sheets,层叠样式表)是一种是一种用来为结构化文档(如 HTML 文档)添加样式(字体、间距和颜色等)的计算机语言,能够对网页中元素位置的排版进行像素级别的精…...

Day07-ES集群加密,kibana的RBAC实战,zookeeper集群搭建,zookeeper基本管理及kafka单点部署实战

Day07-ES集群加密,kibana的RBAC实战,zookeeper集群搭建,zookeeper基本管理及kafka单点部署实战 0、昨日内容回顾:1、基于nginx的反向代理控制访问kibana2、配置ES集群TSL认证:3、配置kibana连接ES集群4、配置filebeat连接ES集群5、配置logsta…...

RK3568 V1.4.0 SDK,USB OTG端子不能被电脑识别出adb设备,解决

修改后的/usr/bin/usbdevice: #!/bin/sh # # Usage: # usbdevice [start|update|stop] # # Hookable stages: # usb_<pre|post>_<init|prepare|start|stop|restart>_hook # <usb function>_<pre|post>_<prepare|start|stop>_hook # # Example …...

如何在 Ubuntu 14.04 服务器上使用 Nginx 安装和保护 phpMyAdmin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 像 MySQL 这样的关系型数据库管理系统在许多网站和应用程序中都是必不可少的。然而&#xff0c;并非所有用户都习惯通过命令行来管…...

redis存入hash,key=>value和key=>(key=>value)使用Python举例

在 Redis 中&#xff0c;HASH 数据结构&#xff08;也称为 HMAP 或 Hash Map&#xff09;允许你存储键值对集合&#xff0c;其中每个键值对都是字段&#xff08;field&#xff09;和值&#xff08;value&#xff09;的映射。在 Python 中&#xff0c;你可以使用 redis-py 库来与…...

Guava LocalCache源码分析:LocalCache的get、put、expand、refresh、remove、clear、cleanUp

Guava LocalCache源码分析&#xff1a;LocalCache的get、put、expand 前言一、get二、put三、expand 前言 上篇文章&#xff0c;详细描写了Guava LocalCache怎样如ConcurrentHashMap对缓存数据进行了分段存储。本章主要针对LocalCache重要的几个接口进行说明。 一、get CanIg…...

linux-arm ubuntu18.04 qmqtt5.12.6 编译部署

安装 qt 查看qt 版本 &#xff1a; qmake -v 下载对应版本 qmqtt 解压下载的mqtt文件 进入qmqtt xxx/src 目录 在qt 安装目录中创建QtMqtt文件夹&#xff0c; &#xff0d; x86平台qt 默认目录为 /usr/include/x86_64-linux-gnu/qt5 &#xff0d; arm平台qt 默认目录为/us…...