MySQL JDBC编程

news2024/11/22 20:13:06

✏️作者:银河罐头
📋系列专栏:MySQL

🌲“种一棵树最好的时间是十年前,其次是现在”

文章目录

  • 前置知识
    • API
  • JDBC的使用
    • 安装
    • 数据库代码
      • 插入操作
      • 查找操作

前置知识

API

API(Application Program Interface)被定义为应用程序可用以与计算机操作系统交换信息和命令的标准集。

你拿到个东西能给你提供哪些功能/服务

实现客户端比较简单,各种数据库本身就提供了一系列API,可以让我们比较方便的实现这个客户端。

实现服务器很难,存储引擎,使用什么样的数据结构去组织数据;SQL执行引擎,基于编译原理的知识,能够对SQL进行解析和优化。

(之前学JavaSE看过API文档,Java的标准库会给我们提供一些API,有随机数、scanner、集合类等一组类/方法)

操作系统,也会提供一些API,比如操作硬盘的文件,访问一下硬盘的内容,重置一下网卡的状态,

包括模拟鼠标事件,模拟键盘事件…

也是以类/方法提供给我们的

数据库(MySQL)也会提供一组API,通过这组API可以对数据库完成增删改查的操作

Windows API(模拟鼠标点击的API就在这里)

C标准库的API

#include <stdio.h>

scanf,printf,fopen,fclose…

MySQL也提供了很多API,MySQL的API是为了让我们实现客户端的。

MySQL本来的API是C语言风格的,但考虑到MySQL使用非常广泛,也提供了其他多个语言的API,其他版本的API本质上还是调用C的API(跨语言调用)

像Oracle,SQLServer,SQLite等这些数据库的API不一样。

基层程序员学数据库编程,就得学好几套API,极大的提高了学习的成本

Java圈子里JDBC站出来了,JDBC这套API已经成为Java标准库的一部分。由于Java影响力很大,以自身作为标准,此时各种数据库厂商都提供了能够适应JDBC相关的"驱动包"。这个驱动包相当于API的具体实现。API约定了API有啥/咋用的

此时,只用掌握这套API,无论操作哪个数据库,操作的代码基本相同。

JDBC屏蔽了不同数据库原生API之间的差异,使用同一套API规范了所有数据库的编程操作

image-20221117164055275

JDBC的使用

安装

1.先能够安装对应数据库的驱动包(驱动包:数据库厂商提供的具体实现)

像MySQL这样的第三方软件,提供的驱动包,可以去"中央仓库"下载。(中央仓库:类似于手机的应用商店)

https://mvnrepository.com/
去这个网址下载

image-20221117165557298

选的大版本是5.1即可(和你的数据库服务器是对应的)

image-20221117165836649

下载好了之后在文件夹中打开

.jar是一个Java格式的压缩包,类似于.rar .zip一样

.jar里面有很多.class文件

.class文件是.java编译生成的二进制字节码文件

写个程序发布出去,主要是通过.jar的形式

1)在项目创建目录,把刚才的.jar包导入idea

2)右键这个lib目录(目录名字可以随便写)

此时idea就能解析出jar包里的内容

数据库代码

插入操作

3)编写数据库代码

image-20221117185319278

Datasource是jdbc提供的一个接口

JDBC里面的很多关键API都是interface,是由具体的数据库驱动包来提供对应的实现类

image-20221117185805352

image-20221117190222749

为什么这里要先向上转型然后再向下转型?

image-20221117190334883

也可以不做任何转型,直接new MysqlDataSource,就都可以直接用了。

这里看似"多此一举",好处是:

后续代码使用DataSource的实例,避免MysqlDataSource这个名字扩散到代码的各个地方(高内聚),未来要是换数据库,就只用改这一个地方

URL=>唯一资源地址符,也就是"网址",它描述了互联网上的唯一的一个资源的位置

image-20221117192305093

只用复制粘贴就行,不用背

image-20221117193936890

image-20221117194548635

上述数据源的创建操作,只是描述了数据库在哪,并没有真正进行访问,紧接着的"连接操作"才是真正开始通过网络进行通信

不同的数据库,对于数据源的描述是有差异的,有的数据库通过用户名密码来验证,有的不是,比如SQLite

image-20221117195736532

Connection是网络通信中的重要概念,叫做连接(Connection),不叫链接(Link)

网络连接是找个地方记录下,哪个客户端和哪个服务器,即将要进行通信了。

优化,通过技术手段去优化永远是落入下风的,高端的优化是业务上的优化。

每个客户端请求,都是需要小小服务器的系统资源的,(资源包括不限于CPU,内存,硬盘,网络IO带宽资源)。服务器的硬件资源是有限的,

Java的异常分为:

1.受查异常(必须显式处理)

这个显示处理:分为两种

1)try自己把这个异常捕获处理

2)throws 抛异常,交给jvm处理

2.非受查异常(可以忽略)

image-20221117203104553

image-20221117203227535

image-20221117205130028

PreparedStatement背后做了很多事,比如会对SQL语句进行一些预处理(对语法进行解析之类的)

以前通过cmd输入的sql,都是把sql直接发给服务器,让服务器来解析

image-20221117205118417

当连接不再使用时,就需要释放连接,把之前的记录给"擦除掉"

C++在使用内存的时候,都是手动申请,手动释放。

Java是手动申请,自动释放

但是像这种连接资源还是需要手动释放的。

内存泄露不好发现,很多编程语言引入了GC(垃圾回收),Java,Python,Go,PHP,JS …

大大降低内存泄露的概率

语言=>语法规范

C++有语法规范,是C++标准委员会维护的,算是开源的,但是不是代码。

Java也有语法规范,Oracle实现的, 也算是开源的

C++的编译器,gcc,clang,也是开源的,实现了C++的语法规范

Java的jdk开源的,open-jdk也是开源的

Python是开源的,Python这个词既是语法规范,又是解释器实现

image-20221117212319492

jdbc支持两种风格的代码,一个是DriverManager,一个是DataSource

1.DriverManager使用的时候需要借助反射,不推荐

反射不是常规编程手段,是特殊情况下的特殊手段

2.DataSource相比于DriverManager,内置了数据库连接池,可以重复利用连接

字符串常量池、进程池、线程池、内存池、数据库常量池

image-20221117213757510

image-20221117213836228

写死的数据不好,更希望是动态的

image-20221117214604206

不建议用字符串拼接的方式进行SQL的构造,

eg:输入name,这样输:“); drop table xxx”

更靠谱的方式是用PreparedStatement来通过占位符替换的方式,来实现动态SQL的构造

image-20221117215439955

image-20221117215834174

修改和删除代码和插入是一样的

//插入
public class JDBCInsertDemo {
    public static void main(String[] args) throws SQLException {
        //使用jdbc往数据库中,插入一条记录
        //需要提前准备好数据库(java),数据表(student)
        //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("123456");

        //MysqlDataSource mysqlDataSource=new MysqlDataSource();
        //mysqlDataSource.setUrl();
        //2.和数据库建立网络连接。(写的jdbc代码本质上是实现一个mysql客户端,通过网络和服务器进行通信)
        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 = statement.executeUpdate();
        System.out.println("ret = " + ret);
        //5.断开和数据库的连接,并且释放必要的资源
        statement.close();
        connection.close();
    }
}

查找操作

查找操作相比于插入多了一个步骤,遍历结果集

image-20221118095047594

image-20221118095104196

非常类似于迭代器遍历(hasNext());

这里的next(),既是向下移动光标,又是判断下面一行是否有数据

1: 张三
1: 张三
2: 李四
3: 王五

如果是加限制条件,只用修改sql语句

String sql = "select * from student where id = 1";

命令行属于,官方自带的,通用的交互式的客户端

写代码则是让java程序快速的,重复多次的,执行一些相对固定的sql

写代码,也是实现一个客户端,不过这是一个通用的客户端

JDBC实际工作上中,可能不会直接用,因为JDBC代码写起来有点麻烦。

因此就有了一些库和框架,就对JDBC做了进一步的封装,让我们用起来更方便,

Mybatis,或者JPA这种,让我们写起来非常方便

但是学习JDBC还是有非常大意义的,框架一直在变更,JDBC是恒定的,框架也都是基于JDBC的, 如果你发现现有的框架,难以满足你的需求,就可以基于JDBC进行魔改和自定义

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/java?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");
        Connection connection = dataSource.getConnection();
        String sql = "select * from student where id = 1";
        PreparedStatement statement = connection.prepareStatement(sql);
        //结果集合
        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()){
            //next 相当于移动一下光标,光标指向下一行,然后移动到末尾,返回false
            //使用getXX方法获取到每一列
            //获取Int,就使用getInt();获取String,就使用getString()
            //这里的参数就是数据库表的列名
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println(id + ": " + name);
        }
        //释放资源
        resultSet.close();
        statement.close();
        connection.close();

    }
}

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

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

相关文章

金属纳米颗粒图像分割和计数

代码下载链接&#xff0c;直接上程序运行的效果&#xff1a; 为了便于大家学习&#xff0c;把原图也都贴上了&#xff1a;

乐趣国学—品读《弟子规》中的“亲仁”之道

文章目录亲仁同是人 类不齐 流俗众 仁者希果仁者 人多畏 言不讳 色不媚能亲仁 无限好 德日进 过日少不亲仁 无限害 小人进 百事坏亲仁 “亲仁”&#xff0c;亲是亲近、学习的意思&#xff0c;亲近那些有道德、有学问、有人生境界、有情操的人&#xff0c;这是讲择师。一个人的学…

【Redis】配置项与发布订阅

一、配置项 redis相关配置项都存放在redis.conf文件中&#xff0c;暂时只列举常见的几个&#xff0c;其余的工作中用到再回来更新 1、网络 bind&#xff1a;指定redis只能接受来自此IP绑定的网卡的请求&#xff0c;注意此默认值默认外网是不可访问的&#xff0c;如果想要开启…

Unity3D制作塔防类游戏

演示 功能简介 制作细节详解 演示 资源包:链接&#xff1a;https://pan.baidu.com/s/15MMtYeKkNk5xChvCx0EckQ?pwdd1ub 提取码&#xff1a;d1ub 对应视频教学:01-开始介绍和创建工程_哔哩哔哩_bilibili 功能简介 分为蓝&#xff0c;紫&#xff0c;粉&#xff0c;红四…

[iOS]UI分析工具Reveal

Reveal是ITTY BITTY发布的UI分析工具&#xff0c;可以很直观的查看App的UI布局。 去官网下载安装Reveal&#xff0c;启动后样式如下。 下面介绍一下如何在非越狱设备和越狱设备上用Reveal工具分析UI 一、非越狱设备用Reveal分析UI 1.安装MonkeyDev 安装流程可查看前文[iOS]…

2. Java线程模型

1. 操作系统线程 无论使用何种编程语言编写多线程程序&#xff0c;最终都是通过调用操作系统的线程来执行任务。线程是CPU调度的最小执行单元。 线程有多种实现方式&#xff0c;常见的有&#xff1a;内核线程、用户线程、混合线程。 不同线程模型的主要区别在于线程的调度方不…

bat脚本启动Java服务

bat脚本启动Java服务1.终端cmd窗口运行jar2. bat脚本启动jar包3.后台启动bat脚本4. 运行bat只启动一次jar服务及停止脚本5.注意事项6.所用资源1.终端cmd窗口运行jar Java项目一般会被打包成jar后启动&#xff0c;在windows系统中可以通过终端窗口cmd启动jar包&#xff0c;即在…

5G无线技术基础自学系列 | 移动通信网络的架构

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 第五代(5thGeneraton&#xff0c; 5G) …

计算机中的第一个伟大发明(IR/IAR)

计算机工具的普及极大的推动了科技领域的发展以及提高人们生活的便捷性&#xff0c;那么在其中有哪些举足轻重的发明呢&#xff1f;本节我们来了解一下计算机中第一个伟大的发明&#xff1a;指令寄存器和指令地址寄存器 回顾在步进器加持下的两数两加 前面提到两个数相加的执行…

PyCharm运行PyQT6 (四) 百篇文章学PyQT

本文章是百篇文章学PyQT的第四篇&#xff0c;本文讲述如何使用PyCharm成功运行PyQT6&#xff0c;PyCharm在配置过程中会遇到很多问题&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、遇到问题的解决…

Intel芯片、AMD显卡有多强?M1系列呢?

我们知道英特尔是半导体行业和计算创新领域的全球领先厂商 &#xff0c;创始于1968年。如今&#xff0c;英特尔正转型为一家以数据为中心的公司 。英特尔与合作伙伴一起&#xff0c;推动人工智能、5G、智能边缘等转折性技术的创新和应用突破 &#xff0c;驱动智能互联世界。…

【由浅入深 - Java笔记】玩转List:List过滤和筛选

文章目录List过滤&#xff1a;Comparator、Comparable 和 Stream1. 使用list的Stream进行筛选2. 增强for循环遍历元素&#xff0c;进行筛选3. 使用list.foreach遍历4. 使用iterator遍历5. 视频笔记List过滤&#xff1a;Comparator、Comparable 和 Stream 花时间精力去凿许多浅井…

5G无线技术基础自学系列 | 移动通信网络的演进

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 随着移动用户数量的不断增加&#xff0…

mac系统安装搭载Windows系统虚拟机方法教程

我们都知道macOS系统虽然相对windows系统而言更稳定&#xff0c;但macOS系统中可使用的软件数量较windows系统而言要少很多。对于macOS系统应用少的问题&#xff0c;我们可以使用虚拟机来解决。那么&#xff0c;苹果虚拟机好用吗&#xff1f;整体而言是可以的。苹果虚拟机怎么装…

0-搭建nodejs环境

1) 安装 nvm nvm 即 (node version manager)&#xff0c;好处是方便切换 node.js 版本 安装注意事项 要卸载掉现有的 nodejs提示选择 nvm 和 nodejs 目录时&#xff0c;一定要避免目录中出现空格选用【以管理员身份运行】cmd 程序来执行 nvm 命令首次运行前设置好国内镜像地…

小马哥的CSS驿站

目录 第一章 CSS概述 1.1语法 1.2注释 1.3CSS的创建 第二章 CSS选择器 1.id选择器 2.class选择器 3.标签选择器 4.子代选择器 5.后代选择器 6.相邻兄弟选择器 7.后续兄弟选择器 8.交集选择器 9.并集选择器 第三章 CSS样式 1.文本与文字样式 &#xff08;1&…

G2O学习 - 曲线拟合实例

学习使用G2O进行曲线拟合使用 1. 拟合目的&#xff0c;如何建立拟合的图模型 大概就是曲线拟合&#xff0c;求曲线 y ax^2 bx c 中 abc 的值。 但是我一直不明白如何获得下面图的。 我觉得应该是这样的 首先把abc视为一个变量&#xff0c;这个变量应该是一个矩阵【这里还…

Python和Pycharm安装教程

一、Python安装 1.进入官网下载Python 官网地址&#xff1a;Download Python | Python.org 官网下载可能会有些慢&#xff0c;请耐心等待 我这里把3.11的安装包和后面的Pycharm安装包都放到网盘里面了 链接&#xff1a;https://pan.baidu.com/s/1spxNUbH4trWBox1SJeBjkQ?pwdh…

Linux CentOS 系统安装

VMware 下载地址 Ctrl F 搜索【下载试用版】VMware 下载地址 Ctrl F 搜索【DOWNLOAD NOW】VMware-workstation-full-16.2.4-20089737.exe 文件下载地址CentOS 下载地址 Ubuntu 下载地址 阿里巴巴开源镜像站-OPSX镜像站 1、下载安装VMware虚拟机 2、下载Linux系统镜像&…

TCP/UDP/Socket 通俗讲解

1.封包和拆包 封包&#xff0c;就是发送数据前把自己本地需要发送的数据包装一下&#xff0c;即把要发送的原始数据附加上接受者可以辨识到自己身份等一些额外信息。有点像寄一封信&#xff0c;信封上填写的寄件人和收件人以及地址。 拆包&#xff0c;是接收到对方封包后发送来…