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

MySQL数据库——JDBC编程

文章目录

  • 一、什么是Java的JDBC
  • 二、JDBC编程
  • 三、代码整体展示

一、什么是Java的JDBC

JDBC,即Java Database Connectivity。意思是java数据库连接。是一种用来执行 SQL 语句的 JavaAPI,是Java中数据库的连接规范。这个 API 由 java.sql* 和 javax.sql* 包中的类和接口组成,可以为多种关系数据库提供统一访问。

JDBC的工作原理
在这里插入图片描述
JDBC优势:

  • JAVA语言访问数据库操作完全面向抽象类接口编程。
  • 开发数据库应用不用限定在特定的数据库厂商的 API。
  • 程序的可移植性大大增强。

二、JDBC编程

  1. 编程前准备
    前面我们知道,要进行 JDBC 编程需要使用 JavaAPI 和数据库进行连接。所以在进行编程之前需要先导入相应的 .jar 包。如下图所示:
    (本人这里使用的是 idea 编译器)
    在这里插入图片描述
    经过上面操作就可以进行编程了。

  2. 代码实现

  • 创建 DateSource 数据库,描述 mysql 在什么位置
        DataSource dataSource = new MysqlDataSource();//设置数据库所在的位置,端口以及数据库名((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");

在这里插入图片描述
注: 如上图所示,这里是一个向下转型,在后续的代码中使用的是 DataSource 类型的实例。

上面的四行代码,我们最需要注意的是第二句,如图:
在这里插入图片描述
这里的 IP 地址在解释一下:我们各自电脑的 IP 地址可能不同,但在这里统一写作 127.0.0.1。这是一个特殊的 IP 地址,叫做 “环回IP” 表示主机自己。只要数据库服务器和 JDBC 程序在同一个电脑,就可以使用这个 IP 地址。

在这里插入图片描述

  • 和数据库建立连接
        Connection connection = dataSource.getConnection();//通过控制台来输入信息Scanner scanner = new Scanner(System.in);System.out.println("请输入学号:");int id = scanner.nextInt();System.out.println("请输入姓名:");String name = scanner.next();

在这里插入图片描述
如图所示,这里的 connection 选择划红线的呢一个。

  • 构造 sql 语句

这里的构造有两种方式

第一种:直接使用字符串语句录入

        String sql = "insert into student values("+ id +",'"+ name + "')";//jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况PreparedStatement statement = connection.prepareStatement(sql);

这种形式的代码比较难以阅读,不好理解。此外,这个代码也是比较容易引起“SQL 注入攻击”
这也是一种入侵服务器的方式,假设输入name时这样操作:"); drop table … 这样就会删除后面的内容,造成很大的影响。

第二种:使用 PreparedStatement 通过占位符替换的方式,来实现动态 sql 构造。

        String sql = "insert into student values(?,?)";//jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);System.out.println("sql:" + statement);

上述的形式相对而言更加靠谱,需要注意的是,上面(?,?) 这个地方不是从 0 开始,而是从 1 开始计算。

注意,这里要选择红框中的这个关键字。
在这里插入图片描述

  • 执行SQL

使用 executeUpdate 执行增删改

        //4. 执行 sql,针对 增,删,改,使用 executeUpdate 来执行//               查,使用 executeQuery 来执行// 这里返回的含义是,这里的操作影响了几行int ret = (int) statement.executeLargeUpdate();System.out.println("ret = " + ret);

使用 executeQuery 执行查
注:这里的查操作存在于单独的一个类中

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCSelectDemo {public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("wjh123456");Connection connection = dataSource.getConnection();String sql = "select*from student";PreparedStatement statement = connection.prepareStatement(sql);//实现查操作ResultSet resultSet = statement.executeQuery();while(resultSet.next()){//next 相当于移动一下光标,光标指向下一行//获取到每一列int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id + ":"+ name);}//释放资源resultSet.close();statement.close();connection.close();}
}

在这里插入图片描述
如图所示,光标所指的位置就是数据表的第一行,每次读取后向下移动一个。

  • 释放资源
        statement.close();connection.close();

这里要注意的是,我们先连接(connection)了数据库再构造了(statement)对象。但是这里的顺序为什么要先关闭 statement 在关闭 connection?

如图所示:
在这里插入图片描述
这里要进入家中顺序是:大门 -> 二门
出家门的顺序是:二门 -> 大门
所以不难理解,这里的关闭顺序是:先创建后关闭。

三、代码整体展示

实现增删改操作的代码

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;public class JDBCinsertDemo {public static void main(String[] args) throws SQLException {//实现 JDBC 编程的步骤//1. 先创建 DataSource 数据库,描述了 mysql 在哪DataSource dataSource = new MysqlDataSource();//设置数据库所在的位置,端口以及数据库名((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("wjh123456");//2. 和数据库建立连接Connection connection = dataSource.getConnection();//通过控制台来输入信息Scanner scanner = new Scanner(System.in);System.out.println("请输入学号:");int id = scanner.nextInt();System.out.println("请输入姓名:");String name = scanner.next();//3. 构造 sql 语句//不安全//String sql = "insert into student values("+ id +",'"+ name + "')";String sql = "insert into student values(?,?)";//jdbc 中需要搭配一个特定的对象,来描述这里 sql 的情况PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);System.out.println("sql:" + statement);//4. 执行 sql,针对 增,删,改,使用 executeUpdate 来执行//               查,使用 executeQuery 来执行// 这里返回的含义是,这里的操作影响了几行int ret = (int) statement.executeLargeUpdate();System.out.println("ret = " + ret);//5. 断开连接,释放资源statement.close();connection.close();}
}

运行展示:
添加元素前:
在这里插入图片描述
添加元素:
在这里插入图片描述
在这里插入图片描述
注:这里的删除,修改操作只需要修改 sql后的语句即可。
要注意的仍然是针对 增,删,改,使用 executeUpdate 来执行。

实现查找操作的代码

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCSelectDemo {public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/JDBCtest?characterEncoding=utf-8&useSSl=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("wjh123456");Connection connection = dataSource.getConnection();String sql = "select*from student";PreparedStatement statement = connection.prepareStatement(sql);ResultSet resultSet = statement.executeQuery();while(resultSet.next()){//next 相当于移动一下光标,光标指向下一行//获取到每一列int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id + ":"+ name);}//释放资源resultSet.close();statement.close();connection.close();}
}

运行结果:
在这里插入图片描述
与添加的元素情况一致,查找成功!

相关文章:

MySQL数据库——JDBC编程

文章目录一、什么是Java的JDBC二、JDBC编程三、代码整体展示一、什么是Java的JDBC JDBC,即Java Database Connectivity。意思是java数据库连接。是一种用来执行 SQL 语句的 JavaAPI,是Java中数据库的连接规范。这个 API 由 java.sql* 和 javax.sql* 包中…...

【面向小白】你见过这样讲解队列的吗?(阅此文可学会用纯C手撕一个队列)

目录 0.前言 1.什么是队列 2.选择什么结构实现队列 3.用C语言实现队列 3.1用什么可以封装代表一个队列 3.2队列接口的设计 3.3 队列的初始化 3.4 队列的销毁 3.5* 队列的状态分析 3.6 队列的插入 3.7 队列的删除 3.8 队列的大小(有效元素的数目&#xff…...

[element plus] 对话框组件再封装使用 - vue

学习关键语句: 饿了么组件dialog组件使用 dialog组件二次封装 vue3中封住的组件使用update触发更新 vue3中封装组件使用v-model:属性值来传值 写在前面 这是我遇到的一个页面需求 , 其中一个对话框的内容是很常用的 , 所以我将它封装出来才写的一篇文章 现在给出如下需求: 封…...

Markdown基本语法简介

前言:当你在git平台创建一个仓库时,平台会自动创建一个README.md文件,并将它的内容展现在web端页面,方面其他读者查阅。README.md实则是一个适用Markdown语法的文本文件,从他的后缀md即可看出它是Markdown的缩写。在gi…...

分布式服务的接口幂等性如何设计

1.1 概述 所谓幂等: 多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。 基于RESTful API的角度对部分常见类型请求的幂等性特点进行分析 举个例子: 假如你有个某多多 有个服务 服务提供一个接口,结果这个服务部署在…...

视频流截取保存到本地路径(打包jar包CMD运行)

需求:现在有一批https的监控视频流URL,需要对视频流进行每三秒截屏一次,并保存到本地路径,png格式,以当前时间命名。代码:import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Fra…...

mysql索引失效的几种情况

失效的几种情况 1、select * from xxx 2、索引列上有计算 3、索引列上有函数 4、like左边包含‘%’ 5、使用or关键字 6、not in和not exists 7、order by 8、不满足最左匹配原则 给code、age和name这3个字段建好联合索引:idx_code_age_name。 该索引字段的顺…...

Windows下载安装Redis的详细步骤

目录 一、概述 1.redis的版本维护介绍 2.msi安装包和压缩包的优点和缺点 二、操作步骤 三、测试是否安装成功(查看版本) 四、获取资源 一、概述 1.redis的版本维护介绍 Redis的官网只提供Linux系统的下载。但是微软的技术团队长期开发和维护着这…...

【蓝桥杯每日一题】差分算法

🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙我与杀戮之中绽放,亦如黎明的花…...

MyBatis Plus 数据库字段加密处理

目录1.场景介绍2.Maven依赖2.AESUtil.java 加解密工具类3.字段处理类4.修改 MyBatis Plus 查询4.1 修改表对应实体类4.2 修改加密字段对应属性4.3 修改 xml 使用 ResultMap4.4 修改 xml 中 el 表达式5.测试结果6.MyBatis Plus 缺陷补充:测试实例1 查询测试1.1 查询信…...

openpose在win下环境配置

1.下载OpenPose库 以下二选一进行下载源码 (1)git进行下载 打开GitHub Desktop或者Powershell git clone https://github.com/CMU-Perceptual-Computing-Lab/openpose cd openpose/ git submodule update --init --recursive --remote(2)在github上手动下载 由于下载环境问…...

【剑指offer-C++】JZ16:数值的整数次方

【剑指offer】JZ16:数值的整数次方题目描述解题思路题目描述 描述:实现函数 double Power(double base, int exponent),求base的exponent次方。 注意: 1.保证base和exponent不同时为0。 2.不得使用库函数,同时不需要…...

了解Axios及其运用方式

Axios简介 axios框架全称(ajax – I/O – system): 基于promise用于浏览器和node.js的http客户端,因此可以使用Promise API 一、axios是干啥的 说到axios我们就不得不说下Ajax。在旧浏览器页面在向服务器请求数据时,…...

【LeetCode】剑指 Offer(7)

目录 写在前面: 题目剑指 Offer 17. 打印从1到最大的n位数 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 18. 删除链表的节…...

Python:try except 异常处理整理

目录 一、try except异常处理的语句格式 二、获取相关异常信息 (1)sys.exec_info() 三、traceback模块的常用方式 (1)traceback.print_tb(tb, limitNone, fileNone) 打印指定堆栈异常信息 (2)tracebac…...

Redis Lua脚本的详细介绍以及使用入门

Redis Lua脚本的详细介绍以及使用入门。 文章目录Redis Lua脚本的引入开源软件的可扩展性Redis的扩展性脚本Redis Lua脚本的基本使用通过EVAL命令执行Lua脚本通过脚本与Redis交互Java中调用Redis Lua脚本Java调用Lua脚本的方式Redis Lua脚本的使用建议脚本缓存脚本缓存稳定性脚…...

synchronized和ReentrantLock有什么区别呢?

第15讲 | synchronized和ReentrantLock有什么区别呢? 从今天开始,我们将进入 Java 并发学习阶段。软件并发已经成为现代软件开发的基础能力,而 Java 精心设计的高效并发机制,正是构建大规模应用的基础之一,所以考察并发…...

SVHN数据集下载及使用方法

街景门牌号数据集(SVHN),这是一个现实世界数据集,用于开发目标检测算法。它需要最少的数据预处理过程。它与 MNIST 数据集有些类似,但是有着更多的标注数据(超过 600,000 张图像)。这些数据是从…...

产业安全公开课:2023年DDoS攻击趋势研判与企业防护新思路

2023年,全球数字化正在加速发展,网络安全是数字化发展的重要保障。与此同时,网络威胁日益加剧。其中,DDoS攻击作为网络安全的主要威胁之一,呈现出连年增长的态势,给企业业务稳定带来巨大挑战。2月21日&…...

Docker 容器命令 和安装各种镜像环境

CentOS安装Docker 1.1.卸载(可选) 如果之前安装过旧版本的Docker,可以使用下面命令卸载: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotat…...

我用AI替换了高级工程师,结果...

周二下午 2:47,我们的 CFO 在 Slack 上发了一条消息。 “你团队的年薪是 120 万美元。我们能谈谈优化吗?” 我知道要发生什么了。我们刚刚完成了 A 轮融资。风投想要"运营效率"。翻译:削减成本、更快交付、展示增长。 我们的高级…...

散点图进阶玩法:用颜色+大小+形状同时展示5个维度数据

散点图进阶玩法:用颜色大小形状同时展示5个维度数据 当我们需要在单一图表中呈现复杂的数据关系时,传统的二维散点图往往显得力不从心。本文将带你探索如何通过颜色映射、气泡大小调整和形状区分等技巧,在散点图中同时展示多达五个维度的数据…...

基于Django REST framework的共享充电桩后台管理系统架构设计与实现

1. 为什么选择Django REST framework构建充电桩后台 第一次接触共享充电桩项目时,我对比了Node.js、Spring Boot和Django三个技术栈。最终选择Django REST framework(DRF)的原因很实在——它用30%的代码量就能实现其他框架80%的功能。特别是在…...

【2026最新】AIGC率从60%降至5%只需零成本?10款免费工具实测红黑榜,一键解锁知网自救通关

四月一到,查重和AIGC检测成了两座大山。 自己熬夜敲的字被判AI生成,或者润色后满篇通红,这绝望感谁懂? 为了搞定论文降aigc这个大坑,我拿手头几篇废稿,去市面上热门的10款降ai率工具滚了一圈。今天这篇吐…...

告别手算!用Matlab快速搞定高斯光束的ABCD矩阵(附常用光学系统代码)

用Matlab高效构建光学系统:高斯光束ABCD矩阵实战指南 光学仿真工程师们常常面临一个困境:理论推导严谨但繁琐,手动计算容易出错且效率低下。特别是在处理复杂光学系统时,反复验证ABCD矩阵的正确性会消耗大量时间。本文将分享一套经…...

基于51单片机的智能鱼缸设计:STC12C5A60S2为核心的多功能控制系统

基于51单片机的智能鱼缸设计。 有原理图,程序,原文 才用STC12C5A60S2,最新款国产51单片机。 本系统设计的主要是基于单片机为核心,设计一款集温度检测、恒温控制、步进电机控制、继电器控制、矩阵键盘设计于一身的智能鱼缸控制系统…...

oicq 高级技巧:如何构建企业级 QQ 机器人应用架构

oicq 高级技巧:如何构建企业级 QQ 机器人应用架构 【免费下载链接】oicq Tencent QQ Bot Library for Node.js 项目地址: https://gitcode.com/gh_mirrors/oi/oicq oicq 是一个基于 Node.js 的 QQ 协议库,专为构建稳定、高效的 QQ 机器人应用而设…...

深入芯片布线底层:聊聊ICC II里那些容易被忽略的“小”设置,比如Secondary PG、Via Ladder和天线效应

深入芯片布线底层:ICC II中那些影响性能与良率的隐藏配置 在芯片物理实现的最后阶段,布线工程师往往将注意力集中在时序收敛和DRC修复上,却容易忽略工具中那些看似次要却实际影响深远的配置项。本文将聚焦ICC II布线流程中四个关键但常被低估…...

实战指南:基于快马平台开发在线教育vc16188视频交互系统

实战指南:基于快马平台开发在线教育vc16188视频交互系统 最近在做一个在线教育项目,需要实现视频课程的智能分段和交互功能。经过一番摸索,发现用InsCode(快马)平台可以快速搭建这样一个系统。下面分享下我的实战经验。 系统架构设计 前端部…...

AI辅助开yun架构设计:让快马平台智能生成弹性可扩展的服务代码

在云原生架构设计中,弹性伸缩和容错能力是应对高并发场景的核心需求。最近我在设计一个秒杀系统的商品查询服务时,深刻体会到AI辅助开发带来的效率提升。下面分享如何通过智能工具快速实现关键功能模块。 业务逻辑接口设计要点 商品查询服务作为秒杀系统…...