【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();}
}

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


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

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

相关文章

DELL 台式机的内置扬声器如何关闭

DELL 台式机的内置扬声器如何关闭? 点“开始”——控制面板——高清晰音频管理器——右上角“设备高级设置”——“播放设备”——点击“使前部和后部设备播放不同的音频流”前面的小方框——“确认”。ok了。

初识网络的发展史、通信基础和原理

目录 一.网络的发展史 二.网络通信基础 2.1IP地址 2.2端口号 2.3认识协议 2.3.1协议是什么? 2.3.2为什么需要协议? 2.3.3OSI模型和TCP/IP体系结构 三.网络通信的原理 总结 🎁个人主页:tq02的博客_CSDN博客-C语言,Java,J…

R730xd风扇调速

共使用了三个方法都是有效的,dell_fans_controller_v1.0.0和Dell_EMC_Fans_Controller_1.0.1以及ipmitool,前面两个是GUI界面后面一个是命令行工具 重点 我虽然能通过设置的ip地址能访问idrac管理界面,但是使用上面三个工具都是无法获取风扇…

Mybatis-Plus 批量插入数据时报错 java.lang.Object Not Found TableInfoCache

文章目录 前言问题回溯排查过程总结 前言 报错堆栈信息如下,基本是mybatis-plus源码中的一些东西: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: java.lang.Object Not Found TableInfoCache.at com.baomidou.mybatisplus.core.to…

REST风格【SpringBoot】

1.REST简介 行为动作 通常模块名使用复数,也就是加s 2.RESTful入门 Controller public class UserController {RequestMapping(value "/users", method RequestMethod.POST)public String save() {System.out.println("user save");return &…

ClickHouse进阶(十二):Clickhouse数据字典-2-字典类型

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_大数据OLAP体系技术栈,Apache Doris,Kerberos安全认证-CSDN博客 📌订阅…

英码深元“三位一体”AI场景化解决方案,助力多地化工园区快速实现智慧化转型!

我国是世界公认的化工大国,同时也是崛起中的化工强国。近年来多起重大爆炸事故暴露出我国化工园区安全问题突出,特别是在安全风险管控数字化转型、智能化升级方面存在明显短板和不足,尤其突出的痛点:化工园区的日常管理方式较为粗…

电子烟行业常用的英文表达

1. 电子烟的各种表达 a) 电子烟 i. Electronic-cigarette, ii. Electronic smoke, iii. electronic cigarettes iv. Electric cigarette, v. E-Cigarettes vi. e-cigarette, vii. e-Cig viii. E cigar,e-cigar 电子烟雪茄 2. 电子烟特指词汇及衍生 a) VAPE i. Vapo…

【Git】Git 分支

Git 分支 1.分支简介 为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。 或许你还记得 起步 的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。 在进行提交操作时,Git 会保存一…

Scrum工作模式的角色和活动

​Scrum工作模式是一种敏捷软件开发方法,其核心是团队合作和自我组织,旨在通过短周期的迭代开发,实现快速反馈和持续改进。 Scrum工作模式包括以下角色和活动: 1、产品负责人(Product Owner):…

Oracle(1):Oracle简介

1 什么是 ORACLE ORACLE 数据库系统是美国 ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S 体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORACLE 数据…

ICC2: ICG clone与ICG merge

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 默认情况下,initial_place阶段或者在spg flow的initial_opt阶段工具会自动merge clock gating cell。但是如果在place_opt之前使用merge_clock_gates命令了,place阶段就不会再merge clock gate了。…

maven管理android项目

maven管理android项目 1.安装maven-android-sdk-deployer,下载地址:https://github.com/mosabua/maven-android-sdk-deployer 2.解压缩大英文路径文件夹 3.在压缩后的根目录执行mvn clean install -P 2.3.3(2.3.3指的是android版本号&#x…

赋能人工智能:Kubeflow VMware Distribution的发布

在最近结束的 VMware Explore 2023 拉斯维加斯大会上,VMware 推出了新的 Private AI 产品,以促进企业采用生成式人工智能并挖掘可信数据的价值。VMware 宣布了以下几点: 与 NVIDIA 合作推出 VMware Private AI Foundation,将两家…

安装 paddlepaddle paddleocr库,避坑指南

看到这个库我就头疼,因为换了电脑,不得不再来一遍,又是到处踩坑!拼了好几个小时,总结出来的最终解决方法!详细的傻瓜式解决! - import paddle 报错!illegal hardware instruction py…

Linux 内核 6.5 发布,首次支持 Wi-Fi 7 和 USB4

导读Linux 6.5 内核 已经推出,此次更新在 Linux 6.4 内核的基础上进行了进一步的开发,带来了值得注意的改变和新特性。 Linus Torvalds 表示,这是一次相对顺畅的发布: 上周并没有发生任何异常或惊人的事情,因此没有理…

数据预处理之数据缩放

一、介绍 ​ 在实践中,同一个数据集合中经常包含不同类别的变量。一个很大的问题是这些变量的值域可能大不相同。如果使用原值域将会使得值域大的变量被赋予更多的权重。针对这个问题,我们需要在数据预处理时对自变量或特征使用缩放的方法。特征缩放的目…

【运维 Pro】时序场景实践与原理 - 1. 分布与分区

【运维 Pro】: 是由 YMatrix 售前和售后团队负责的栏目。除了介绍日常的数据库运维和使用知识,我们更希望能够通过介绍这些知识背后的原理,让大家和我们一起感知数据库的美妙。 摘要 有别于其它场景,时序场景中的数据、查询都有着更为明显的…

Scrum敏捷开发流程及敏捷研发关键环节

Scrum是一个迭代式增量软件开发过程,是敏捷方法论中的重要框架之一。它通常用于敏捷软件开发,包括了一系列实践和预定义角色的过程骨架。Scrum中的主要角色包括Scrum主管(Scrum Master)、产品负责人(Product Owner&…

坚果投影人事地震:IPO之前,创始人被投资人踢出公司

大数据产业创新服务媒体 ——聚焦数据 改变商业 一份流传于网络的《董事会函件》以及一张微信截图显示,智能投影行业市占率第二的坚果投影8月28日发生人事地震,公司创始人胡震宇被董事会罢免董事长一职,由资方代表连萌担任临时董事长一职。 …