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

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.xdnf.cn/news/8487.html

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

相关文章

Webserver(5.6)服务器压力测试

目录 webbench是linux上一款知名的优秀的web性能压力测试工具。 测试处在相同硬件上,不同服务的性能以及在不同硬件上同一个服务的运行状况 展示服务器的两项内容:每秒钟响应请求数和每秒钟传输数据量 webbench首先fork多个子进程,每个子进程…

MySQL数据库基础(一) MySQL安装及数据类型

目录 一、MySQL数据裤简介 二、MySQL数据的安装 2.1、MySQL安装 2.2、修改MySQL密码登录策略 三、数据库基础管理 3.1、连接方式及数据储存流程 3.2、库管理命令 3.3、表管理命令 3.4、记录管理命令 四、MySQL数据类型 4.1、常见信息种类 4.2、字符型 4.3、数值型 4.4、日期时间…

好用的远程控制安卓和IOS端的手机软件有哪些?

在数字化时代,我们的工作和娱乐活动越来越依赖于移动设备。无论是在家中、办公室还是旅途中,能够远程控制我们的设备成为了一种高效便捷的需求。市场上涌现出了许多远程控制软件,它们各具特色,旨在提供最佳的用户体验。那么&#…

领夹无线麦克风哪个牌子好?双十一选无线领夹麦克风避开选购陷阱

在多媒体和远程通信日益普及的今天,无线领夹麦克风已成为提升音质和便利性的关键,它们在视频制作、网络直播、在线教育等多个领域中扮演着重要角色。面对市场上众多的产品和技术参数,消费者往往感到无从下手。不过不用过于担心,在…

开发中使用UML的流程_01概述

目录 CIM-1:定义业务流程 CIM-2:分析业务流程 ​CIM-3:定义系统范围 ​PIM-1:分析系统流程 PIM-2:分析业务规则 PIM-3:定义静态结构 PIM-4:定义操作和方法 开发中使用UML的流程,主要分为7部分,具体如下: CIM-1:定义业务流程 定义及分析业务流程是为了尽快理…

ArcGIS/QGIS按掩膜提取或栅格裁剪后栅格数据的值为什么变了?

问题描述: 现有一栅格数据,使用ArcGIS或者QGIS按照矢量边界进行按掩膜提取或者栅格裁剪以后,其值的范围发生了变化,如下: 可以看到,不论是按掩膜提取还是进行栅格裁剪后,其值的范围均与原来栅…

劫持微信聊天记录并分析还原 —— 合并解密后的数据库(三)

本工具设计的初衷是用来获取微信账号的相关信息并解析PC版微信的数据库。 程序以 Python 语言开发,可读取、解密、还原微信数据库并帮助用户查看聊天记录,还可以将其聊天记录导出为csv、html等格式用于AI训练,自动回复或备份等等作用。下面我…

python数据结构基础(7)

本节学习最后一种数据结构---图,在很多问题中应用图可以帮助构建思维空间,快速理清思路,解决复杂问题. 图就是一些顶点的集合,这些顶点通过一系列边链接起来.根据边的有向和无向,图分为有向图和无向图.有时图的边上带有权重,本节暂时不将权重作为重点. 计算机通过邻接表或者邻…

NAS的软件和生态才是王道!谈谈群晖是如何凭实力“躺平”的

NAS的软件和生态才是王道!谈谈群晖是如何凭实力“躺平”的 哈喽小伙伴们好,我是Stark-C~ 近几年随着大家对于数据存储和管理需求的增加,以及各大网盘变相收费和涨价,并且还不合时宜的爆出隐私泄露问题。而NAS(网络附…

阅读笔记 Contemporary strategy analysis Chapter 14

来源:Robert M. Grant - Contemporary strategy analysis (2018) Chapter 14 External Growth Strategies: Mergers, Acquisitions, and Alliances 合并、收购和联盟 Ⅰ Introduction and Objectives 企业并购与联盟是公司实现快速扩张的重要战略工具。通过这些手段…

Java 8 Stream API 详解

在 Java 8 中,引入了一个全新的 API——Stream API,它与传统的 java.io 包下的 InputStream 和 OutputStream 没有任何关系。Stream API 的引入主要是为了提高程序员在操作集合(Collection)时的生产力,而这一提升很大程…

VMware替代实战手册:更高效的MySQL数据库迁移方案

数据库作为数字化用户的核心资产,其迁移是一项复杂且重要的任务,特别是在VMware平台替换及IT基础设施更新换代之时,尤其需要保障数据库迁移过程的平稳、流畅。 深信服推出的数据库管理平台(DMP)是为关系型数据库量身打…

GaussDB高智能--库内AI引擎:模型管理数据集管理

3.2 模型管理 在机器学习算法进行训练后,生成的模型需要进行存储,以便后续推理进行使用。训练过程的时序图如下: 在训练过程中,最后一步是通过调用store_model接口,在系统表gs_model_warehouse中插入一条记录&#…

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

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

求助帖【如何学习核磁共振的原理】

最近提前进组了 我完全不懂磁共振的相关知识 想问问各位大佬有没有推荐的学习路线 或者是学习资料、论坛都可以的(我做的方向是磁共振成像技术) 老师给了一本书,但是有点看不懂,全英文的 叫Principles Of Magnetic Resonance …

【自动化测试】如何在jenkins中搭建allure

相信大家在做自动化测试过程中,都会用到自动化测试环境,目前最常见的就是通过容器化方式部署自动化测试环境,但对于一些测试小白,不是很会搭建持续集成环境,特别是从0-1的过程,需要自行搭建很多依赖环境&am…

人才流失预测模型(机器学习)

1. 项目描述 ​ 企业的快速发展离不开人才的支撑,可是现在我国的企业的人才流失严重,人才流失问题现在已经成为了关系企业发展的一个重大的问题。这些企业要想在目前激烈的竞争中快速发展,就需要依靠自身的人力资源的来竞争。只有拥有比对方…

【Mac】安装 VMware Fusion Pro

VMware Fusion Pro 软件已经正式免费提供给个人用户使用! 1、下载 【官网】 下拉找到 VMware Fusion Pro Download 登陆账号 如果没有账号,点击右上角 LOGIN ,选择 REGISTER 注册信息除了邮箱外可随意填写 登陆时,Username为…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所…

【el-pagination的使用及修改分页组件的整体大小修改默认样式的宽度详细教程】

今天遇到个bug,使用element-puls中的分页的时候,长度会超出盒子,今天教大家如何修改el-pagination的宽度,以及修改分页组件的整体大小 直接修改 style"width: 100%; margin-top: 10px"不生效 控制台修改el-pagination…