【MySQL系列】Java的JDBC编程

news2024/11/18 22:30:10

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 目录

  • 文章目录

    前言

    一、JCBD背景知识引入

    二、安装MySQL数据库驱动包,并且导入到项目中

    三、JDBC的使用

  • 3.1 JDBC插入数据操作

    3.2 JDBC修改数据操作

    3.3 JDBC删除数据操作

    3.4 JDBC查找数据操作

    总结



前言

本节内容我们将进入到有关MySQL的JDBC操作当中,此内容对我们非常重要,对于MySQL的后续学习有着十分重要的作用,今天就让我们走进JCBD的学习。让我对MySQL有着更加深刻的认识和学习。

一、JCBD背景知识引入

MySQL是一个 客户端/服务器 结构的程序;当然,不是所有的数据库都是这样的(SQLite就不是,Oracle、SQL Server是)

像主流的数据库,为了方便程序员实现 客户端 程序,会提供一些 API接口,称为 "数据库SDK",就可以借助这些 API接口,比较方便的访问数据库服务器

API,是计算机中一个相当广泛使用的术语,Application Programming Interface ,提供了一些 函数/方法/类,可以让程序员直接调用来完成一些功能

 SDK,也是一个相当广泛使用的术语,Software Development Kit,软件开发工具包,提供了一些工具

比如说,张三同学有了一个女朋友,那么此时女朋友可以给张三提供一些API,如 日常拉拉小手,日常抱一抱就类似于,数据库服务器给我们提供了一些API,比如说 可以调用这个函数 连接到数据库;调用这个函数 执行一些SQL操作;调用这个函数 来关闭连接;调用这个函数,来创建一个事务;

现在这里就引入了一个问题:

API 是数据库提供的,而不同的数据库,提供的 API 风格(里面的类名、方法名、参数/返回值 等都不同)可能不一样,那怎么办??

于是,Java 提出了一套 "标准"的接口体系(毕竟,也不会找数据库本身的);让这些数据库厂商,提供的API都往 Java 的这套接口体系中进行适配

程序员只要去掌握 Java 的这一套 API 即可适应所有的主流数据库了

当然,其他大多数主流编程语言,也有类似的操作;

主流数据库,都会有多语言支持,现在,咱们说的是 Java,而Java所提供的这套API,就叫做 JDBC

而各个数据库厂商,为了能够适配 JDBC,因此就需要写一些额外的程序 来完成这个工作,厂商提供的这套额外的程序,称为 "JDBC驱动包"

当我们使用Java操作MySQL的时候,就需要去安装MySQL的驱动包;

当我们使用Java操作各种数据库,就需要安装对应的 数据库所提供的驱动包,才能真正进行使用~

JDBC 本质上就是 Java对于各种数据库差异性的封装;

目的就是为了简化程序员的学习使用成本;

 二、安装MySQL数据库驱动包,并且导入到项目中

详细转至链接:https://blog.csdn.net/qq_53362595/article/details/125947149

三、JDBC的使用

3.1 JDBC插入数据操作

由于MySQL是一个服务器,要想和服务器之间进行通信,前提是需要和 服务器之间进行连接;

要想和服务器之间建立连接,前提是需要知道服务器所在的位置

第一个环节:

在JDBC里面,使用 DataSource 这个类来描述数据库的位置:

DataSource dataSource = new MysqlDataSource();
 
--DataSource 是一个 interface,不能直接实例化~~
--而 MysqlDataSource 则是实现了 DataSource接口~~
 
--实际上,这个操作,就是 "向上转型"~~

注意:这个类来自于驱动包,如果驱动包导入正确,才能够顺利的提示出来;

通过 DataSource 来确定服务器的位置~~位置如何描述?

描述一个网络上的资源,常用手段 就是使用 URL(唯一资源定位符/网址)

((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");
 
--((MysqlDataSource)dataSource).setUrl();
--这是一个向下转型
 
--其中,
 
--jdbc:mysql 是协议名,即 这个网址是干啥用的(这个网址就是 jdbc 连 mysql用)
 
--127.0.0.1 是IP地址(互联网上的主机的IP地址,是通过一串的数字的形式来描述的)
 
--3306 是端口号(用于区别 当前主机上的哪个程序,MySQL服务器默认使用的端口号是 3306)
 
--java 是数据库名,就是 create database 数据库名,访问的是MySQL数据库上面的哪一个数据库
 
--characterEncoding=utf8&useSSL=false 是一些相关参数,
--characterEncoding=utf8 是设置客户端连接服务器使用的字符集
--useSSL=false 固定设为false,表示不启用加密

注意:

像上述URL,大家不必去背!!!背,容易背错!!!写了一次之后,后续只要去复制粘贴即可!!! 

同时,需要设置用户名以及密码:

//设置用户名 是固定的 root
((MysqlDataSource)dataSource).setUser("root");
 
//设置密码 不是固定的,是自己的数据库密码
((MysqlDataSource)dataSource).setPassword("111111");
 以上操作,就可以准确的描述服务器的位置

网络通信中,有两种风格:

一种是 "有连接",相当于 "打电话" (接通电话过后,才可进行聊天)

一种是 "无连接",相当于 "发微信" (编辑信息后,爱看不看,信息都已经发过去了)

数据库这里的通信方式,采取的是有连接的方式~

优点:能够在通信之前,知道通信的链路是否通畅

缺点:连接需要进行管理,尤其是不用的连接要及时释放(想像 打完电话要挂断,否则扣你话费)

第二个环节:

和数据库服务器建立连接:

Connection connection = dataSource.getConnection();

啥时候会出现异常:和数据库服务连接失败

Alt + Enter,出现 解决方案

 

如果连接失败,失败的原因有很多,DataSource 这里填写的信息,有一点点的纰漏,就会导致连接失败 

第三个环节:

构造SQL语句(JDBC操作数据库,本质仍然是通过 SQL 来描述数据库操作)

例如,此时我们进行一个插入数据的操作:

1.首先我们需要一个表:

  

第四个环节:

执行SQL语句

insert、update、delete都是通过executeUpdate来执行的,select则是通过exexuteQuery来执行的

 executeUpdate 的返回值是一个整数,表示这个操作影响到几行

就类似于:

  

第五个环节:

断开连接,释放资源;释放顺序:后创建的先释放

图示说明:

 

运行结果:

 

如果在创建表的时候,设置了主键约束,

比如说,id设置成了主键,那么 如上述情况的话,运行第二次就会报错:id唯一 存在主键约束

可是,这样的话,插入的数据就会写死了而在实际操作过程中,这种写死的办法并不好;

我们还需要用其他的办法来进行操作;

 

此时,自己可输入数据: 

3.2 JDBC修改数据操作

实现数据库修改的操作,和插入操作非常类似;只是这里的 SQL语句 是 update语句

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 JDBCUpdate {
    public static void main(String[] args) throws SQLException {
        //实现数据库的修改操作,和插入非常相似
        //只是这里构造的 SQL 语句是 update 语句
 
        //1.构造数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306" +
                "/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("111111");
 
        //2.和数据库建立连接
        Connection connection = dataSource.getConnection();
 
        //3.用户输入,要修改的id和输入后的名字
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要修改的同学学号:");
        int id = scanner.nextInt();
        System.out.println("请输入要修改之后的同学姓名:");
        String  name = scanner.next();
        //next 读到空白符(空格,制表符,换行符,回车符,垂直制表符......)
        //nextLine 读到换行符
 
        //4.构造SQL语句
        String sql = "update student set name = ? where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,name);
        statement.setInt(2,id);
        System.out.println(statement);
 
        //5.执行SQL
        int n = statement.executeUpdate();
        System.out.println("n = "+ n);
 
        //6.关闭连接、释放资源
        statement.close();
        connection.close();
 
    }
}

3.3 JDBC删除数据操作

删除数据库中的数据,代码的写法和前面的增加/修改 是类似的

只是这里的 SQL语句是 delete语句

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 JDBCDelete {
    public static void main(String[] args) throws SQLException {
        //删除数据库中的数据,代码的写法和前面的增加/修改 是类似的
 
        //1.构造数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306" +
                "/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("111111");
 
        //2.和数据库建立连接
        Connection connection = dataSource.getConnection();
 
        //3.输入删除的内容
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的同学id:");
        int id = scanner.nextInt();
 
        //4.构造SQL语句
        String sql = "delete from student where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1,id);
        System.out.println(statement);
 
        //5.执行SQL
        int n = statement.executeUpdate();
        System.out.println("n = "+ n);
 
        //6.关闭连接、释放资源
        statement.close();
        connection.close();
 
    }
}

3.4 JDBC查找数据操作

查找数据库中的记录;这个查找操作就和前面的操作不太一样了;

多了一个步骤 —— 要遍历结果集合

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 JDBCSelect {
    public static void main(String[] args) throws SQLException {
        //查找数据库中的记录~~
        //查找操作需要遍历结果集合,这是前面的几个操作不曾有的~~
        //因为客户端 后面拿到的是 "临时表",必须遍历一遍取出里面所需的东西 再显示在黑框框上~~
 
        //1.构造数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306" +
                "/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("111111");
 
        //2.和数据库建立连接
        Connection connection = dataSource.getConnection();
 
        //3.此处就不输入条件了,直接查找所有记录
 
        //4.构造SQL
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);
 
        //5.执行SQL
        //此处要使用的是 executeQuery
        //executeUpdate 只能返回一个int
        //executeQuery 返回的是一个 ResultSet对象,可以把这个对象视为一个 "临时表"~~
        ResultSet resultSet = statement.executeQuery();
 
        //6.遍历 "临时表"
        //resultSet 简单的当成一个类似于 "迭代器" 这样的东西来看待~~
        //next 如果没有到达末尾,就是返回true,要继续循环
        //next 如果到达了末尾,就返回false,结束循环
        while (resultSet.next()){
            //在这里就可以取这一行的数据了
            //通过 ResultSet 里面的 getXXX方法,来获取到这里指定的列
 
            //取id,id是整数,getInt
            int id =resultSet.getInt("id");
 
            //取name,name是字符串,getString
            String name = resultSet.getString("name");
            System.out.println(id + ":" + name);
        }
 
 
        //7.关闭连接,释放资源
        resultSet.close();
        statement.close();
        connection.close();
 
    }
    
}


总结

实际在开发中,很少会直接使用JDBC

JDBC 写起来比较麻烦,比较啰嗦

后来衍生出了许多 "框架",能够简化数据库操作

比如说,后面会介绍的 MyBatis框架;

今天的内容就分享到这里了,下期再见!!!!!!!!!!

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

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

相关文章

哈希(C++)

C语言总结在这常见八大排序在这作者和朋友建立的社区:非科班转码社区-CSDN社区云💖💛💙期待hxd的支持哈🎉🎉🎉最后是打鸡血环节:想多了都是问题,做多了都是答案&#x1f…

计算机网络复习之运输层

文章目录ARQ协议停等式ARQ回退n帧的ARQ(GBN)选择性重传ARQ(SR)UDP协议TCP协议TCP协议的特点TCP报文段首部格式TCP连接管理TCP可靠传输TCP的流量控制TCP拥塞控制参考拥塞:若对网络中某一资源的需求超过了该资源所能提供…

Jenkins安装

Jenkins安装1、Jenkins简介2、Jenkins安装2.1 安装条件2.2 安装JDK2.2.1 检索可用包2.2.2 安装2.3 下载Jenkins的war包2.4 启动jenkins并测试3、安装maven1、Jenkins简介 Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件…

LeNet5—论文及源码阅读

LeNet5—论文及源码阅读🐬 目录: 一、概论二、论文选读三、源码精读四、参考资料 一、概论 LeNet-5是一种经典的卷积神经网络结构,于1998年投入实际使用中。该网络最早应用于手写体字符识别应用中。普遍认为,卷积神经网络的出现开始于LeCu…

蓝牙Inquiry与Inquiry Scan

文章目录一、Inquiry和Inquiry Scan二、Inquiry的三种模式2.1 Inquiry命令2.2 标准Inquiry应答2.3 带RSSI的Inquiry应答2.4 带EIR的Inquiry应答三、Extend Inquiry Response3.1 EIR数据格式3.2 EIR数据注册3.3 EIR数据解析示例3.4 获取对端设备名称的方法四、Inquiry Scan参数一…

推荐系统入门学习(二)【小白入门系列】

搭建你的第一个推荐系统 初识推荐系统 最初的推荐系统,作用是过滤垃圾邮件。今日机器学习算法的发展,朴素贝叶斯、神经网络已然成为了过滤垃圾邮件的好手。但是在30年前,算法还没有如今使用得广泛的时候,“找相同”就成为了过滤…

大型网络游戏任务系统的架构与设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:任务配置表设计与管理;游戏任务的解锁与生成;任务完成判定;任…

将本地的word文档转为markdown(带图片)发布到CSDN

文章目录一、前言二、word转为markdown三、自动发布本地md文件一、前言 背景:早期很多学习笔记都是记在word上(那一年,还不知道有markdown),现在想将早期的一些资料都发布到CSDN上(本地学习资料我都懒得打…

数据中心灾备通用基础

1.灾备的定义 没有灾备会带来的问题 一旦数据中心的数据遭到破坏,随之而来的是很多棘手的问题 灾备可以提供全面数据保护 IT行业中的备份 在当今IT行业中,数据量急剧增长,并且新的法规不断出台,对备份时间、恢复时间目标&#…

Linux应用编程---4.pthread_create函数

Linux应用编程—4.pthread_create函数 ​ 之前学习了进程有关的东西,现在学习如何创建一个线程。 4.1 pthread_create()函数详情 ​ 线程创建函数是:pthread_create()。在Linux终端下,输入man pthread_create,查看函数定义以及…

Python基础(二十三):面向对象之继承介绍

文章目录 面向对象之继承介绍 一、继承的概念 二、单继承 三、多继承

IntelliJ IDEA安装教程(超详细)

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:实用工具 💬个人格言:不断的翻越一座又一…

Java学习(44)new关键字

new关键字 对象实例化 实例化对象的过程可以分为两部分: (1) 声明对象:Cat one (2) 实例化对象:new Cat()JVM可以被理解为Java程序与操作系统之间的桥梁 每次使用new关键字,就相当于在内存中开辟了一块新的存储空间。 package c…

CPU概述

CPU 概述 1. CPU 基础 CPU 的概念 CPU 是最重要的计算机组件,由控制器和运算器组成,通过总线与其它设备连接。 CPU 与南北桥 所谓的桥,都是 cpu 和其它设备连接这样的一个桥梁。分为南北桥。 什么是南桥? 南桥主要是用来连接…

【北邮果园大三上】运筹学期中后

运筹学后半段 第五章 动态规划 最优化原理,可以归结为一个递推公式 现实应用:比如最优路径、资源分配、生产计划和库存等 5.1 动态规划的最优化原理及其算法 5.1.1 求解多阶段决策过程的方法 例如:最短路径问题 求A到B的最短路径&#xff…

SpringBoot3.0集成SpringDoc2.0

SpringBoot3.0集成SpringDoc1. pom配置2. OpenApi配置类3. 使用4. SpringDoc注解与SpringFox对比5. 演示项目这里为什么要使用SpringDoc呢?是因为集成SpringFox只支持SpringBoot2.x, 而基于Swagger的SpringDoc的社区现在十分活跃,代码也在不断…

excel 设置双坐标轴柱状图

思路:通过添加辅助列来调整。 步骤1 选中数据,插入柱状图,这时候会得到原始的柱状图 选中“设计”-“更改图表类型”-“组合”,调整图表类型均为柱状图,可以得到初始双坐标轴图表…

Linux应用编程---7.有名管道

Linux应用编程—7.有名管道 7.1 mkfifo函数详情 ​ 无名管道用于具有亲缘关系的进程之间通讯,比如:父子进程、兄弟进程。有名管道用于非亲缘关系进程之间的通讯。创建有名管道使用到的库函数是:mkfifo(),这里强调是库函数的原因…

Elasticsearch连续剧之基础篇

目录一、前言二、Elasticsearch数据结构三、安装1.配置最大可创建文件数大小2.由于ES不能以root用户运行,我们需要创建一个非root用户,此处创建一个名为es的用户3.安装es4.启动es服务四、常用操作1.创建没有结构的索引2.创建有结构的索引3.删除索引4.文档…

【迅为iMX6Q】开发板 u-boot 2020.04 RTL8211E 以太网驱动适配

相关参考 【迅为iMX6Q】开发板 u-boot 2015.04 SD卡 启动 【迅为iMX6Q】开发板 u-boot 2020.04 SD卡 启动 【迅为iMX6Q】开发板 u-boot 2022.04 SD卡 启动 开发环境 win10 64位 VMware Workstation Pro 16 ubuntu 22.04 【迅为imx6q】开发板, 2G DDR 目标 …