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

【MySQL】JDBC编程

MySQL-JDBC编程

文章目录

  • MySQL-JDBC编程
    • Java的数据库编程
    • JDBC工作原理
    • JDBC的使用
      • 驱动包下载导入
      • 代码编写

Java的数据库编程

JDBC,即Java Database Connectivityjava数据库连接。是一种用于执行SQL语句的Java API,它是

Java中的数据库连接规范。这个API由java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问.

通过Java代码操作MySQL数据库;

数据库编程,是需要数据库服务器,提供一些API(Application Programming Interface),应用程序编程接口~

JDBC工作原理

JDBC访问数据库层次结构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

JDBC与数据库关系:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


JDBC的使用

驱动包下载导入

要想在程序中操作mysql就需要你先安装mysql的驱动包.

我们可以在中央仓库下载到驱动包:Maven Repository

  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 因为我装的MySQL是5版本,所以对应驱动包也下载的5版本

    要是你的MySQL版本是8系列,那么驱动包与之对应也是8版本

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 点击此处进行下载

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. 下载完毕,我们在IDEA中导入我们下载的jar,我们先创建一个项目,然后创建一个新目录,一般我们习惯命名lib,然后复制刚才下载的jar文件,导入即可~

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. 最后我们将lib这个目录标记为库,即完成操作

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**注意!**再每次创建一个新工程的时候,我们都需要导入这个jar包~


代码编写

前戏做完🥵🫣,我们可以来开始编写代码噜~

  1. 先创建DataSource

    • 创建DataSource前我们要做的DataSource这个词,它描述“数据源头”,即数据库服务器所在的位置。

      javax.sql.DataSource;是属于jdbc的包~

    而创建DataSource有两种写法:

    • 写法一
    DataSource dataSource  = new MysqlDataSource();
    ((MysqlDataSource) dataSource).setUrl();
    

    这种转型的写法的初心,是为了让MysqlDataSource这个类名不要扩散到代码的其他地方,后续如果要修改数据库为别的数据库,代码改动比较 小.(mysql和我们程序之间的耦合比较低)

    最终目的就是为了能够进一步降低耦合

    • 写法二
    MysqlDataSource mysqlDataSource = new MysqlDataSource();
    mysqlDataSource.setUrl();
    

    这种写法就是简单直观。


    既然提到了耦合,这里我们也详细来看看内聚、耦合。

    • 耦合:两个模块之间的关联关系是不是非常紧密,是不是这边的变化会影响到另外一边

      举个例子:

      假设你和你的朋友计划去旅行,你们决定一起订购机票和酒店。在订购过程中,你和朋友之间存在耦合关系。

      1. 强耦合:如果你们两个人的计划完全相同,你们只考虑彼此的意见,没有进行任何独立的研究和决策,那么你们之间的耦合是强耦合的。这种情况下,你们可能会错过其他更好的机票和酒店选择,因为你们只关心对方的意见,而忽略了其他的选项和可能性。
      2. 弱耦合:如果你和朋友之间保持一定的独立性,各自进行研究和对比,探索不同的机票和酒店选择,并在订购过程中保持一定的自主性,那么你们之间的耦合是弱耦合的。这种情况下,你们会有更多的选择,并能够做出更适合自己的决策

      所以我们写代码的时候,追求的是低耦合~,要是耦合高了,随便改某个代码,可能会引起其他模块出现bug。

    • 内聚:把相同的/相关联的功能,放到一起,内聚就高.零零散散哪里都有,内聚就低.

      举个例子:

      1. 低内聚:好比你在家一直乱放东西,等到要一天你要找你想要的那个东西,你就不得不翻箱倒柜。
      2. 高内聚:反之你平时严格收纳好所有物品,这时候就会很容易找到你想要找的东西。

    因此,综上,我们写代码的目标就是:高内聚,低耦合


    所以这里我们选择写法一,因为它能够降低程序的耦合性,这也让我们的代码更加高效~

    DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&sueSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("123456");
    
    • setUrl:这里的Url指的就是网络上的资源位置,也就是我们平常所说的网址~

    • "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&sueSSL=false":这段Url是给jdbc操作mysql使用的。

      127.0.0.1:指的是IP地址,描述网络上一个主机所在的位置,这里的127.0.0.1是一个特殊的ip地址,叫做“环回ip”(loopback)

      • 由于我们的jdbc程序和mysql服务器都在同一个主机上面,所以我们就使用“环回ip”即可。
      • 所谓“环回”,就是自己把数据发送给自己,虽然有这种专门环回的网线,但是我们也可以通过软件来实现环回的效果~
      • 但是如果我们的数据库服务器和应用程序不在同一主机上,那么此时我们一个写对应主机的ip,而跨主机访问的相关操作需要我们掌握更多的网络原理的知识~
    • test:这里的test就是要访问mysql服务器上的哪个database

    • utf8:这里不能写成utf8mb4,因为这里不是mysql服务器

    • false:这里就是是否要加密了

    • root:管理员mysql默认自带的用户

    • 123456:我不告诉你~

  2. 和数据库服务器建立连接

    Connection connection = dataSource.getConnection();
    

    不过这里会报错

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    这个是jdbc中常见的异常,如果执行sql或者操作数据库过程中出现问题,一般都会抛出这个异常。此时我们只需要引入这个包import java.sql.SQLException;然后throws SQLException即可~

  3. 构造sql语句

    String sql = "insert into student values(1, '张三')";
    PreparedStatement statement = connection.prepareStatement(sql);
    
    • PreparedStatementPrepared :预处理的、Statement:语句

      这里的预处理:先解析检查sql,看看sql是不是有啥问题~~解析完毕之后,也会得到结构化数据,直接把解析好的结构化数据发给数据库服务器,服务器就省下了这部分解析的工作

  4. 将sql发送给服务器,执行sql

    int n = statement.executeUpdate();
    System.out.println("n = " + n);
    

    这里的n其实就对应我们MySQL那里的行数。

  5. 执行完毕之后,最后一个步骤,关闭连接,释放资源

    程序通过代码和服务器进行通信,是需要消耗一定的硬件/软件资源
    在程序结束的时候就需要告知服务器,释放这些资源/客户端也需要释放资源.
    有借有还再借不难.

    statement.close();
    connection.close();
    

总代码:

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;//通过这个代码,往数据库的表中,插入一行记录
public class Demo1 {public static void main(String[] args) throws SQLException {//1.先创建 DataSourceDataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&sueSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("123456");//2.建立和数据库服务器之间的连接,连接好了之后, 才能进行后续的 请求-响应 交互Connection connection = dataSource.getConnection();//3.构造sqlString sql = "insert into student values(1, '杨洋')";PreparedStatement statement = connection.prepareStatement(sql);//4.把sql发送给服务器,返回值是一个整数,表示影响到的行数int n = statement.executeUpdate();System.out.println("n = " + n);//5.释放资源,关闭连接,释放顺序,是获取到的资源先释放statement.close();connection.close();}
}

执行效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是我们表里目前的数据,下面我们Java代码操作数据库~

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时我们再看表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


不过这里我们需要注意的是,修改和删除的代码写法和插入是非常类似的~

只要调整sql内容即可~

String sql = "delete from student where id = 1 ";
String sql = "update student set name = '张三' where id = 100";

这里抛出个问题,我们上述的语句是写死的,那么我们怎么在程序运行时输入id ,name,来进行插入?

如下:

Scanner scanner = new Scanner(System.in);System.out.println("请输入学号:>");int id = scanner.nextInt();System.out.println("请输入姓名:>");String name = scanner.next();
String sql = "insert into student values(" + id + ",'"+ name +"')";

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这种写法不优雅,也不安全,可能会导致sql注入攻击

要是在这个语句中把name,写成以下这样子:

'); drop database xxx;

阁下应该怎么应对呢?看我把你的库都删完了~🥵🥵🥵🥵

所以我们推荐以下这种写法:

String sql = "insert into student values(?,?)";

使用作为占用符~

String sql = "insert into student values(?,?)";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);statement.setString(2,name);

针对占用符进行替换~

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


查询:

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;//jdbc 查询写法
public class Demo2 {public static void main(String[] args) throws SQLException {//1. 创建DataSourceDataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&sueSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("123456");//2. 建立连接Connection connection = dataSource.getConnection();//3.构造sqlString sql = "select * from student";PreparedStatement statement = connection.prepareStatement(sql);//4.执行sql//ResultSet 表示查询的结果集合(临时表)此处就需要针对这个表进行遍历ResultSet resultSet = statement.executeQuery();//resultSet提供了getXXX方法.(列是啥类型,就使用哪个方法)根据列名就可以取出对应的值了.//5.遍历 结果集合//通过 next 代码,就可以获得临时表中的每一行数据,如果获取到最后一行,再执行 next 返回 false 循环结束while (resultSet.next()){// 针对这一行进行处理了// 取出列的数据int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = " + id +", name = "+name);}//6.释放资源resultSet.close();statement.close();connection.close();}
}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


相关文章:

【MySQL】JDBC编程

MySQL-JDBC编程 文章目录 MySQL-JDBC编程Java的数据库编程JDBC工作原理JDBC的使用驱动包下载导入代码编写 Java的数据库编程 JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是 Java中的数据库连接…...

数据结构——二叉树线索化遍历(前中后序遍历)

二叉树线索化 线索化概念: 为什么要转换为线索化 二叉树线索化是一种将普通二叉树转换为具有特殊线索(指向前驱和后继节点)的二叉树的过程。这种线索化的目的是为了提高对二叉树的遍历效率,特别是在不使用递归或栈的情况下进行遍历…...

GO语言网络编程(并发编程)Channel

GO语言网络编程(并发编程)Channel 1、Channel 1.1.1 Channel 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态…...

c++day3

stack.h #ifndef STACK_H #define STACK_H #include <iostream> //#define max 128 using namespace std; class Stack { private:int* stack;//数组指针int top;//栈顶元素int max;//栈容量 public://构造函数Stack();//析构函数~Stack();//定义拷贝构造函数Stack(cons…...

算法通过村第六关-树青铜笔记|中序后序

文章目录 前言1. 树的常见概念2. 树的性质3. 树的定义与存储方式4. 树的遍历方式5. 通过序列构建二叉树5.1 前中序列恢复二叉树5.2 中后序列恢复二叉树 总结 前言 提示&#xff1a;瑞秋是个小甜心&#xff0c;她只喜欢被爱&#xff0c;不懂的去爱人。 --几米《你们 我们 他们》…...

C++动态内存管理+模板

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…...

SQL 注入漏洞攻击

文章目录 1. 介绍2. 无密码登录3. 无用户名无密码登录4. 合并表获取用户名密码 1. 介绍 假设你用自己的用户名和密码登录了一个付费网站&#xff0c;网站服务器就会查询一下你是不是 VIP 用户&#xff0c;而用户数据都是放在数据库中的&#xff0c;服务器通常都会向数据库进行查…...

一篇五分生信临床模型预测文章代码复现——Figure 10.机制及肿瘤免疫浸润(四)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…...

Transformer 模型中常见的特殊符号

Transformer 模型中常见的特殊符号 通过代码一起理解一下 Transformer 模型中常见的特殊符号&#xff0c; 示例代码&#xff0c; special_tokens{unk_token: [UNK], sep_token: [SEP], pad_token: [PAD], cls_token: [CLS], mask_token: [MASK]}这段代码是定义了一个字典spec…...

C# halcon SubImage的使用

SubImage(HObject imageMinuend, HObject imageSubtrahend, out HObject imageSub, HTuple mult, HTuple add) 公式 x1imageMinuend此行此列的灰度 x2imageSubtrahend此行此列的灰度 则imageSub此行此列的灰度为;(x1-x2)*multadd 溢出裁剪 以byte图为例&#xff0c;小于0&a…...

每天几道Java面试题:异常机制(第三天)

目录 第三幕、第一场&#xff09;异常机制面试题 友情提醒 背面试题很枯燥&#xff0c;加入一些戏剧场景故事人物来加深记忆。PS:点击文章目录可直接跳转到文章指定位置。 第三幕、 第一场&#xff09;异常机制面试题 【面试官老吉&#xff0c;面试官潘安&#xff0c;面试者…...

Linux 中的 chattr 命令及示例

Linux 中的chattr命令是一个文件系统命令,用于更改目录中文件的属性。该命令的主要用途是使多个文件无法被超级用户以外的用户更改。管理员表示,众所周知,Linux 是一个多用户操作系统,一个用户有可能删除另一个用户非常关心的文件。为了避免这种情况,Linux 提供了“ chatt…...

LeetCode 2605. Form Smallest Number From Two Digit Arrays【数组,哈希表,枚举;位运算】1241

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

VoxWeekly|The Sandbox 生态周报|20230904

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布&#xff0c;对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容&#xff0c;欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter&#xff0c;并加入 Discord 社区&#xf…...

antd setFieldsValue 设置初始值无效AutoComplete 设置默认值失败

antd form setFieldsValue 设置初始值无效 解决方案 setTimeout(()>{setFieldsValue(values)},100)antd AutoComplete 设置默认值失败 defaultValue 设置无效 解决方案 设置value&#xff0c;搭配onChange来设置修改...

01-Redis核心数据结构与高性能原理

上一篇&#xff1a; 1.Redis安装 下载地址&#xff1a;http://redis.io/download 安装步骤&#xff1a; # 安装gcc yum install gcc# 把下载好的redis-5.0.3.tar.gz放在/usr/local文件夹下&#xff0c;并解压 wget http://download.redis.io/releases/redis-5.0.3.tar.gz…...

预防Dos攻击

Dos----拒绝服务攻击&#xff0c;一般是构造特殊的输入&#xff0c;使得后台的处理耗时远超正常水平&#xff0c;随着请求越来越多&#xff0c;后台服务越发疲于奔命&#xff0c;最后因资源耗尽&#xff0c;无法再接受新的请求&#xff0c;最终造成拒绝服务的效果。 特殊输入例…...

ant design的文档真的是一坨屎

很多基础设置 高傲的写都不写 要自己去index.d.ts里查 这就算了&#xff0c;为什么还有错的。。。。。 即使因为版本号而不同&#xff0c;起码把差异说明一下吧&#xff0c;直接丢个错的什么意思&#xff0c;。。。。。。。。 没点子功夫还真用不了 文档 进度条 Progress -…...

关于迁移学习的一点理解

举个栗子&#xff0c;老虎图片的数量非常少&#xff0c;可以让网络先学会识别猫的图片 1、预训练模型 内容&#xff1a;利用在 ImageNet1000 数据集训练好的模型&#xff0c;将所需的模型参数下载&#xff0c;嵌入到对应的网络架构中&#xff0c;使用对预训练模型的搭建。目前P…...

【力扣周赛】第 361 场周赛(⭐前缀和+哈希表 树上倍增、LCA⭐)

文章目录 竞赛链接Q1&#xff1a;7020. 统计对称整数的数目竞赛时代码——枚举预处理 Q2&#xff1a;8040. 生成特殊数字的最少操作&#xff08;倒序遍历、贪心&#xff09;竞赛时代码——检查0、00、25、50、75 Q3&#xff1a;2845. 统计趣味子数组的数目竞赛时代码——前缀和…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...