JDBC编程(Mysql)

目录

1.什么是jdbc

2.使用

2.1下载mysql数据库驱动

2.2导入项目

2.3编写代码

2.3.1数据源

2.3.2和数据库服务器建立连接

2.3.3构建一个操作数据库的sql语句

2.3.4执行sql

2.3.5释放前面创建的各种资源

2.3.6运行java程序

2.4其他操作

2.4.1修改操作

2.4.2删除操作

2.4.3查询操作

感谢您的访问!!


在学习完mysql数据库后,学习使用java来操作数据库尤为重要,这篇文章为大家介绍jdbc编程基础


1.什么是jdbc

实际上在我们日常开发中,手动直接操作数据库的情况是比较少的(测试数据,定位bug之类的),更多的是通过java等业务代码来操作

在java中,是通过jdbc这样的技术来操作mysql的

这是因为mysql的底层是c/c++实现的数据库,本身也提供了一些api供程序员调用,从而操控数据库

什么是api?

api,全名是 Application programming interface,即应用程序编程接口,这是一个通用的概念,而不仅仅是局限在java里面.

我们可以把这个词理解成"一组类"或者"一组方法",这都是别人已经写好的,现成的,可以直接调用,就可以实现一些效果

其中,对于java来说,java提供了:标准库,只要你安装了java,就能使用标准库里面的类和方法,即标准库里面的api

但是我们也可以使用其他大佬写好的类和方法,即第三方的库

当然在其他的编程语言也同样有自己的库,也能使用第三方的api

有的库,提供的api特别多,就现成了一个体系,这种情况,也可以称为"SDK"(软件开发工具包),java中的sdk就是jdk

而不仅仅是mysql,其他的数据库比如oracle,sql server.sqlite...都提供了这样的api供程序员调用

但是这样就会出现一个问题:

不同的数据库提供的api是不同的,虽然提供的功能大同小异,但是细节上差异还是非常大的.这样程序员学习的成本就会很高

这时java就提供了一套api标准接口,就让不同的数据库都按照java提供的api适配过来,就是让每个数据库都额外写一些代码,能够按照java提供的这一套标准把原来的原生api重新封装一下.后续程序员在使用的时候,只需要掌握java提供的这套api,就能适配到其他数据库了

那么这一套api就是jdbc

其中,像这样的接口转化程序,被称为"数据库驱动"

JDBC是java标准库提供的,只要安装了jdk就能使用,但是jdbc要想操作数据库就要下载并导入mysql的驱动包

这个.jar文件,实际上就是类似于.rar一样的压缩包文件,这里包含了许多.class这样的文件(.java编译出来的字节码文件)

写好的java文件,就可以把编译出来的.class文件拷贝给别人,别人就能正常运行使用了

但是一个程序中往往会有很多.class文件,涉及很多复杂度目录结构,直接拷贝一堆.class文件不太好

于是就约定把这些要发布的.class文件按照特定格式打包压缩,就得到了.jar文件,后续直接拷贝.jar文件即可.并且jvm可以识别.jar文件的内部的.class文件并直接运行

.jar文件是最常见的一种发布java程序的方式


2.使用

2.1下载mysql数据库驱动

直接去中央仓库下载即可:https://mvnrepository.com/

由于我用的是mysql5.7,那么这里就下载旧版本即可

往下拉就会看到适配5版本的驱动:

点击即可下载

但是我们会看到下面有个警告:

漏洞!!但是对于我们自己的数据库实际上没啥关系

直接下载即可

2.2导入项目

在java项目中随便创建一个目录

将刚刚下载的驱动放到里面去

此时我们要右键这个目录:

这样的操作是告诉idea,当前这个目录是存放第三方的目录,此时idea就能够识别到我们拷贝进来的驱动包了

这样刚刚的驱动就能直接展开了

上述就是jdbc程序的准备工作,那么接下载我们就可以编写代码了

2.3编写代码

要想编写jdbc,还需要准备好数据库和数据表(虽然jdbc也能进行建表操作,但是一般都是在数据库中就已经创建好的)

2.3.1数据源

即要操作的数据库,数据是在哪里

那么在mysql中就要设置好访问数据库的名字,访问数据库的用户名和密码

但是这个dataSourse是jdbc自带的接口,但是接口是不能new实例的

这个类就来自于mysql的驱动包

这个过程就类似:数据库厂商和jdbc进行对接,就是让数据库厂商实现jdbc中提供的一些接口,进一步实现其中约定好的抽象方法

但是实际上:

 MysqlDataSource mysqlDataSource = new MysqlDataSource();

也是可以的

但是更多的是第一种写法,因为这便于代码和数据库之间的"解耦合"

万一未来有一天需要变更数据库,第一种代码的写法,改动成本就低一点,即后续使用数据源的时候,看到的都是dataSourse类型,至于里面实际上的数据库是什么就不知道了,这样更加便于切换数据库,反之,如果采用mysqlDataSourse这种写法,就可能会经常涉及到MysqlSourse这样的概念,就会使得后续的修改更加复杂

这时候通过url连接到mysql数据库,就要向下转型回来了

其中这里的url是:唯一资源定位符,我们的客户端要通过网络访问到数据库服务器进行操作,那么url就描述了服务器/服务器上的资源在网络中所在的位置

((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/j20240228?charsetEncoding=utf8&useSSL=false");

URl:协议的名称://ip地址:端口号/数据库名?参数=值&参数=值

实际上这一串不需要背下来,后续需要直接拷贝即可

实际上mysql可以手动创建各种数据库用户名,默认会带一个root用户(指的是一个管理员账户(权限最大))

下面的密码就是你的数据库密码

这里为什么要向下转型回来??

因为dataSourse是要能够对接到不同的数据库的,而不同的数据库实际上设置数据源的方式是不一样的,对于mysql是url,user,password,但是对于其他的就不一定了

2.3.2和数据库服务器建立连接

进行客户端-服务器之间的通信的时候,常见的有两种通信方式

(1)有连接(jdbc就属于有连接):类似于打电话,拨号后需要对方接听

(2)无连接:类似于发短信

 Connection connection = dataSource.getConnection();

需要声明异常

注意:这里的connection要选择sql的,

那么这个Connection对象,就表示客户端与服务器之间的:连接对象

但是实际上在getConnection是很可能失败的(服务器没有接受连接)

原因包括但是不限于:

(1)数据库服务器没有正常启动

(2)url写错了

(3)用户名写错了

(4)密码写错了

(5)网络断开了

....

2.3.3构建一个操作数据库的sql语句

虽然是通过java来操作数据库,但是实际上核心还是sql,只不过把sql嵌套在java中

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

此时还需要一个语句对象

有这两种方式

第一个仅仅是代表一个普通的语句对象,但是第二个则是一个带有"预编译"功能的语句对象

把一个字符串的sql发生到数据库服务器上,是先要对sql进行解析以及各种校验(判定sql是否符合语法要求等),而这样的操作是需要一定开销的,虽然这个开销不大,但是一个数据库服务器往往是要同时给多个客户端提供服务的

因此为了减轻数据库服务器的负担,就可以在客户端这边完成检验

  //语句对象PreparedStatement preparedStatement = connection.prepareStatement(sql);
2.3.4执行sql

把刚刚解析好sql语句发生给数据服务器进行操作了

实际上偶遇两种方式:

对于insert,updata.delete统一都是executeUpdate,而selet就是executeQuery

我们这里先进行插入操作

 int n = preparedStatement.executeUpdate();

这里的返回值是一个int类型,表示这个操作影响了几行数据

通过执行这个方法,就会在内部给数据库服务器发起请求,请求中就是包含解析后的sql,等待数据库执行sql,过一会执行完后数据库返回响应,这个方法再获取响应,通过返回值的方式体现出来

2.3.5释放前面创建的各种资源

主要是释放语句对象和连接对象,注意:dataSourse是不必释放的

在java中有垃圾回收机制(GC),可以自动帮我们回收我们不用的内存

但在编程过程中涉及到的有限资源不仅仅是内存

如果是内存,那么GC自动回收

但如果是其他资源,java无能为力,就需要手动释放了

注意这里的释放顺序,要确保先创建的后释放

2.3.6运行java程序

但是在这里,当前插入的内容是在代码中写死的

如果想要插入不同的数据就需要修改代码重新编译,但是很多时候是需要在程序运行的时候让用户自己插入数据的

拼接字符串

 int id = scanner.nextInt();String name = scanner.nextLine();String sql = "insert into jdbctest values(" + id + ",'" + name + "')";//语句对象PreparedStatement preparedStatement = connection.prepareStatement(sql);

这样就能完成预期效果了

但是实际上这种方式不可行

首先可读性非常差,很容易拼错;其次也不太安全,可能会引起sql注入攻击这样的漏洞

还是比较推荐使用prepareStatement提供的api来完成动态内容的设置

 
 int id = scanner.nextInt();String name = scanner.nextLine();String sql = "insert into jdbctest values(?,?)";//语句对象PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,id);//表示第一个问号preparedStatement.setString(2,name);

这种方式jdbc内部会进行校验,避免上述危险操作

2.4其他操作
2.4.1修改操作
 
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/j20240228?charsetEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("2222");​//建立联系Connection connection =  dataSource.getConnection();​//构造sqlint id = scanner.nextInt();String name = scanner.nextLine();String sql = "update JDBCTest set name = ? where id = ?";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(2,id);statement.setString(1,name);​//执行sqlint n = statement.executeUpdate();System.out.println(n);​//释放资源statement.close();connection.close();}
2.4.2删除操作
 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/j20240228?charsetEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("2222");​//建立连接Connection connection = dataSource.getConnection();​//构造sqlint id = scanner.nextInt();String sql = "delete from jdbcTest where id = ?";PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(1,id);​//执行sqlint n =  statement.executeUpdate();System.out.println(n);​//释放资源statement.close();connection.close();}
2.4.3查询操作

查询操作又和其他的不太一样

前面的操作都是一样的,但是在执行sql语句的时候

  
//构造sql语句String sql = "select * from jdbcTest";PreparedStatement statement = connection.prepareStatement(sql);​//执行sql语句ResultSet resultSet = statement.executeQuery();

这里会返回一个结果集合

我们需要通过resultSet.next来得到里面的数据

 ResultSet resultSet = statement.executeQuery();while(resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id);System.out.println(name);}

这个next就像一个指针,一开始是指向数据的上方,后面会往下走,直到数据遍历完

注意:在最后释放资源的时候,要释放resultSet

 //释放资源resultSet.close();statement.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/j20240228?charsetEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("051215");//建立连接Connection connection = dataSource.getConnection();//构造sql语句String sql = "select * from jdbcTest";PreparedStatement statement = connection.prepareStatement(sql);//执行sql语句ResultSet resultSet = statement.executeQuery();while(resultSet.next()){int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println(id);System.out.println(name);}//释放资源resultSet.close();statement.close();connection.close();}

感谢您的访问!!

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

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

相关文章

基于Springboot和Redis实现的快递代取系统

1.项目简介 本项目基于springboot框架开发而成,前端采用bootstrap和layer框架开发,系统功能完整,界面简洁大方,比较适合做毕业设计使用。 本项目主要实现了代取快递的信息管理功能,使用角色有三类:一是客…

基于Springboot和Redis实现的在线选课系统

1.项目简介 1.1 介绍 毕业设计真的就是demo吗?作为工作前的最后一个校园项目,毕业设计应当尽可能的贴近企业实战,业务不必很复杂,但要做到麻雀虽小五脏俱全。本期学长跟大家一起分享如何开发一个在线选课系统,需求也…

中国联通智慧矿山行业解决方案

中国联通国际公司以其全球化服务能力,针对矿山行业的特殊挑战提供了定制化的解决方案,尤其是在网络通信基础设施搭建和智能应用部署方面,助力企业克服远程作业环境下的通信难题,并有效拓展海外市场。 对于矿山类企业而言&#xf…

如何引入ElementUI组件库,快速上手Element

前言:在上篇文章中分享了如何快速上手Vue框架项目,本篇文章则介绍的是Element的使用,通过本篇文章的分享,我们就可以将Vue和Element结合使用,快速构建出精美的网页界面 目录 一.Element和ElementUI 二.如何引入Eleme…

算法---滑动窗口练习-6(找到字符串中所有字母异位词)

找到字符串中所有字母异位词 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;找到字符串中所有字母异位词 2. 讲解算法原理 有效字符个数count更新条件&#xff1a;满足【hash1表&#xff08;遍历s的表&#xff09;中对应元素出现次数<hash2表&am…

Python基础(八)之流程控制

Python基础&#xff08;八&#xff09;之流程控制 Python控制流程分为三种接口&#xff1a; 顺序结构选择结构循环结构 1、顺序结构 程序代码自上而下运行&#xff0c;逐条执行每一条Python代码&#xff0c;不重复执行任何代码&#xff0c;也不会跳过任何代码。 当语句与语…

【现代C++】智能指针

在现代C中&#xff0c;智能指针是用来管理动态分配的内存&#xff0c;自动进行资源回收&#xff0c;以减少内存泄漏和提升代码安全性。主要有三种类型的智能指针&#xff1a;std::unique_ptr、std::shared_ptr和std::weak_ptr。以下是这些智能指针的详细介绍&#xff1a; 1. s…

使用 VS Code + Github 搭建个人博客

搭建个人博客的方案 现在&#xff0c;搭建个人博客的方式有很多&#xff0c;门槛也很低。 可以选择已有平台&#xff1a; 掘金语雀知乎简书博客园SegmentFault… 也可以选择一些主流的博客框架&#xff0c;自行搭建。 HexoGitBookVuePressdumi… 如何选择&#xff1f; 我…

【TB作品】MSP430,波形发生器,单片机,Proteus仿真

文章目录 题目效果梯形波100个点产生方法锯齿波100个点产生方法c代码和proteus仿真 题目 114 波形发生器的制作 设计要求 设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。设置5个开关K1~K5(从 上到下),分别对应正弦波、方波、三角波、梯形波、锯齿波,按一下…

在Linux中进行OpenSSH升级

由于OpenSSH有严重漏洞&#xff0c;因此需要升级OpenSSH到最新版本。 OpenSSL和OpenSSH都要更新&#xff0c;OpenSSH依赖于OpenSSL。 第一步&#xff0c;查看当前的OpenSSH服务版本。 命令&#xff1a;ssh -V 第二步&#xff0c;安装、启动telnet&#xff0c;关闭安全文件&a…

Pycharm连接远程服务器Anoconda中的虚拟环境

在配置远程解释器时&#xff0c;踩过一些坑&#xff0c;现在记录一下配置过程&#xff1a; 步骤1&#xff1a; 打开pycharm的File里面的Settings 里面的Project:你的项目名称目录下的Python Interpreter。 步骤二&#xff1a; 点击右上角的“add interpreter”&#xff0c;选择…

详解MySql索引

目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大&#xff0c;且…

代码算法训练营day9 | 28. 实现 strStr() 、459.重复的子字符串

day9&#xff1a; 28. 实现 strStr()KMP的主要应用&#xff1a;什么是前缀表&#xff1a;前缀表是如何记录的&#xff1a; 如何计算前缀表&#xff1a;构造next数组&#xff1a;1、初始化2、处理前后缀不相同的情况3、处理前后缀相同的情况 代码&#xff1a; 459.重复的子字符串…

Python算法100例-4.1 将真分数分解为埃及分数

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.补充知识点5.确定程序框架6.完整的程序 1&#xff0e;问题描述 现输入一个真分数&#xff0c;请将该分数分解为埃及分数。 2&#xff0e;问题分析 真分数&#xff08;a proper…

面向控制台编程?Java的GUI开发

记得之前刚开始学习Java&#xff0c;按部就班去阅读《Java核心技术》这本书的时候&#xff0c;总是听别人提起&#xff0c;java swing那一章不用看了。然后直到对着控制台编程了半年&#xff0c;回来捡起了Swing图形界面&#xff0c;跟着网上搞了坦克大战的游戏&#xff0c;总觉…

ECMAscript6学习

ECMAscript6介绍 ECMA是一个浏览器脚本标准制定的公司&#xff0c;Netscape 创造了 JavaScript 由于商标原因&#xff0c; 后面ECMA公司取名ECMAscript 1 发布&#xff0c;JavaScript 也就是 ECMAscript.到现在最新的版本是6&#xff0c;简称es6. 新增let 与const let 与const …

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状&#xff0c;可自由动态更改画线的粗细、拐角圆滑度、颜色&#xff0c;自由增减节点&#xff0c;不额外增加gameobject&#xff0c;并且在原生的UGUI上以ScreenSpace-Overlay的状态下&#xff0c;显示效果如下所示 …

每日一题:LeetCode2.两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

C#控制台贪吃蛇

Console.Write("");// 第一次生成食物位置 // 随机生成一个食物的位置 // 食物生成完成后判断食物生成的位置与现在的蛇的身体或者障碍物有冲突 // 食物的位置与蛇的身体或者障碍物冲突了&#xff0c;那么一直重新生成食物&#xff0c;直到生成不冲突…

说说JVM的垃圾回收机制

简介 垃圾回收机制英文为Garbage Collection, 所以我们常常称之为GC。那么为什么我们需要垃圾回收机制呢&#xff1f;如果大家有了解过Java虚拟机运行时区域的组成(JVM运行时存在&#xff0c;本地方法栈&#xff0c;虚拟机方法栈&#xff0c;程序计数器&#xff0c;堆&#xf…