当前位置: 首页 > news >正文

如何在IDEA上使用JDBC编程【保姆级教程】

目录

前言

什么是JDBC编程

本质

使用JDBC编程的优势

JDBC流程

如何在IEDA上使用JDBC

 JDBC编程

1.创建并初始化数据源

 2.与数据库服务器建立连接

3.创建PreparedStatement对象编写sql语句

4.执行SQL语句并处理结果集

executeUpdate

executeQuery

5.释放资源


前言

在前面,我们都是在MYSQL上进行编写SQL命令来操作数据库的,那么接下来就来讲解一下如何在IDEA上来操作MYSQL数据库。无论使用哪种框架操作数据库,最底层的API实现都是JDBC,所以掌握好JDBC是至关重要的。

什么是JDBC编程

JDBC,即Java Database Connectivity,java数据库连接。是java用于与关系型数据库进行交互的API,定义了一套连接和操作数据库的规范(接口),允许Java程序连接到不同的数据库(如MySQL,Oracle,SQL Service 等)。

本质

  1. 定义了一套操作所有关系型数据库的API;
  2. 要由关系型数据库厂商来实现JDBC的实现类,实现这套接口(驱动包jar);
  3. 执行语句的代码是驱动包jar中的实现类。

使用JDBC编程的优势

  1. 可移植性:JDBC具有很好的移植性,在任何支持java的平台上都能使用JDBC进行操作数据库。
  2. 错误处理和调试:JDBC提供了详细的错误信息和异常处理机制,帮助开发者更好地诊断和解决数据库访问过程中出现的问题。
  3. 性能优化:支持批处理、结果集缓存等特性,可以提高数据访问的性能。可以使用 PreparedStatement 来重用 SQL 语句,减少解析时间,提高运行效率。
  4. 易于使用:JDBC 提供了简单易用的 API,使得开发者可以轻松地执行 SQL 查询、更新数据等操作,降低了数据库访问的复杂度。

JDBC流程

  1. 加载JDBC驱动:可以通过调用Class.forName()方法来加载特定的JDBC驱动,这是最常见的驱动方法。
     Class.forName("com.mysql.cj.jdbc.Driver");

     2.建立数据库连接:可以使用DriverManager.getConnection()来获取连接,通过指定数据库URL、用户名和密码来创建一个连接对象。

     String url = "jdbc:mysql://localhost:3366/databaseName";String user = "root";String password = "root";Connection conn = DriverManager.getConnection(url, user, password);

     3.创建操作对象:使用自己已经建立的数据库连接来创建Statement、PreparedStatement 或 CallableStatement 对象以执行 SQL 语句。

     Statement statement=conn.createStatement();PreparedStatement preparedStatement=conn.prepareStatement(执行语句);

     4.执行sql语句

    根据需要选择合适的方法执行 SQL 语句:

  • executeQuery: 用于执行查询语句,返回 ResultSet
  • executeUpdate: 用于执行更新语句(如 INSERT、UPDATE、DELETE)。
  • execute: 通用方法,可以执行任何类型的 SQL 语句。 
     ResultSet rs = stmt.executeQuery("SELECT * FROM table_name");int rowsAffected = stmt.executeUpdate("INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2')");

    5.处理结果集:若我们使用的是executeQuery方法来查询,那么想要在java打印出结果,需要使用到ResultSet中的getString等方法来进行获取(对应什么类型就用什么方法,即如果是整型数据,那就用getInt())。

     6.关闭连接:当处理完以上的步骤之后,需要关闭所打开的数据库资源。(在打开的时候是从外到内,那么关闭时就应该先关内,再关外)。


了解完什么是JDBC,那么如何在IDEA上使用呢?

如何在IEDA上使用JDBC

这里选择操作的数据库是MySQL的,所以我们首先需要去下载对于驱动包jar

可以去MAVEN官网进行下载。

1.点击进入MAVEN

2.在搜索栏输入mysql

3.按照自己的需求下载,这里从过去的版本中查看

 

这里由于我使用的是MySql5.7,所以我需要从5.0x中下载驱动包jar。

 4.打开jar包所在的文件夹

打开之后,复制jar包,打开IDEA,并创建一个lib目录

 

5.创建完lib目录之后,点击lib目录,并点击ctrl+v,将jar放进lib目录中

 

当我们点击完就会看到,此时在lib目录下有着我们的jar包,但此时还不能看到jar中的各种类,我们需要继续进行操作。

 

到这里,jar中的各种方法我们就能在java中使用了。 


 JDBC编程

进行JDBC编程,有以下步骤:

  1. 创建并初始化一个数据源
  2. 与数据库服务器建立连接
  3. 创建statement对象编写SQL语句
  4. 执行SQL语句并处理结果集
  5. 释放资源

1.创建并初始化数据源

由于Database是一个接口,不能直接实例,但底层有MysqlDatabase类实现了接口,那么我们这里就可以new一个MysqlDatabase类。

  public static void main(String[] args) {// 创建MySQL数据源对象DataSource dataSource=new MysqlDataSource();// 设置数据源的URL、用户名和密码((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");// 另一种创建和配置MySQL数据源的方法MysqlDataSource mysqlDataSource=new MysqlDataSource();// 直接在创建对象后设置URL、用户名和密码mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useURL=false");mysqlDataSource.setUser("root");mysqlDataSource.setPassword("123456");}

这里我们创建数据源有两种方式,但推荐第一种,要注意“高内聚低耦合”原则。 第一种若后序想要进行替换成其他数据库,耦合较低,对其他操作影响不大。但对于第二种,若想要修改成其他数据库,需要对其他操作都进行修改,耦合较高。

URL唯一资源定位符,可以用来定位网络资源的位置,代表着网络中某个资源的绝对路径。

MySQL数据连接的URL参数格式如下:

jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值

 

 除了需要URL,我们还需要设置用户名和密码,用户名都可以,但密码必须是MySQL的登录密码

 2.与数据库服务器建立连接

我们需要使用Connection接口,此处的接口需要选择第一个

并连接数据源

Connection connection=dataSource.getConnection();

当我们写出这行代码,会发现getConnection标红

 

我们可以鼠标放在标红处 

这里说明在连接服务器的时候,不是一定能够连接的上的,所以需要抛出SQLException异常。

这种属于受查异常(即在编译阶段呢不能通过),所以必须显示处理(throws抛出,或者使用try-catch)。

 public static void main(String[] args) throws SQLException {// 创建MySQL数据源对象DataSource dataSource=new MysqlDataSource();// 设置数据源的URL、用户名和密码((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123456");// 获取数据库连接Connection connection=dataSource.getConnection();}

3.创建PreparedStatement对象编写sql语句

PreparedStatement preparedStatement=connection.prepareStatement(要执行的语句);

我们可以预先编写一个语句

        //创建语句String s="insert into student values(1,'张三')";//创建语句对象PreparedStatement preparedStatement=connection.prepareStatement(s);

 s是要执行的语句,而通过preparedStatement(s),能够对语句进行预编译。

预编译的好处:让客户端先解析好语句,降低服务器的工作量。

如果sql语句过多,服务器处理时的压力就会越大,让客户端来对sql语句进行预编译,服务器的压力就越少。

4.执行SQL语句并处理结果集

executeQuery() 方法执行后返回单个结果集的,通常用于select语句

executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete 语句。

executeUpdate

        //返回影响行数int n=preparedStatement.executeUpdate();System.out.println(n);

 当运行之后,可以看到n为1

 假设我们现在要在控制台中输入,那么我们可以改成

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 Code {public static void main(String[] args) throws SQLException {Scanner scanner=new Scanner(System.in);System.out.println("请输入学号:");int id=scanner.nextInt();System.out.println("请输入姓名:");String name=scanner.next();// 创建MySQL数据源对象DataSource dataSource=new MysqlDataSource();// 设置数据源的URL、用户名和密码((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("1517472636");// 获取数据库连接Connection connection=dataSource.getConnection();//创建语句String s="insert into student values("+id+",'"+name+"')";//创建语句对象PreparedStatement preparedStatement=connection.prepareStatement(s);//返回影响行数int n=preparedStatement.executeUpdate();System.out.println(n);//关闭资源preparedStatement.close();connection.close();}
}

但这种写法有缺点:

  1. 代码较乱,容易写错
  2. 可能会引起“sql注入攻击”,即当有人故意使坏,在输入的时候再加入语句drop databse 数据库名等操作,会产生一定能过的负面影响。

针对上述这种情况,我们可以使用占位符来进行替换。

即在s字符串中先用?来进行占位,在后序预编译时再进行替换

 //创建语句String s="insert into student values(?,?)";//创建语句对象PreparedStatement preparedStatement=connection.prepareStatement(s);//设置参数preparedStatement.setInt(1,id);preparedStatement.setString(2,name);

注意:索引时从1开始的。根据所要替换的类型来调用方法。 

完整代码

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 Code2 {public static void main(String[] args) throws SQLException {Scanner scanner=new Scanner(System.in);System.out.println("请输入学号:");int id=scanner.nextInt();System.out.println("请输入姓名:");String name=scanner.next();// 创建MySQL数据源对象DataSource dataSource=new MysqlDataSource();// 设置数据源的URL、用户名和密码((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("1517472636");// 获取数据库连接Connection connection=dataSource.getConnection();//创建语句String s="insert into student values(?,?)";//创建语句对象PreparedStatement preparedStatement=connection.prepareStatement(s);preparedStatement.setInt(1,id);preparedStatement.setString(2,name);//返回影响行数int n=preparedStatement.executeUpdate();System.out.println(n);//关闭资源preparedStatement.close();connection.close();}
}

通过这种方法,能够避免:“sql注入攻击”这种情况。


executeQuery

如果我们想要查看表中的数据,那么需要使用 executeQuery() 方法并用Resultset来接收结果集。

ResultSet表示查询结果的临时表,使用的时候可以当做“集合类”来使用,进行遍历。集合类遍历一般写作:

while(it.hasNext){......it.next();
}

我们可以看student表中现有哪些数据

那么我们在客户端中就需要输出这些数据,代码如下:

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

 在循环中,每次调用next光标就往下一行移动。

注意:光标不是下标,下标是能够随机访问的,但光标只能顺序遍历每一行。

完整代码

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;public class Code1 {public static void main(String[] args) throws SQLException {// 创建MySQL数据源对象DataSource dataSource=new MysqlDataSource();// 设置数据源的URL、用户名和密码((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("123");// 获取数据库连接Connection connection=dataSource.getConnection();String s="select * from student";//创建语句对象PreparedStatement preparedStatement=connection.prepareStatement(s);ResultSet resultSet=preparedStatement.executeQuery();while(resultSet.next()){System.out.println(resultSet.getInt("id")+" "+resultSet.getString("name"));}//关闭资源preparedStatement.close();connection.close();}
}

 打印结果为

确实是表中的数据。 

5.释放资源

        //关闭资源preparedStatement.close();connection.close();

当我们呢不需要使用时,需要释放资源,防止占用资源。


以上就是本篇所有内容~

若有不足,欢迎指正~

相关文章:

如何在IDEA上使用JDBC编程【保姆级教程】

目录 前言 什么是JDBC编程 本质 使用JDBC编程的优势 JDBC流程 如何在IEDA上使用JDBC JDBC编程 1.创建并初始化数据源 2.与数据库服务器建立连接 3.创建PreparedStatement对象编写sql语句 4.执行SQL语句并处理结果集 executeUpdate executeQuery 5.释放资源 前言 在…...

linux web系统安装常见问题解决,租房系统为案例

Warning: require(): open_basedir restriction in effect. 一、执行文件权限 网站目录下 open_basedir增加执行路径 二、文件夹权限放行 三、安装基础环境 composer install 四、数据合并 php think migrate:run 20200402094148 AdminUser: migrating 20200402094148 A…...

Linux驱动开发—平台总线模型详解

文章目录 1.平台总线介绍1.1平台总线模型的组成部分1.2平台总线模型的优势 2.使用平台总线模型开发驱动2.1注册platform设备2.2注册platform驱动2.3效果演示 1.平台总线介绍 Linux 平台总线模型(Platform Bus Model)是一种设备驱动框架,用于…...

说一下网络层,传输层,数据链路层做什么的,之间的关系?

网络层主要负责为数据包选择最佳路径,将数据从源主机传输到目标主机。它的关键任务包括路由选择、拥塞控制和网络互联等。通过网络层的功能,不同网络之间能够实现通信和数据传输。 传输层的作用是在源端和目的端之间提供可靠或不可靠的端到端的数据传输…...

解锁AI新纪元:Milvus Cloud与Zilliz Cloud的高可用之道

在当今数字化时代,系统的持续稳定运行与数据的即时访问性已成为衡量技术服务质量的关键指标。面对复杂多变的运行环境,包括电力波动、网络故障乃至人为操作失误等不可预见因素,数据库系统的高可用性(High Availability, HA)成为了保障业务连续性的重要基石。特别是在大数据…...

svn安装

579 ​​yum install subversion 580 rpm -qa|grep subversion 581 yum -y install subversion 582 rpm -ql subversion 583 /usr/bin/svnversion --version 584 mkdir /data/svnrepos 585 svnadmin create /data/svnrepos/abc 586 svnadmin create /data/svnrepos/gzss 587 cd…...

【隐私计算篇】混淆电路之深入浅出

入门隐私计算的阶段,一般都会涉及对于混淆电路的学习,这是因为混淆电路是多方安全计算中的基础密码原语,也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理,今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…...

基于GRU神经网络的微博分类预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 gru的原理 GRU神经网络微博分类 结果分析 展望 参考论文 背影 传统的方法微博分类预测准确率低,为提高精度,本文用gru进行预测 摘要 LSTM原理,GRU原理,MATALB编程gru的微博分类预测 LSTM的基本定义 LSTM是一种含有LST…...

LVS-DR模式集群:案例与概念

DR模式(直接路由) 概念 Direct Routing,简称DR模式采用半开放式的网络结构,与TUN模式的结构类似,但内网服务器并不是分散在各地,而是与调度器位于同一个物理网络负载调度器与内网服务器通过本地网络连接&a…...

拓扑排序:Kahn算法与DFS算法

引言 拓扑排序是有向无环图(DAG)中的一种线性排序,使得对于图中的每一条有向边 ( u \rightarrow v ),顶点 ( u ) 在排序中出现在顶点 ( v ) 之前。本文将详细介绍两种实现拓扑排序的算法:Kahn算法和基于深度优先搜索&…...

图像处理 -- Sobel滤波器的实现原理与使用案例

Sobel滤波器 概述 Sobel滤波器是一种边缘检测方法,用于图像处理和计算机视觉领域。它通过计算图像灰度值的梯度来检测边缘。Sobel滤波器结合了高斯平滑和微分操作,以减少噪声并增强边缘检测效果。 实现原理 Sobel滤波器通过使用两个3x3卷积核&#x…...

机器学习 第10章-降维与度量学习

机器学习 第10章-降维与度量学习 10.1 k近邻学习 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。通…...

linux驱动:(7)物理地址到虚拟地址映射

单片机、裸机、linux操控硬件方法 在单片机和裸机中操作硬件是通过指针来对寄存器赋值来进行操控 但对于linux中不能这样,不能直接对物理地址直接修改,因为linux使能了mmu,所以不能直接菜操作物理地址 如果要操作硬件,需要先把…...

浏览器用户文件夹详解 - Preferences(十)

1.Preferences简介 1.1 什么是Preferences文件? Preferences文件是Chromium浏览器中用于存储用户个性化设置和配置的一个重要文件。每当用户在浏览器中更改设置或安装扩展程序时,这些信息都会被记录在Preferences文件中。通过这些记录,浏览…...

Robot Operating System——电池电量通知

大纲 应用场景定义字段解释 案例 sensor_msgs::msg::BatteryState 是 ROS 2 中定义的消息类型,用于表示电池状态。它包含了电池电量、电压、电流、温度等信息。 应用场景 机器人 电池监控:在移动机器人中,电池是主要的电源。BatteryState 消…...

二进制安装docker

目录 一、准备 Docker CE 二进制包 二、解压.tgz包 三、复制二进制文件到/usr/bin/目录 四、创建用户组 五、配置相关服务配置文件 六、拷贝配置文件到指定目录 七、启动 dockerd 服务进程 八、shell脚本一键安装 一、准备 Docker CE 二进制包 https://download.docker…...

@SpringBootConfiguration重复加载报错

Junit单元测试Test启动报错,SpringBootConfiguration注解重复问题排查: SpringBootApplication 注解的 exclude 属性用于排除特定的自动配置类,而不是用于排除主配置类本身。因此,不能通过 exclude 属性来排除主配置类的加载。 …...

【SpringBoot】数据验证之分组校验

分组校验 在不同情况下,可能对JavaBean对象的数据校验规则有所不同,有时需要根据数据状态对JavaBean中的某些属性字段进行单独验证。这时就可以使用分组校验功能,即根据状态启用一组约束。 Hibernate Validator的注解提供了groups参数&#…...

MySQL Galera Cluster 部署与介绍

目录 主要特点 组件 一. 环境准备 二. 配置 1. 配置 galera1 主机的my.cnf的文件 2. 配置 galera2 主机的my.cnf的文件 3. 配置 galera3 主机的my.cnf的文件 4. 在给galera1 主机的my.cnf的文件增加节点 5. 写入数据验证同步 6. 配置 galera4 主机的my.cnf的文件 M…...

RuoYi-Vue-Plus (XXL-JOB任务调度中心二:配置管理与定时任务编写、执行策略、命令行任务、邮件报警等等

一、后端xxl job的配置属性介绍 enabled : 是否开启执行器,如果为false,调度中心就调用不了后端定时任务admin-addresses:调度中心的地址,多个则可以逗号拼接: url1,url2,url3access-token: 执行器通讯TOKEN ,必须和x…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...