MySQL JDBC

news2024/9/23 19:25:45

JDBC:Java的数据库编程

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

MySQL本身提供了一组API供程序员调用,Oracle,SQL server,SQLite都提供了这样的API让程序员调用,这些不同的数据库提供的API并不相同

程序员希望,大家的API是一样的,但是各个数据库厂商互不相让,此时Java就站了出来

Java给出一套API接口标准,让数据库厂商来照着写,每个数据库厂商都额外写一点代码从而程序员就可以学会Java的这一套API标准就可以让程序员在各个数据库之间来回无缝衔接

这一套API就是JDBC,这一套接口标准可以形象表示为下图

接口转换程序称为"数据库驱动",平时我们所理解的驱动是硬件方面,但是它是软件,在以前,浏览器需要下载驱动才能运行,一旦版本不匹配需要重新匹配,在自动测试方面就有WebDriverManager来实现驱动管理

JDBC是Java标准库提供的,你只要装了JDK就都自带了JDBC,但是使用JDBC操作MySQL就需要下载并导入MySQL驱动包,下载安装一个程序,最好就是去官网下载,但是对于MySQL驱动包来说,Oracle官网藏得很深,强制你注册登录,这时我们可以用到中央仓库(Maven),去中央仓库下载即可

下载MySQL驱动包

搜索MySQL即可找到驱动包,Connector/J是新版本,另一个Java则是旧版本,小版本区别不大

注意:小版本前面的最高序号需要与你的MySQL版本号最高位一致,我的是5.7,所以下载5开头版本的Connector包

我们可以使用下载依赖的方法来注入依赖,这里我们采用引入第三方库

点击这里进行下载,

.jar其实是一个类似于.rar这样的压缩文件,里面包含了很多.class文件,写好的Java文件,就可以把编译出来的.class拷贝给别人,别人就能运行使用了,但是由于一个程序中,往往.class文件会有很多,涉及到一些复杂的目录结构,直接拷贝一堆.class文件非常不友好,于是就把这些要发布的.class按照待定格式打包压缩就得到了.jar文件,后续直接拷贝就可以了,同时JJVM也可以直接识别.jar内部的.class文件并直接运行

  • 创建一个目录,并且把下载好的驱动放在该目录里

  • 右键这个目录,单击add as library,告诉IDEA,当前这个目录是存放第三方库的目录,此时IDEA就能够识别咱们拷贝进来的驱动包了

此时IDEA能够识别驱动包

以上就是JDBC程序的准备工作了,准备工作完成后就可以编写代码了

编写JDBC代码

  •  DateSource数据源:要操作的数据库,数据,是在哪里

package org.example.demo;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;//JDBC自带的interface

public class Demo {
    public static void main(String[] args) {
        //1.创建数据源 - 这个过程就是所谓的 "数据库厂商写代码和JDBC进行对接"
        DataSource dataSource = new MysqlDataSource();//MySQLDataSource 这个类就是来自于MySQL的驱动包
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        //这样写也可以,但是第一种是向上转型的写法,更能体现代码的解耦合

    }
}
  • 在MySQL中,就需要设定好,MySQL服务器的位置,要访问的数据库的名字,访问数据库的用户名和密码

package org.example.demo;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;

public class Demo {
    public static void main(String[] args) {

        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/j?characterEncoding=utf8&useSSL=false");
        //此时seturl中分别是固定格式jdbc:mysql://127.0.0.1:3306/这个地方是数据库名称?这个地方是编码&这个地方是某种协议(加密通信)
        ((MysqlDataSource) dataSource).setUser("root");
        //设置用户名
        ((MysqlDataSource) dataSource).setPassword("root");
        //设置用户名密码
    }
}

MySQL是一个客户端 服务器程序,服务器是保存数据的本体,之前的类似cmd黑框是MySQL客户端,进行客户端-服务器之间的通信的时候,常见的有两种通信的模式:

  1. 有连接(JDBC就属于‘有连接’),可以通俗理解为需要先拨号
  2. 无连接
  • 此时需要创建连接,注意一定是第第三个 java.sql

 

package org.example.demo;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class Demo {
    public static void main(String[] args) throws SQLException {

        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/j?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("root");

         2. 和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        //此时需要抛出异常,抛出SQLException异常
        //这一步写错有很多原因,
        //数据库服务器没有正确启动
        //url写错了,用户名写错了,密码写错了,网络断开了()等等
    }
}
  • 按照表的结构构造两个参数

        Scanner scanner = new Scanner(System.in);
        // 3. 能够构造一个操作数据库的 sql 语句.
        System.out.println("请输入id: ");
        int id = scanner.nextInt();
        System.out.println("请输入name: ");
        String name = scanner.next();
  • 此时创建一个预编译对象

 一个字符串SQL发送到数据库服务器上,是要先对sql进行解析,进行各种校验(判断sql是否符合语法要求等才能执行),这个解析操作也是需要花费一定开销的,虽然开销不是很大,但是MySQL服务器需要同时给多个客户端提供服务,将结果解析在客户端完成,此时把解析的结果发送给服务器,服务器直接执行即可

        // String sql = "insert into test values(" + id + ", '" + name + "')";
        String sql = "insert into JDBC values(?, ?)";//可以把这个理解为通配符
        //这是一个带有"预编译"功能的语句对象
        //此时这里进行编译工作,IDEA相当于是客户端
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, id);
        preparedStatement.setString(2, name);
  • 将MySQL客户端中的 XX rows affected (0.00sec),只是要将得到的结果返回给服务器

        // 4. 执行 sql, 把刚才解析好的语句发给数据库服务器了.
        //    返回值是一个 int 类型, 表示这个操作影响了几行数据.
        int n = preparedStatement.executeUpdate();
        System.out.println("n = " + n);
  • 将资源释放

··      // 5. 执行完毕, 有收尾操作. 释放前面创建的各种资源.
        //    主要是释放 语句对象 和 连接对象. DataSource 是不必释放的.
        preparedStatement.close();
        connection.close();
        scanner.close();
        //此时需要保证先断开预编译对象,在释放连接

总结:

  • DataSource:数据源
  • Connection:连接对象
  • PreparedStatement:预编译对象

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

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

相关文章

MySQL:基础操作(增删查改)

目录 一、库的操作 创建数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备份和恢复 二、表的操作 创建表 查看表结构 修改表 删除表 三、表的增删查改 新增数据 插入否则更新 插入查询的结果 查找数据 为查询结果指定别名 结果去重 where 条件 结…

tree组件实现折叠与展开功能(方式1 - expandedTree计算属性)

本示例节选自vue3最新开源组件实战教程大纲(持续更新中)的tree组件开发部分。考察响应式对象列表封装和computed计算属性的使用,以及数组reduce方法实现结构化树拍平处理的核心逻辑。 实现思路 第一种方式:每次折叠或展开后触发…

经纬恒润全新第二代行泊一体域控制器成功量产

随着L2自动驾驶功能的普及,整车架构的升级,传统分布式控制器已不能适应市场的发展,如何以低成本高性能实现高阶自动驾驶功能的落地, 成为了众多整车厂的迫切需求,行泊一体域控制器应运而生。据高工数据显示,2023年仅1-…

NVIDIA GPU 监控观测最佳实践

1、DCGM 介绍 DCGM(Data Center GPU Manager)即数据中心 GPU 管理器,是一套用于在集群环境中管理和监视 Tesla™GPU 的工具。它包括主动健康监控,全面诊断,系统警报以及包括电源和时钟管理在内的治理策略。它可以由系…

TypeScript 基础类型(一)

简介 它是 JavaScript 的超集,具有静态类型检查和面向对象编程的特性。TypeScript 的出现,为开发者提供了一种更加严谨和高效的开发方式。 主要特点: 、静态类型检查。 通过静态类型检查,开发者可以在编译时发现错误&#xff0…

大气热力学(8)——热力学图的应用之一(气象要素求解)

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 8.1 复习斜 T-lnP 图上的几种线8.1.1 等温线和等压线8.1.2 干绝热…

搬运5款我觉得超级好用的软件

​ 今天再来推荐5个超级好用的效率软件,无论是对你的学习还是办公都能有所帮助,每个都堪称神器中的神器,用完后觉得不好用你找我。 1.PDF阅读——Sumatra PDF ​ Sumatra PDF 是一款 PDF 阅读器,它的界面简洁,使用起…

乐尚代驾一项目概述

前言 2024年7月17日,最近终于在低效率的情况下把java及其生态的知识点背的差不多了,投了两个礼拜的简历,就一个面试,总结了几点原因。 市场环境不好 要知道,前两年找工作,都不需要投简历,把简历…

DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

小程序-3(页面导航+页面事件+生命周期+WXS)

目录 1.页面导航 声明式导航 导航到tabBar页面 导航到非tabBar页面 后退导航 编程式导航 后退导航 导航传参 声明式导航传参 编程式导航传参 在onload中接收导航参数 2.页面事件 下拉刷新 停止下拉刷新的效果 ​编辑 上拉触底 配置上拉触底距离 上拉触底的节…

函数返回右值的一点学习研究

https://zhuanlan.zhihu.com/p/511371573?utm_mediumsocial&utm_oi939219201949429760 下面情况下不会调用: DPoint3d fun1() {return DPoint3d{1,2,3}; // 默认构造 }int main() {DPoint3d&& a fun1();a.y 20;int i 0;i; } 下面情况下&#xff0c…

【内网穿透】如何本地搭建Whisper语音识别模型并配置公网地址

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

数据库管理的艺术(MySQL):DDL、DML、DQL、DCL及TPL的实战应用(下:数据操作与查询)

文章目录 DML数据操作语言1、新增记录2、删除记录3、修改记录 DQL数据查询语言1、查询记录2、条件筛选3、排序4、函数5、分组条件6、嵌套7、模糊查询8、limit分页查询 集合操作union关键字和运算符in关键字any关键字some关键字all关键字 联合查询1、广义笛卡尔积2、等值连接3、…

【.NET全栈】ASP.NET开发Web应用——站点导航技术

文章目录 前言一、站点地图1、定义站点地图文件2、使用SiteMapPath控件3、SiteMap类4、URL地址映射 二、TreeView控件1、使用TreeView控件2、以编程的方式添加节点3、使用TreeView控件导航4、绑定到XML文件5、按需加载节点6、带复选框的TreeView控件 三、Menu控件1、使用Menu控…

【BUG】已解决:ModuleNotFoundError: No module named ‘cv2’

已解决:ModuleNotFoundError: No module named ‘cv2’ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开…

C语言中常见库函数(1)——字符函数和字符串函数

文章目录 前言1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现4.strcpy的使用和模拟实现5.strcat的使用和模拟实现6.strncmp的使用和模拟实现7.strncpy函数的使用8.strncat函数的使用9.strncmp函数的使用10.strstr的使用和模拟实现11.strtok函数的使用12.strerror函数的…

打破运维“冷门槛“|暴雨液冷数据中心方案再升级

如果将数据比喻为驱动世界运转的新引擎,那数据中心便是为引擎提供源源不断动力的泵站。但随着泵站功率的日益增强,热浪成了不可避免的副产品。如何将数据热能转化为科技动能,是人工智能可持续发展的重要前提。 液冷技术,不仅可实现…

mysql命令练习

创建数据表grade: CREATE TABLE grade( id INT NOT NULL, sex CHAR(1), firstname VARCHAR(20) NOT NULL, lastname VARCHAR(20) NOT NULL, english FLOAT, math FLOAT, chinese FLOAT ); 向数据表grade中插…

uniapp打包h5,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND

在manifest.json内找到web配置修改运行的基础路径

MySQL 进阶(三)【SQL 优化】

1、SQL 优化 1.1、插入数据优化 1.1.1、Insert 优化 1、批量插入 插入多条数据时,不建议使用单条的插入语句,而是下面的批量插入: INSERT INTO tb_name VALUES (),(),(),...; 批量插入建议一次批量 500~100 条,如果数据量比…