Java代码与数据库纽带——JDBC

news2024/11/26 12:44:47

ok,看了题目,就可以知道今天要分享的是JDBC

讲这个这之前,想讲讲之前的。

之前我们操作数据库基本都是通过MySQL客户端,进行编写sql语句来操作的。

但是我们在开发中一般都是通过代码来操控数据库的。

而且在我们日常开发中,还一般通过ORM框架来进行操作,比如像是MyBatis、Django ORM……

代码来操作数据库,有着很多优点

提高工作效率、增强数据安全性……

好了,那么接下来讲讲这个JDBC是什么吧

JDBC(Java Database Connectivity)

是Java用于关系型数据库交互的API。(API:Application Programming Interface 应用程序接口)

这个数据库和代码进行打交道,前提是,这个数据库告诉代码怎么打交道,那么就可以提高数据库提高的一套API来进行交互。

注意,这里是以MySQL这个数据库作为例子,所以说的API也是指的是MySQL这里的提供的,

而且不同的数据库,提供着不同API。

那么这样说的话,那么对于程序员来说也是个苦恼的事,毕竟不同的API也要一些学习成本。

那么可以不可以把这个API统一一下呢?

这时候java站出来了,由于它的生态和市场份额较大,所以自己本身写了一套java的API标准,

使得各种数据库自身的API要适应到了java那一套的。

所以这样来说,对于java的学习者来说,这是个好事,省去一定的时间成本了。

那么之前说了,各种数据库自身的API要适应的java那一套,那它不是平白无故就完成的。

所以必须有点东西使其转换过来。

那么MySQL官方这里提供了这个:

mysql-connector

这个东西就可以完成上诉的转换!

诶,问题来了,那么这个东西怎么来呢?

巧就巧在,这个既不是MySQL自带的,也不是java自带。

而是要通过第三方的途径,进行下载。

这里的第三方途径,一般有以下几种:
1.官方网站

2.GitHub

3.maven中央仓库

这里介绍的是在中央仓库去下载。

中央仓库的地址:https://mvnrepository.com/

当然这是外面的网站,访问起来,稍微慢些。

那么怎么下载呢?

进入官网:

点击搜索框,搜索MySQL

这时候出现这样的页面(红色是我标记的):

选哪个都可以,那么我这里选择经典版

点击后,出现这样的页面

这里往下找,找到自己电脑上对应的MySQL版本。

不知道在哪的话

点击win键,搜索服务,

然后进去,再然后,往下找可以找到了。

然后呢,现在选对版本,大版本要选对,小版本个人选择咯

比如我这里的是MySQL5.7,那么我就选5开头的版本去选择下载

这里呢,我选择5.1.49

点击5.1.49后

在页面点击标记的地方

下载完jar包后,还不能使用它

还要将其导入到java创建的项目中

mysql-connector导入java项目

那么怎么导入java项目呢?

比如现在我创建了这个项目

然后呢

接着

然后我这里已经创建好了

然后呢,如何把下载好的jar导入呢?

这里提供简单粗暴的办法,ctrl+c复制jar包

然后点击创建好的lib目录,ctrl+v

然后

点击ok就行。

这时候导入好了,那么这样就可以了吗?

当然不行,这是idea中这个项目还没把这个这个目录中的内容当作“自己人”。

所以还得下一步

点击这个add as library。

然后出现这个页面

其他不用管,一直点击ok就行。

ok,这样子,就算是导入成功了。

接下来是重头戏

编写JDBC代码

这里我在idea中创建了一个test类来进行编写。

创建数据源对象

为什么先要创建数据源对象呢?

那肯定是要有对象你才能够对相关的类进行操作呀。

public class Test2 {
    public static void main(String[] args) {
        //创建数据源对象
        DataSource dataSource=new MysqlDataSource();
    }
}

这里的DataSourse 是一个接口来的,需要new实现这个接口的子类

一个jar包里的 MysqlDataSourse就是这个。

设置对象的相关属性

数据库在哪?

数据库用户名

数据库密码

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

里面的内容,暂且先不说,说说看为什么这样的写,

这是因为先前这样创建数据源:

DataSource dataSource=new MysqlDataSource();

那么这里涉及到向上转型,

为了设置数据库属性,就搞个向下转型?

多此一举?

当然不是的,有这种写法的好处

就是可以使代码的耦合度降低

毕竟之后再次使用Datasourse,是“看不到”这个MysqlDataSourse这个信息了。

当然,还有另外一种写法

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

那么好现在来解释下这里的三个属性内容

url:

url是唯一资源定位符,用来描述资源在网络的位置。

而且这里的数据库也是可以看作一种网络资源。

那么来解释下里面的内容是什么吧

jdbc:mysql:

描述url的用途,是给jdbc的MySQL使用的

127.0.0.1:3306

这里指的是访问数据的ip地址和数据库服务器的端口。

那为什么使用这个ip呢?

因为我们连接的这个数据库在我们的本机上的,所以我们访问的是本机的服务器地址

而且这个IP地址还是个特殊的地址,叫做:回环地址

还也叫做本机地址,

所以我就要使用这个ip,如果数据库是其他IP地址,那么替换上去就行

/learn

这个指定是这个连接数据库的名字

?characterEncoding=utf8&useSSL=false

这个?是分隔开路径和查询参数的,&是分割查询参数之间的

characterEncoding=utf8是说查询指定字符串为utf8

useSSL=false是说禁止SSL加密。因为本来不是什么重要的数据,所以就不用SSL来加密传输了。

SSL是一种在网络通信中提供安全的协议。

连接服务器

刚刚上面内容只是设置属性,还没有连接上数据库来

现在进行连接操作

 //连接服务器
        Connection connection=dataSource.getConnection();

这里值得注意的是,

Connection要选择包名是java.sql的

以及getConnection()会抛出异常,所以要处理这个异常

构建sql语句以及预编译操作

//构建sql语句
        String sql="insert into stu2 values(1,'张三')";
        PreparedStatement sqlStatement=connection.prepareStatement(sql);

这里的预编译操作是指的是对构造的sql语句进行语法检查。

为什么呢?

因为数据库服务器是连接着非常多的客户端的,每个客户端发来的sql语句都要进行在数据库服务器中进行语法检查,这对数据库的开销是个挑战,所以干脆放在代码层进行检测,使得数据库服务器压力少一些。

这里值得注意的是,这个prepareStatement()是Connection里的方法。

而且sql语句不需要分号了,但是在MySQL客户端是需要的 。

发送sql语句

//发送sql语句
        int n=sqlStatement.executeUpdate();
        System.out.println("受影响行数"+n);

这里的发送操作变成PreparedStatement提供的方法了。

提供的方法里我们目前常用的

这个是对更新操作

其更新操作包括:update、insert、delete、create table、drop table……

返回值是代表影响几行!

这个是查询操作的

返回值是一个结果值!

这个只是简单返回是否成功的。

那么写这个操作是更新操作,且我们想要打印出受几行影响。所以使用这个executeUpdate()方法。

public class Test2 {
    public static void main(String[] args) throws SQLException {
//        创建数据源对象
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("9974");
        //连接服务器
        Connection connection=dataSource.getConnection();
        //构建sql语句
        String sql="insert into stu2 values(1,'张三')";
        PreparedStatement sqlStatement=connection.prepareStatement(sql);
        //发送sql语句
        int n=sqlStatement.executeUpdate();
        System.out.println("受影响行数 "+n);
    }
}

执行效果

MySQL:

同样的,其他也写操作比如删除、更新、创建……也是跟上面差不多

那么还有个查询

查询如何写呢?

查询的话,就要有点点麻烦

   //发送sql语句
        ResultSet resultSet=sqlStatement.executeQuery();
        while (resultSet.next()){
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            System.out.println(id+" "+name);
        }

首先我们查询出来的是一堆数据来的,所以要拿个结果集合整体接收它。

接着要把集合里的东西遍历,打印出来

那么就像是上诉这样,因为有着两列,id和name

那么可以分别接收打印,也可以放到打印语句里直接打印。

结果:

和刚刚给的数据那边查询出来的是一致的。

最后不要忘了要关闭资源,我们的

PreparedStatement、ResultSet、Connection,这几个跟MySQL服务器打交道的,

所以要释放掉资源

那么整段代码如下:

 public static void main(String[] args)throws SQLException {
        Scanner scanner=new Scanner(System.in);
        //创建数据源对象
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("9974");
        //连接服务器
        Connection connection=dataSource.getConnection();
        //构建sql语句
        String sql="select * from stu2";
        PreparedStatement sqlStatement=connection.prepareStatement(sql);
        //发送sql语句
        ResultSet resultSet=sqlStatement.executeQuery();
        while (resultSet.next()){
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            System.out.println(id+" "+name);
        }
        resultSet.close();
        sqlStatement.close();
        connection.close();
    }

那么,回到更新那边。

有个小小问题

发现插入操作给写死了,可以不可以让用户输入呢?

当然可以

这是代码

  public static void main(String[] args) throws SQLException {
        Scanner scanner=new Scanner(System.in);
        //创建数据源对象
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/learn?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("9974");
        //连接服务器
        Connection connection=dataSource.getConnection();
        //构建sql语句
        System.out.println("请输入要插入的数据(id,name):");
        int id=scanner.nextInt();
        String name=scanner.next();
        String sql="insert into stu2 values(?,?)";
        PreparedStatement sqlStatement=connection.prepareStatement(sql);
        sqlStatement.setInt(1,id);
        sqlStatement.setString(2,name);
        //发送sql语句
        int n=sqlStatement.executeUpdate();
        System.out.println("受影响行数 "+n);
    sqlStatement.close();
        connection.close();
        scanner.close();
    }

我们首先让用户输入插入id 和name

然后重要的来了,我们把之前

String sql="insert into stu2 values(1,'张三')";

里面替换为?

这是占位符的意思,然后呢,替换后,就要把输入id和name,放回到两个?里

sqlStatement.setInt(1,id);
sqlStatement.setString(2,name);

就是这样两句的功劳了

1是值第一个?,替换为哪个变量值,注意了int类型就替换为int类型的

同理,2是第二个?同样是什么类型,就要用什么类型来进行替换

就是做出这样的修改就行了,其他的没什么了

运行结果

MySQL

所以这是成功了的意思。

到这里,我的JDBC分享完,即使以后开发不使用这个,但是一些框架也是对其进行封装的,

学习使用JDBC,倒也不是个坏处。

完!

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

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

相关文章

navicat pg库安装mysql fdw 外表扩展

在Windows上手动安装mysql_fdw(MySQL Foreign Data Wrapper)通常涉及一系列步骤,包括下载源码、编译、配置和测试。以下是一个详细的指南: 一、下载mysql_fdw源码 访问mysql_fdw的GitHub发布页面,选择最新版本的源码…

智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3

本系列文章记录“智能提醒助理”产品建设历程,记录实践经验、巩固知识点、锻炼总结能力。 本篇介绍技术栈升级的过程,遇到的问题和解决方案。 一、需求出发点 智能提醒小程序 当前使用的是jdk8,springboot2.3,升级到jdk21和springboot3.3 学…

雷军-2022.8小米创业思考-11-新零售:用电商思维做新零售,极致的效率+极致的体验。也有弯路,重回极致效率的轨道上。

第十一章 新零售 当我们说到小米模式的时候,其实我们说的是两件东西: 一是小米模式的本质,即高效率的商业模式; 另一件是小米这家公司具象的商业模式,这是小米在实践中摸索、建立的一整套业务模型。 从2015年到202…

人工智能——小白学习指南

知孤云出岫 目录 1. **智能评测系统**2. **个性化学习路径推荐**3. **虚拟学习助手**4. **学习行为分析**5. **数据驱动的教学决策**6. **自动化课程推荐**7. **数据隐私与安全保护** 人工智能知识点的总结和学习路线,以数据表格形式呈现,并附带在教育行…

【深度学习基础】常用图像卷积核类型

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 常…

SpringCloud框架学习(第一部分:初始项目搭建)

目录 一、SpringBoot和SpringCloud版本选型 1.Springcloud版本选择 2.Springcloud版本选择 3.Springcloud Alibaba版本选择 4.SpringCloud VS SpringBoot VS SpringCloud Alibaba版本三者制约对应关系 二、SpringCloud介绍 1.单体架构 2.微服务架构 3.springcloud 4.S…

【动手学运动规划】 4.1 图搜的基础

🏰代码及环境配置:请参考 环境配置和代码运行! 4.1.1 基础概念 4.1.1.1 Configuration Space(配置空间) configuration: 机器人上每一点位置的完整说明degrees of freedom: 机器人能够独立移动或旋转的关节数量(下图所示有4个自由度&#x…

如何用彩屏显示精美的动画

1什么样的动画是精美的? 1)视觉暂留 视频播放的原理基于人眼的视觉暂留现象。‌视频是由一系列静态图像(帧)组成的,这些图像以特定的频率(帧率)连续播放,使得人眼无法区分单帧图像&…

信息安全工程师(81)网络安全测评质量管理与标准

一、网络安全测评质量管理 遵循标准和流程 网络安全测评应严格遵循国家相关标准和流程,确保测评工作的规范性和一致性。这些标准和流程通常包括测评方法、测评步骤、测评指标等,为测评工作提供明确的指导和依据。 选择合格的测评团队 测评团队应具备相关…

【CTFN】基于耦合翻译融合网络的多模态情感分析的层次学习

同样用了翻译模块的论文->MTMSA 代码地址->github地址 abstract 多模态情感分析是一个具有挑战性的研究领域,涉及多个异构模态的融合。主要的挑战是在多模式融合过程中出现一些缺失的模式。然而,现有的技术需要所有的模态作为输入,因…

1.每日SQL----2024/11/7

题目: 计算用户次日留存率,即用户第二天继续登录的概率 表: iddevice_iddate121382024-05-03232142024-05-09332142024-06-15465432024-08-13523152024-08-13623152024-08-14723152024-08-15832142024-05-09932142024-08-151065432024-08-131123152024-…

安利一款开源企业级的报表系统SpringReport

SpringReport是一款企业级的报表系统,支持在线设计报表,并绑定动态数据源,无需写代码即可快速生成想要的报表,可以支持excel报表和word报表两种格式,同时还可以支持excel多人协同编辑,后续考虑实现大屏设计…

使用ookii-dialogs-wpf在WPF选择文件夹时能输入路径

在进行WPF开发时,System.Windows.Forms.FolderBrowserDialog的选择文件夹功能不支持输入路径: 希望能够获得下图所示的选择文件夹功能: 于是,通过NuGet中安装Ookii.Dialogs.Wpf包,并创建一个简单的工具类: …

RHCE---搭建lnmp云存储

一、恢复快照后,检查安全性(查看selinux 以及防火墙) 二、搭建LNMP环境 [rootserver ~]# yum -y install nginx mariadb-server php*三、上传软件 1、将nextcloud-25.0.1.zip压缩包传递到根目录下 2、解压缩nextcloud-25.0.1.zip &#xf…

Day95 Docker

Docker的使用 1、Docker是什么 docker是一个用来管理镜像的容器 容器(container):可以装东西 镜像( image ):所谓的镜像,你可以认为就是一个虚拟机 虚拟机:用软件代理硬件来模拟整个计算机的这样一套软件就成为 虚拟机 镜像说白了…

从分析Vue实例生命周期开始,剖析Vue页面跳转背后执行过程

文章目录 1.概要2.Vue实例生命周期3.生命周期函数解释4.存在父子组件情况页面执行过程5. 分析路由跳转页面执行过程6.扩展补充7.小结 1.概要 本文旨在分析Vue页面进行路由切换时,Vue背后的运行过程,旨在让大家更加清晰地明白Vue页面运行过程中钩子方法的…

超分辨重建——复现SwinIR网络推理测试(详细图文教程)

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《图像增强》 &a…

【青牛科技】应用方案 | D75xx-150mA三端稳压器

概 述 D75XX系列是一套三端高电流低压稳压器。它们可以提供 150mA 的输出电流和允许输入电压高达30V。它们有几个固定的输出电压范围为3.0 V至5.0 V。CMOS 技术确保低电压降和低静态电流。 虽然这些设备主要设计为固定电压调节器,但它们可以与外部元件一起使用&…

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测 目录 BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 …

WPF 打包

打包为单个exe文件直接运行 - - -版本.NET8 新建WPF项目 右键 - 发布 选择发布文件夹 选择发布文件夹 选择发布文件夹 配置 配置,保存 发布 WPF 打包为exe安装程序 示例 实现思路 引导项目中嵌入其它项目可运行目录的zip引导项目中解压zip文件到指定文件夹是…