Java的数据库编程——JDBC基础

JDBC编程

  • 一、概述
    • 1.1 概念介绍
    • 1.2 驱动包下载
    • 1.3 导入驱动包
  • 二、通过Java程序操作数据库
    • 2.1 通过 JDBC 进行 插入数据 操作
      • 2.1.1 创建“数据源(DataSource)——描述要操作的数据库、数据是在哪”
      • 2.1.2 与服务器建立连接
      • 2.1.3 构造sql语句,并且对字符串类型的sql进行识别和编译
      • 2.1.4 将编译好的sql语句传给服务器,并且执行sql
      • 2.1.5 释放前面占用的各种资源
      • 2.1.6 完整代码
    • 2.2 通过 JDBC 进行 查询数据 操作

一、概述

1.1 概念介绍

  1. JDBC:Java Databases Connectivity——Java语言连接数据库
  2. Java通过JDBC这样的技术连接MySQL数据库,MySQL是一个基于C/C++实现的数据库,本身也提供了一系列的API,从而可以通过代码操作数据库
  3. API: Application Programming Interface——应用程序编程接口,这是一个通用的概念,不仅仅局限于Java当中;可以把这个词理解为“一组类”/“一组方法”,都是现成的,可以直接调用实现一些功能;对于Java来说,Java提供了“标准库”,只要安装了Java,此时就能使用标准库中的类和方法(标准库API),也可以使用别人写的类和方法(第三方API);有的库,提供的API非常多,形成了一系列体系.这种情况也可以称为“SDK”(软件开发工具包)——Software development kit;Java中用到的JDK就是一个SDK,只不过起了个专属的名字Java开发工具包
  4. 不同数据库提供的API不同(功能上大同小异,细节上存在很大差异),那么在项目中使用到不同的数据库时,就需要掌握多分api的使用,非常麻烦,这时候Java出版了一套API接口标准,使他们都按照该标准适配过来(每个数据库厂商只需要额外写一些代码,能够按照Java提供的标准把原有的API封装一下),后续仅需掌握Java这一套API(JDBC),就可以切换各种数据库了,如下图:
    在这里插入图片描述
  5. JDBC是Java标准库提供的,只要装了JDK就自带JDBC,但是使用JDBC操作MySQL需要安装并导入MySQL的驱动包(数据库驱动)

1.2 驱动包下载

中央仓库:https://mvnrepository.com/

  1. 搜索MySQL
    在这里插入图片描述

  2. 找到与MySQL对应的版本(只要大版本相同即可,比如我的MySQL版本是8.0.34,驱动包只要是8开头的版本都行)
    如果你的MySQL是比较新的就点击新版本,否则就点击旧版本
    在central中查看版本
    在这里插入图片描述

在这里插入图片描述

  1. 选择版本后,点击jar下载即可
    在这里插入图片描述
    在这里插入图片描述
    .jar文件就是类似于.rar文件的压缩包,是最常见的一种发布Java程序方式,其中包含了很多的.class(Java编译生成的字节码文件)文件
    或者在项目中配置pom文件,使用maven下载
    在这里插入图片描述

1.3 导入驱动包

这里我使用的是IDEA编译器

  1. 创建一个Java项目
  2. 在项目中随便创建一个目录
    在这里插入图片描述
  3. 把jar文件拷贝到刚刚创建的目录(lib)中,
    在这里插入图片描述
  4. 右键目录,选择Add as library
    告诉IDEA,这个目录存放的是第三方库,此时IDEA就能识别拷贝进来的驱动包了
    添加完上述,可以看到这个jar文件可以展开了,说明能被识别
    在这里插入图片描述
    上述操作是JDBC程序的准备操作,接下来就可以写代码了

二、通过Java程序操作数据库

2.1 通过 JDBC 进行 插入数据 操作

先在数据库新建一张表,虽然通过JDBC也能进行建表操作,一般都是提前建好表的
在这里插入图片描述
接下来准备往people这张表来插入数据

2.1.1 创建“数据源(DataSource)——描述要操作的数据库、数据是在哪”

在MySQL中,要设定好MySQL服务器的位置,访问数据库的用户名、用户密码以及数据库名
在这里插入图片描述
以上要包含的是JDBC自带的interface(接口),而接口是不能直接new的,所以需要new一个实现该接口的类的实例
因为需要操作MySQL数据库,所以new一个MySQL提供的类MysqlDataSource,这就是MySQL厂商提供的驱动包里面的类,需要包含信息
在这里插入图片描述

//向上转型
DataSource dataSource = new MysqlDataSource();

以上过程就是数据库厂商(MySQL)和JDBC进行对接,就是让数据库厂商实现JDBC中提供的接口,进一步的实现其中约定好的抽象方法

//向下转型,并且设置url
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");

Url:唯一资源定位符;MySQL是一个 客户端—服务器 的程序,服务器是保存数据的本体,当前写的 jdbc 代码,就是在写一个 mysql 客户端;之前的cmd黑框是MySQL自带的客户端,这里可以通过Java代码通过JDBC自己实现客户端,然后客户端通过网络访问到数据库服务器(不是cmd黑框启动的那个),才能进一步的进行数据库操作;要想访问服务器,就需要知道服务器所在位置,这里的Url就是描述服务器以及服务器上的资源在网络上所在的位置,
其中jdbc:mysql:代表给jdbc中的MySQL使用的url,127.0.0.1代表ip地址(描述的是一个主机/电脑在网络上的位置,这里本地ip默认为127.0.0.1),3306端口号(区分了主机上的应用程序,这里是MySQL默认的端口号),learn_db为即将要操作的数据库的名字,characterEncoding=utf8表示指定字符集为utf8,useSSl=false表示关闭加密通信,不写的话可能会由于依赖程序有问题导致数据库连接失败,serverTimezone=Asia/Shanghai表示配置数据库时间,确保其正确
除了设置Url之外,还需要设置用户名密码

  ((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");

其中root为默认用户名,密码为123456
DataSource需要对接不同的数据库,对于MySQL来说,设置的为url,user,password;对于其他数据库就不一定了,所以需要向下转型为MysqlDataSource

2.1.2 与服务器建立连接

进行 客户端—服务器 之间通信的时候,一般两种通信模式:
(1)有连接 (类似于打电话,对方必须接通才能进行通话)
(2)无连接 (类似于发短信,不需要对方操作,直接可以发送成功)
这里的JDBC就属于“有连接”的这种模式,则需要先进行“拨号”——dataSource.getConnection();
在这里插入图片描述
在这里插入图片描述

写完之后,发现报错了,这里查看信息后发现没有处理异常,这里使用throws关键字显式处理该受查异常
在这里插入图片描述
处理后就不报错了
下面使用Connection(选择java.sql包中的Connection)来进行接收
在这里插入图片描述

Connection connection= dataSource.getConnection();

做到这一步后,如果能够编译成功说明可以与MySQL服务器进行连接了,后面就可以写sql语句了

2.1.3 构造sql语句,并且对字符串类型的sql进行识别和编译

虽然是通过Java来操作数据库,但是核心还是需要通过执行sql语句来操作数据库,只不过是把sql嵌入Java中了

String sql = "insert into people values(1,'小明')";

预编译sql语句
以上是字符串结构的sql语句,还需要构造语句对象,使JDBC能够识别
有两种方法:使用Statement或者PrepareStatement
其中Statement是一个普通的语句对象,而PrepareStatement则是带有预编译(一个字符串sql发送到MySQL服务器上,是要先对sql进行解析,然后进行各种校验,之后才能执行——这个操作需要花费一定开销的,虽然开销不大,但是MySQL服务器要同时给多个客户端提供服务,为了减轻服务器的负担,这里现在客户端预编译好,把解析后的数据交给服务器,服务器可以立即执行) 功能的语句对象;
所以下面推荐使用PrepareStatement

 PreparedStatement preparedStatement = connection.prepareStatement(sql);

2.1.4 将编译好的sql语句传给服务器,并且执行sql

对于insert、update、delete(对数据库进行改动的操作)都是使用executeUpdate方法
对于select则是使用executeQuery方法

 int n = preparedStatement.executeUpdate(); //返回结果为整数,表示当前操作影响到了几行数据System.out.println("n="+n);                //查看影响行数

执行这个方法,就在内部会向服务器发送请求,请求中就是包含了解析后的sql语句
等待数据库执行sql;执行完成就会返回响应,这个方法再获取到响应,并且把数据库返回的结果通过返回值体现出来

2.1.5 释放前面占用的各种资源

注意:释放 语句对象 和 连接对象 dataSource不必释放
释放顺序和创建顺序相反

 preparedStatement.close();connection.close();

完成以上操作就可以运行代码了,运行前,people表中数据为空
在这里插入图片描述
运行后,n=1说明1行受影响
在这里插入图片描述
再次查询people表后发现数据添加成功
在这里插入图片描述

2.1.6 完整代码

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) throws SQLException {//接下来通过 JDBC 进行一个简单的插入数据的操作//JDBC 步骤比较多,每个步骤都不难,都是固定讨论//1.创建“数据源(DataSource)DataSource dataSource = new MysqlDataSource(); //向上转型//向下转型((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");//2. 和MySQL服务器建立连接Connection connection= dataSource.getConnection();//3.构造sql语句,并且对字符串类型的sql进行识别和编译(PrepareStatement才能编译,Statement不能编译)String sql = "insert into people values(1,'小明')";PreparedStatement preparedStatement = connection.prepareStatement(sql);//4. 将编译好的sql语句传给服务器,并且执行sqlint n = preparedStatement.executeUpdate(); //返回结果为整数,表示当前操作影响到了几行数据System.out.println("n="+n);//5. 释放前面占用的各种资源preparedStatement.close();connection.close();}
}

手动输入的代码:

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;public class JDBCDemo {public static void main(String[] args) throws SQLException {//接下来通过 JDBC 进行一个简单的插入数据的操作//JDBC 步骤比较多,每个步骤都不难,都是固定讨论//1.创建“数据源(DataSource)DataSource dataSource = new MysqlDataSource(); //向上转型//向下转型((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");//2. 和MySQL服务器建立连接Connection connection= dataSource.getConnection();//手动输入信息System.out.println("请输入id");Scanner scanner = new Scanner(System.in);int id = scanner.nextInt();System.out.println("请输入姓名");String name = scanner.next();//3.构造sql语句,并且对字符串类型的sql进行识别和编译(PrepareStatement才能编译,Statement不能编译)String sql = "insert into people values(?,?)";//?代表占位符PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,id);preparedStatement.setString(2,name);//4. 将编译好的sql语句传给服务器,并且执行sqlint n = preparedStatement.executeUpdate(); //返回结果为整数,表示当前操作影响到了几行数据System.out.println("n="+n);//5. 释放前面占用的各种资源preparedStatement.close();connection.close();}
}System.out.println("n="+n);//5. 释放前面占用的各种资源preparedStatement.close();connection.close();}
}

2.2 通过 JDBC 进行 查询数据 操作

查询操作由于要在idea里面返回结果,所以不同于增删改操作;
代码如下:

import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCDemo2 {public static void main(String[] args) throws SQLException {DataSource dataSource = new MysqlDataSource();((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");Connection connection = dataSource.getConnection();String sql = "select * from people";PreparedStatement preparedStatement = connection.prepareStatement(sql);ResultSet resultSet=preparedStatement.executeQuery();while(resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id+" "+name);}resultSet.close();preparedStatement.close();connection.close();}
}

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

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

相关文章

DeepSeek-R1 面试题汇总

Deepseek-r1 面试宝典 原文地址:https://articles.zsxq.com/id_91kirfu15qxw.html DeepSeek-R1 面试题汇总 DeepSeek-R1 面试题汇总 GRPO(Group Relative Policy Optimization)常见面试题汇总篇 DeepSeek-R1 DeepSeek-R1-Zero 常见面试题汇总…

SSL/TLS

http ssl传输层 -> https 安全套接层 SSL/TLS 1、核心角色与文件2、证书生成流程2.1、生成CA根证书2.2、生成服务端证书2.3 生成客户端证书(双向认证) 3、SSL/TLS 认证模式3.1、单向认证(默认 HTTPS)3.2、双向认证&#xff0…

HTML 音频(Audio)学习笔记

一、HTML 音频概述 在 HTML 中&#xff0c;音频可以通过多种方式播放&#xff0c;但要确保音频在不同浏览器和设备上都能正常播放&#xff0c;需要掌握一些技巧。HTML5 引入了 <audio> 元素&#xff0c;为音频播放提供了一种标准方法&#xff0c;但在 HTML4 中&#xff…

php开发rest api,哪个框架最好

在 2025 年&#xff0c;选择适合开发 REST API 的 PHP 框架需要根据项目需求、性能要求和团队技术栈进行权衡。以下是一些推荐的 PHP 框架及其适用场景&#xff1a; 1. Laravel 特点&#xff1a;功能丰富&#xff0c;生态系统强大&#xff0c;内置 API 资源&#xff0c;支持 …

前端入门之CSS

CSS: HTML负责定义页面结构;JS负责处理页面逻辑和点击事件;CSS负责用于描述 HTML 元素的显示方式,通过 CSS 可以控制颜色、字体、布局等。 核心语法: 选择器: 类选择器主要用于选中需要添加样式的 HTML 元素。主要分为:类选择器(.class-name { ... })、标签选择器(…

MCP协议的Streamable HTTP:革新数据传输的未来

引言 在数字化时代&#xff0c;数据传输的效率和稳定性是推动技术进步的关键。MCP&#xff08;Model Context Protocol&#xff09;作为AI生态系统中的重要一环&#xff0c;通过引入Streamable HTTP传输机制&#xff0c;为数据交互带来了革命性的变化。本文将深入解读MCP协议的…

MySQL - 索引原理与优化:深入解析B+Tree与高效查询策略

文章目录 引言一、BTree索引核心原理1.1 索引数据结构演化1.2 BTree的存储结构通过主键查询&#xff08;主键索引&#xff09;商品数据的过程通过非主键&#xff08;辅助索引&#xff09;查询商品数据的过程 MySQL InnoDB 的索引原理 二、执行计划深度解析三、索引失效的六大陷…

《K230 从熟悉到...》识别机器码(AprilTag)

《K230 从熟悉到...》识别机器码&#xff08;aprirltag&#xff09; tag id 《庐山派 K230 从熟悉到...》 识别机器码&#xff08;AprilTag&#xff09; AprilTag是一种基于二维码的视觉标记系统&#xff0c;最早是由麻省理工学院&#xff08;MIT&#xff09;在2008年开发的。A…

Linux驱动复习

应用层调用内核层函数称为系统调用 1.硬件设备管理 1&#xff0c;字符设备驱动&#xff08;一个一个字节&#xff09;——芯片内部外设 &#xff1a;WDT,Timer&#xff0c;adc,iic&#xff0c;SPI,R,UART,LCD,CAMERA,USB,Keyboard&#xff0c;Mouse 2&#xff0c;块设备驱动&a…

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(3)

1.问题描述&#xff1a; PC场景&#xff0c;青少年模式系统API不支持吗&#xff1f; 解决方案&#xff1a; PC场景&#xff0c;青少年模式系统API不支持&#xff0c;另外文档上的几个API也不支持。 2.问题描述&#xff1a; 华为一键登录 Beta7本地运行到手机可以拿到匿名手…

【gdutthesis模板】论文标题太长导致换页问题解决

标题太长导致换页问题解决方案如下&#xff1a; 调小下方数值即可

SAP学习笔记 - 豆知识18 - (TODO)Msg 番号 ME154 構成品目无法決定

1&#xff0c;现象 構成品目の決定は不可能です Msg 番号 ME154 構成品目无法決定 2&#xff0c;到Deepseek里找一下解决方案 SAP ME21N中错误「组件物料的确定不可行&#xff08;ME154&#xff09;」的解决步骤 此错误在创建分包采购订单时出现&#xff0c;通常由于系统无…

10.多线程

预备知识 预备知识一 预备知识二 预备知识三 如何理解进程和线程的关系&#xff0c;举一个生活中的例子 家庭&#xff1a;进程家庭成员&#xff1a;线程 每个家庭成员都会为这个家庭做贡献&#xff0c;只不过大家都在做不同的事情&#xff08;比如&#xff1a;我们在上学&…

Python入门(8):文件

1. 文件基本概念 文件&#xff1a;存储在计算机上的数据集合&#xff0c;Python 通过文件对象来操作文件。 文件类型&#xff1a; 文本文件&#xff1a;由字符组成&#xff0c;如 .txt, .py 二进制文件&#xff1a;由字节组成&#xff0c;如 .jpg, .mp3 2. 文件打开与关闭…

市场交易策略优化与波动管理

市场交易策略优化与波动管理 在市场交易中&#xff0c;策略的优化和波动的管理至关重要。市场价格的变化受多种因素影响&#xff0c;交易者需要根据市场环境动态调整策略&#xff0c;以提高交易的稳定性&#xff0c;并有效规避市场风险。 一、市场交易策略的优化方法 趋势交易策…

HTTP数据传输的几个关键字Header

本文着重针对http在传输数据时的几种封装方式进行描述。 1. Content-Type(描述body内容类型以及字符编码) HTTP的Content-Type用于定义数据传输的媒体类型&#xff08;MIME类型&#xff09;&#xff0c;主要分为以下几类&#xff1a; (一)、‌基础文本类型‌ text/plain‌ …

面向教育领域的实时更新RAG系统:核心模块设计与技术选型实践指南

目录 面向教育领域的实时更新RAG系统&#xff1a;核心模块设计与技术选型实践指南 一、业务需求分析 二、系统架构设计&#xff08;核心模块&#xff09; 三、核心模块详解与技术选型建议 &#xff08;一&#xff09;实时更新向量知识库 &#xff08;二&#xff09;教材与…

k8s patch方法更新deployment和replace方法更新deployment的区别是什么

在Kubernetes中&#xff0c;patch 和 replace 方法用于更新资源&#xff08;如 Deployment&#xff09;&#xff0c;但它们的实现方式和适用场景有显著差异。以下是两者的核心区别&#xff1a; 1. 更新范围 replace 方法 完全替换整个资源配置。需要用户提供完整的资源定义&…

解决安卓手机WebView无法直接预览PDF的问题(使用PDF.js方案)

在移动端开发中&#xff0c;通过 webview 组件直接加载PDF文件时&#xff0c;不同平台的表现差异较大&#xff1a; iOS & 部分安卓浏览器&#xff1a;可正常内嵌预览&#xff08;依赖系统内置PDF渲染能力&#xff09; 大多数安卓设备&#xff1a;由于缺乏原生PDF插件&…

基于javaweb的SSM+Maven机房管理系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…