Java中的JDBC编程(数据库系列6)

news2025/3/13 19:11:41

目录

前言:

1.什么是Java的JDBC编程

2.JDBC的数据库驱动包的导入过程

3.JDBC代码的编写

3.1创建并初始化一个数据源

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

3.3构造SQL语句

3.4执行SQL语句

3.5释放必要的资源 

3.6整体代码的展示及演示

3.7代码的优化

3.8 查询操作的实现

结束语:


前言:

1.什么是Java的JDBC编程

我们之前学习的SQL语句都是在MYSQL的客户端进行编程的,但是在我们实际开发的过程中,我们都是通过代码来操作的,很少会手动在客户端里输入SQL语句。我们这里的JDBC就是Java Database Connectivity,java数据库连接,是一种用于执行SQL语句的Java API,他是Java中的数据库连接规范,这个API由java.sql.*,javax.sql.*包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。

这里我们解释一下什么是API,它的全称是Application Programming Interface。简单的理解就是给你一个软件你能对他干啥,基于它提供的这些功能你就可以写一些其他代码了。

各种数据库比如MySQL、Oracle、SQL Sever在开发的时候,就会提供一组编程接口(API)。

那么这里小编要问一下大家,大家认为这些API是不是一样的呢?

答案是:否。

所以这也就给广大的程序猿带来了很多麻烦,此时就有一位大佬站了出来,将大家都组织在了一起,这个大佬就是我们的Java,它提供了一个新的API,此时就出现了JDBC。那么之前的那些API要想使用JDBC就得通过数据库厂商提供的一个程序也就是数据驱动包,来完成对API的转换,也就是对原有API的一个包装,然后再提供成JDBC的形状。示意图如下所示:

此时Java程序猿想要进行数据库的开发,就需要在你的项目中导入数据的驱动包,才能进行编码。

JDBC的优势:

  • Java语言访问数据库操作完全面向抽象接口编程。
  • 开发数据库应用不用限定在特定的数据库厂商的API。
  • 程序的可移植性大大增强。 

2.JDBC的数据库驱动包的导入过程

我们首先要获取数据库的驱动包,那么我就可以在mysql的官方网站上获取,或者是Gitup上获取,还可以在maven中央仓库中获取。这个maven就像是我们的应用商店一样里面托管了各种软件程序包。这样我们通过maven就可以下载到我们的软件程序包了。

注意:我们要下载的版本,在大范围上不可以高于我们的数据的大范围版本,大范围的意思就是我最前面的数字,小范围的我们可以随意。

1.搜索框中搜索mysql。

2.点击第二个。

 3.寻找自己匹配的系列,(这里小编的数据库用的是5系列的所以小编就下载5系列的啦)

4.找到jar包进行下载。

这里的jar包就相当于是我们在电脑上创建出来的一个压缩包,将很朵文件都放在了里面。我们以后在发布程序的时候也是将所有的程序打包成一个jar包来进行发布的。

5.导入到项目中

 此时直接复制粘贴到我们的项目中去。

我们在项目中先创建出一个lib包,然后再将其放入到我们的lib包中。

6.将这个目录标记成项目的库,此时idea就可以自动识别jar包了,从而就可以调用里面的类来编写代码了。

注意:

经过上面的这几步之后我们就可在idea中进行编码了,上面的步骤是我们每次新创建一个项目的时候都得这样搞一遍!!! 

3.JDBC代码的编写

实现JDBC编码的基本步骤:

  1. 创建并初始化一个数据源。
  2. 和数据库服务器建立连接。
  3. 构造SQL语句。
  4. 执行SQL语句。
  5. 释放必要的资源。

这里小编解释一下什么是数据源,数据源就是描述数据库服务器在哪里。

3.1创建并初始化一个数据源

我们一般通过下面的代码来进行初始化一个数据源。

DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("");

这里我们需要注意的是我们在选择DataSource的时候idea会给我们提供两个包的DataSource注意我一定要选择 javax.sql 下面的。

此处的DataSource内置了数据库连接池,可以复用连接,提高连接服务器的效率。 

此时会有同学发现我在新建一个对象的时候我们使用的是DataSource而不是直接使用MySQLDataSource来进行对象的创建,那么为什么不直接使用呢?原因是因为在Java这个圈子中已经习惯使用这种向上转型,然后再向下转型了。要是直接使用MySQLDataSource创建也是可以的。如下所示:

MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("");

这里我们在来解释一下代码中出现的这个setUrl是什么意思,setUrl是唯一资源定位符,用来描述网络上的某个资源所在的位置。这里不管是写作setUrl还是setURL都是可以的。 

接下来我们就要往里面加描述一个资源的位置了。

//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0:3306/demo1?characterEncoding=utf8&useSSL=false");

这里小编解释一下资源定位符里面的这段代码的意思,如下图所示:
 

上述的这个代码只是设置数据源,描述数据库服务器在哪,还没有和数据服务器建立真正的连接。

我们还得加上密码和用户名。

//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("123456");

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

上面那么一步完成之后,我们只是相当于获得了数据库服务器的地址,接下来我们就需要和数据库服务器建立连接了,具体操作我们来看下述代码。

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

这里我们在idea上编写的时候会发现getConnection()有报错,如下所示:

 这里我们就要对其进行受查异常的显示处理了。

 这里我们还需要注意的是我们在接收这个连接的时候我们使用的是Connection来进行接收的,这里我们会发现有两个,我们应该选择java.sql包下面的。

3.3构造SQL语句

在此之前我们先来在我们的MySQL客户端来创建出一个student表来。

然后我们在idea中通过SQL语句来进行一个插入操作的编写。

//3. 构造SQL语句
String sql = "insert into student value(1, '张三')";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译

注意:
即使咱们使用代码来操作数据库,还是得靠SQL语句,只不过我们这里换成代码来构造SQL,我们之前学习的SQL各种语法任然有效。 

这里我们看到了一个新的语法叫PreparedStatement,他是对代码预编译的意思,就是将我们上述代码进行一个预解析。那么这里我们为什么要多此一步呢?如果我们请求是个SQL字符串,服务器是可以处理的,服务器就需要对SQL进行解析,理解这段代码的含义并执行这段代码,但是如果是同时有成千上万条请求的话,让服务器自己进行预编译同时在进行执行的话压力就会很大,但是我们如果是提前让客户端进行一个预编译的话,服务器的任务量就会大大降低,这就像是我们在食堂吃饭一样,我们吃完饭之后,就自己把自己的碗筷送到餐具回收出,然后再由食堂的保洁来进行处理,这样就会大大降低保洁工人的工作量,从而也提高了食堂运作的效率。

3.4执行SQL语句

经过上述的一系列的操作我们实现了数据源初始化,数据库的连接,SQL语句的编写以及SQL语句的预编译操作,接下来我们就可以执行这段SQL语句了,如下所示:
 

//4. 执行SQL语句
int ret = statement.executeUpdate();//执行SQL语句
System.out.println(ret);//打印一下执行之后的结果,看是否成功。

上面我们采用了statement里面的executeUpdata()方法这个意思就是将上述预编译好的SQL语句发送给数据库服务器,由服务器来作出响应。这里我们使用了ret来进行接收,如果返回值是1那就说明我们的操作执行成功,否则执行失败。 

还有一点就是我们executeUpdata()方法是针对insert、delete、update这三个操作的,针对于select操作我们使用的是executeQuery()方法。这个我们在后续的过程中慢慢给大家交代。

3.5释放必要的资源 

在最后一步,当我执行完所有的代码之后,我们就要对我们不在使用的资源进行释放,以便于其他资源的使用。

//5. 释放必要的资源
statement.close();
connection.close();

这里我们看到我们上述在创建对象的时候是先创建了connection然后再创建了statement这个对象,但是释放资源的时候是反着释放的。先释放的是后创建的,然后再释放最先创建的对象。

我们这里给大家打个比方如下面的图所示:

 

我们截进去的时候是先开大门然后再开二门,然后如果我们要出来的话就要先锁二门再锁大门,这就像是我们之前所说的一句俗语“大门不出,二门不迈”,与我们上述对资源的关闭十分的相似。 

3.6整体代码的展示及演示

代码展示:

package JDBC;

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

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

//JDBC代码的使用
public class Test1 {
    public static void main(String[] args) throws SQLException {
        //JDBC 需要通过一下步骤来完成开发
        //1. 创建并初始化一个数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");

//        MysqlDataSource mysqlDataSource = new MysqlDataSource();
//        mysqlDataSource.setUrl("");
        //2. 和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3. 构造SQL语句
        String sql = "insert into student value(1, '张三')";//编写SQL语句
        PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
        //4. 执行SQL语句
        int ret = statement.executeUpdate();//执行SQL语句
        System.out.println(ret);//打印一下执行之后的结果,看是否成功。
        //5. 释放必要的资源
        statement.close();
        connection.close();
    }
}


结果展示:

注意:由于小编这里运行了两次代码所以在客户端里查询的时候就会显示出来两条。 

3.7代码的优化

上面我们在写SQL语句的时候是直接将id和姓名写进去了,那么如果我们想要让客户自己输入的话我们又该怎么实现呢?

同样我们先是初始化一个数据源—>然后我们再建立数据库之间的连接—>其次我们在构造SQL语句,只不够这里我们需要稍微的对代码进行一点处理,我们让用户自己输入,如下所示:

//3.从控制台读取用户的输入内容
System.out.println("请输入学生姓名:");
String name = scanner.nextLine();
System.out.println("请输入学号id:");
int id = scanner.nextInt();

 然后我们就需要进行接收:
 

//4. 构造SQL语句
String sql = "insert into student value(?,?)";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
statement.setInt(1,id);
statement.setString(2,name);

注意:
这里面的是一个占位符,在下面调用的statement里面如果是整形则使用setInt如果是字符型则使用的是setString,里面的1和2代表的是在上述占位符中所对应的第几个位置。 

代码整体展示:

package JDBC;

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

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        //JDBC 需要通过一下步骤来完成开发
        //1. 创建并初始化一个数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");
        //2. 和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3.从控制台读取用户的输入内容
        System.out.println("请输入学生姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入学号id:");
        int id = scanner.nextInt();
        //4. 构造SQL语句
        String sql = "insert into student value(?,?)";//编写SQL语句
        PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
        statement.setInt(1,id);
        statement.setString(2,name);
        //这个打印需要加到拼接数据之后
        System.out.println(statement);
        //5. 执行SQL语句
        int ret = statement.executeUpdate();//执行SQL语句
        System.out.println("ret = " + ret);//打印一下执行之后的结果,看是否成功。
        //6. 释放必要的资源
        statement.close();
        connection.close();
    }
}

 结果展示:

3.8 查询操作的实现

在上诉中我们看到返回的结果都是一个整型,表示的是我们插入的数据是否成功,几行受到了影响。但是在查询中我们的返回结果就不单单是一个整形了而是ResultSet对象。

什么是ResultSet对象呢?我们可以将其想象成一张表,在最开始的时候光标指向的是我们表的最上面随着光标移动到next,将整张表都遍历完成之后就会返回false。

具体代码如下所示:

while (resultSet.next()) {
     //把resultSet想象成一个表格,同时表格里有一个光标,初识情况下光标指向表的最上面
     //每次调用next,光标向下走一行
     //当光标指向某一行的时候,就可以通过getXXX 来获取到当前这一行里面的数据了。
     int id = resultSet.getInt("id");
     String name = resultSet.getString("name");
     System.out.println("id = " + id + ", name = " + name);
}

修改SQL语句:

//3. 构造SQL语句
String sql = "select * from student";//编写SQL语句
PreparedStatement statement = connection.prepareStatement(sql);

 记得在执行SQL语句的时候查询操作所对应的statement方法是executeQuery()

//4. 执行SQL语句
ResultSet resultSet = statement.executeQuery();//执行SQL语句

全部代码展示:

package JDBC;

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

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

//查询操作的JDBC
public class Test3 {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        //JDBC 需要通过一下步骤来完成开发
        //1. 创建并初始化一个数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/demo1?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("123456");
        //2. 和数据库服务器建立连接
        Connection connection = dataSource.getConnection();
        //3. 构造SQL语句
        String sql = "select * from student";//编写SQL语句
        PreparedStatement statement = connection.prepareStatement(sql);//对上述的代码进行一个预编译
        //4. 执行SQL语句
        ResultSet resultSet = statement.executeQuery();//执行SQL语句
        //5. 遍历结果集合
        while (resultSet.next()) {
            //把resultSet想象成一个表格,同时表格里有一个光标,初识情况下光标指向表的最上面
            //每次调用next,光标向下走一行
            //当光标指向某一行的时候,就可以通过getXXX 来获取到当前这一行里面的数据了。
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("id = " + id + ", name = " + name);
        }
        //6. 释放必要的资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}


结果展示:

  

结束语:

好啦这节有关于Java的JDBC的编程就分享到这里啦!后续中小编还会继续带着大家一起迈进一个新的阶级JavaEE初阶,大家继续跟紧小编的步伐,一起往前冲!!!希望这节对大家认识Java的JDBC编程有一定的帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

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

相关文章

「深度学习之优化算法」(十四)麻雀搜索算法

1. 麻雀搜索算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   麻雀搜索算法(sparrow search algorithm)是根据麻雀觅食并逃避捕食者的行为而提出的群智能优化算法。提出时间是2020年,相关的论文和研究还比较少,有可能还有一些正在发表中,受疫情影响需要论…

关于学习过程中的小点

nfev : 函数求值次数njev : Jacobian 评估的数量nit :算法的迭代次数 permute(dims)#维度转换 torch.split #[按块大小拆分张量] Pytorch.view Pytorch中使用view()函数对张量进行重构维度,类似于resize()、reshape()。用法如下:view(参数a,参数b,...)&a…

Nacos1.4.2单机与集群的安装部署

CentOS 部署Nacos1.4.2 下载 nacos 下载链接:https://github.com/alibaba/nacos/tags 如何选择我们下载的 nocas 版本? 查看 Spring Cloud Alibaba 与 nacos 版本对应关系:SpringCloudAlibaba 组件对应关系说明 本项目使用 nacos 1.4.2 …

Python(十七)数据类型转换——str()函数和int()函数

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

2023年上半年:C#、Python和一些实用语言

文章目录 C#Pythonerlang和exilirfortranR语言 最近半年的开发任务主要集中在C#和Python上,所以博客内容也几乎围绕这两个部分,偶尔会穿插一些其他语言。下面就对2023年上半年的博客做一个总结。 C# 主要用C#写了一个文本阅读器,提供生成目…

学C的第二十八天【字符串函数和内存函数的介绍(一)】

相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第二十七天【指针的进阶(三)】_高高的胖子的博客-CSDN博客 前言: (1). C语言中对于字符和字符串的处理很是频繁&…

linux驱动开发:驱动开发框架,linux内核字符设备驱动开发过程

一、驱动框架 1.Linux内核模块和字符驱动的关系 模块是Linux进行组建管理的一种方式, 结构体:对设备的管理内核需要抽象出来一个结构体来描述设备所有的共性信息写驱动需要申请一个结构体并赋值(初始化),然后注册给内核让内核统一管理 驱动:由内核统一管理,所以驱动…

NUXT3学习笔记2

1、配置Ant design Vue (两个安装方式随便选一种,yarn会安装的更快) npm i ant-design-vue --save yarn add ant-design-vue 2、使⽤的 Vite,你可以使⽤ unplugin-vue-components 来进⾏按需加载。 yarn add unplugin-vue-components --save 在nuxt.…

设计模式——享元模式

享元模式 定义 享元模式(Flyweight Pattern)是池技术的重要实现方式。 使用共享对象可以有效地支持大量的细粒度对象。 优缺点、应用场景 优点 可以大大减少应用程序创建对象的数量,降低程序内存占用。 缺点 提高了系统的复杂度&…

5分钟上手IP代理服务

一 IP代理服务 在网上找了一个性价比高的IP代理服务,一个IP地址1分钱。 二 API协议 调用方式为http协议,响应数据格式支持JSON和txt,都是比较常用的方式。 三 源码范例 包括一些主流的编程语言,一分钟上手。 我用的python比较…

【Redis应用】查看附近(五)

🚗Redis应用学习第五站~ 🚩本文已收录至专栏:Redis技术学习 查看附近的XXX在我们的实际应用中非常广泛,能支持该功能的技术有很多,而在我们的Redis中主要依靠GEO数据结构来实现该功能! 一.GEO用法引入 GE…

问题解决:win10连接手机热点总是频繁自动断开

问题描述:尝试解决 问题解决:win10连接手机热点总是频繁自动断开 问题描述: 在使用win10笔记本电脑连接手机热点上网时,是不是的网络自动就断掉了,而且重新连上后,用着用着又断了, 这就让人有点恼火了, 尝试解决 重启电脑与手机 以前没出现过而现在有这种情况,可能是电脑或手机…

Spark复习笔记

文章目录 Spark在Hadoop高可用模式下读写HDFS运行流程构成组件作业参数RDD机制的理解算子map与mapPartition区别Repartition和Coalesce区别reduceBykey 与 groupByKeyreduceByKey、foldByKey、aggregateByKey、combineByKey区别cogroup rdd 实现原理宽窄依赖为什么要划分stage如…

Elasticsearch:语义搜索、知识图和向量数据库概述

结合对你自己的私有数据执行语义搜索的概述 什么是语义搜索? 语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。 这种方法基于这样的想法:搜索引擎不仅应该匹配查询中的关键字,还应该尝…

LINUX命令:update-alternatives(软件版本管理工具)

前言   在基于 LINUX 操作系统之上安装所需开发环境组件时,可能会遇到无可避免的场景是:同一个组件,我们需要同时使用到两个或者更多的版本,比如 Java 有 1.6、1.7、1.8 等多版本,又比如 Python 有 2、3 等等&#x…

「2024」预备研究生mem-数学强化-整数、因数与倍数

一、整数、因数与倍数 二、带余除数 三、奇数与偶数 四、不定方程

Nature子刊-柔性薄膜上3D电极的直接激光写入

美国俄勒冈大学研究员设计了一种集成在柔性薄膜上的3D微电极阵列,其制造过程结合了传统的硅薄膜处理技术和双光子光刻在微米分辨率下的3D结构的直接激光书写技术,首次提出了一种产生高深宽比结构的方法。 发表在《自然通讯》杂志上的这项研究&#xff0c…

js实现控制台格式化打印版权信息(2023.7.16)

js代码在控制台格式化打印版权信息 2023.7.16 1、需求分析2、js实例(浏览器版权信息)2.1 百度一下2.1.1 js代码2.1.2 浏览器控制台输出效果 2.2 京东官网2.2.1 js代码2.2.2 浏览器控制台输出效果 2.3 EarthSDK地球页面2.3.1 js代码2.3.2 浏览器控制台输出…

【JMeter】JMeter进行JDBC数据库负载测试

JMeter进行JDBC数据库负载测试 前置准备1.创建线程组2.JDBC连接配置3.新建JDBC链接4.查看汇总报告 前置准备 此示例使用 MySQL 数据库驱动程序。 要使用此驱动程序,必须将其包含.jar文件(例如 mysql-connector-java-X.X.X-bin.jar)复制到 JM…

精选估值,解决买车卖车难题

在现代社会,车辆已经成为了人们生活中不可或缺的一部分。车辆的买卖交易也成为了许多人的生活中不可避免的问题。而估值则是买卖交易的过程中非常重要的一个环节。估值的准确与否直接影响到最后交易的结果。因此,选择一种准确便捷的估值方式就显得尤为重…