用Java链接MySQL数据库的总结

news2024/11/13 14:31:48

✨个人主页: 不漫游-CSDN博客

前言

在日常开发中,使用Java连接MySQL数据库是一个常见的任务,涉及多个步骤。接着我就带着大家细细看来~

一.下载.jar 包文件

1.什么是.jar 文件

通俗点讲就是一个压缩包,不过里面存放的都是由Java代码编译形成的.class二进制字节码文件.

咱们可以通过Java的第三方库进行下载--->https://mvnrepository.com

记得看清楚MySQL版本,下好自己对应的即可。

二.把.jar包文件导入到自己的Java项目中去

1.在项目处创建一个目录,注意名字不要出现中文或特殊符号。

2.把.jar包文件复制粘贴到目录中去

3.右键刚才创建的目录,点击“添加为库”

4.成功的话,ideal 就可以分析出.jar 包里都有啥,如图~

三.进行链接操作

1.创建数据源对象

 //1.创建数据源对象
        DataSource dataSource = new MysqlDataSource();
            //服务器地址
        ((MysqlDataSource)  dataSource).setUrl("JDBC:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");

        ((MysqlDataSource)  dataSource).setUser("root");//账户

        ((MysqlDataSource)  dataSource).setPassword("root");//密码

其中,MysqlDataSource来自刚刚导入的包 ,并将其赋值给 ​DataSource​接口(JDBC自带的接口)类型的变量 ​dataSource​。

这里进行了向下转型,不用也是可以的,这个看自己选择

MysqlDataSource mysqlDataSource = (MysqlDataSource) dataSource;
mysqlDataSource.setUrl("JDBC:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
mysqlDataSource.setUser("root");
mysqlDataSource.setPassword("root");

接着,还要给这个dataSource 设置必要的属性

a.数据库服务器在哪里

观察第一段代码,URL代表“唯一资源定位符”,也就是我们日常用的链接。

中间那一段很长的代码不要被吓到,请看图解~

注意的是(1)127.0.01这个IP地址是特殊的,表示本机,即  jdbc代码和mysql服务器都在一台电脑上,倘若分开,就另外再写 。

(2)characterEncoding=utf8:这是一个连接参数,指定字符编码为UTF-8。其中UTF-8是一种广泛使用的字符编码,支持多种语言的字符。

useSSL=false:这是另一个连接参数,指定不使用SSL(Secure Sockets Layer)进行连接。SSL是一种加密协议,用于在网络上安全地传输数据。在这个例子中,我们选择不使用SSL,即是不加密。

(3)一般mysql服务器默认端口号是3306.

后面的账号密码就同理了,调用对应的方法,别输错就是啦~ 

b.访问服务器的账户

c.访问服务器的密码 

2.和数据库服务器进行网络连接

        //2.和数据库服务器进行网络连接
        Connection connection = dataSource.getConnection();

通过调用 ​dataSource​对象的 ​getConnection​方法来获取一个数据库连接(相当于打电话,成功通了才能继续做出后序操作)。

​而Connection​对象是JDBC API中的一个核心接口,代表与数据库的连接。

同时也要做出异常处理,直接那么写会编译报错的,这里采用的是在main方法中抛出异常

3.程序构造sql语句

    //3.程序构造sql语句
        String sql = "insert into student values(1,'张三')";
        PreparedStatement preparedStatement =  connection.prepareStatement(sql);

首先这行代码定义了一个sql插入语句,直接将值 ​1​和 ​'张三'​插入到 ​student​表(对应的表在数据库已经创好了)。 

然后,这行代码通过调用 ​connection​对象的 ​prepareStatement​方法来创建一个PreparedStatement​类型的对象。​用于执行预编译的SQL语句。

但是!!!

虽然直接在sql语句中插入值是可行的,但这样无法避免SQL注入攻击,即有的输入不符合格式,很容易造成异常,所以更推荐使用参数化查询(即使用占位符 ​?​)。这样更保证安全性~

        //3.程序构造sql语句
        String sql="insert into student values(?,?)";
        PreparedStatement preparedStatement =  connection.prepareStatement(sql);
        preparedStatement.setInt(1,1);
        preparedStatement.setString(2,"张三");

4.发送sql语句到服务器中,并让服务器执行

        //4.把sql语句发送到服务器上,让服务器执行
        int n=preparedStatement.executeUpdate();
        System.out.println(n);

 这行代码通过调用 ​PreparedStatement​对象的 ​executeUpdate​方法(这里的修改就是广义上的修改,只要改了表结构和数据都算update)来执行SQL插入语句。

​executeUpdate​方法返回一个整数值,表示受影响的行数,来确保修改成功!

5.释放资源

毕竟连接和创建语句的时候都要消耗资源,要是连接操作不用的话就关闭即可~

        //5.释放上述资源
        preparedStatement.close();
        connection.close();

这里就是要注意,释放资源的顺序要和创建资源的顺序相反。 

6.结果展示 

IDEA上成功输出1,表示1行受到影响

同时在MySQL上输入命令行->

select * from student;

 当然,我这里用的是图形化工具--DataGrip ,表中同样插入了数据,即操作成功!

四.通过Java代码对数据库中表进行增删改查操作

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.ResultSet;
import java.sql.SQLException;

public class JDBCTest2 {
    public static void main(String[] args) throws SQLException {
        //1
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("JDBC:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("root");
        //2
        Connection connection=  dataSource.getConnection();
        //3
        String sql="select * from student";
        PreparedStatement statement=connection.prepareStatement(sql);
        ResultSet resultSet=statement.executeQuery();
        //4
        while(resultSet.next()){//next​方法返回一个布尔值,只有不存在即为false 就停止遍历
            System.out.println(resultSet.getInt("id"));
            System.out.println(resultSet.getString("name"));
        }
        //5
        resultSet.close();
        statement.close();
        connection.close();

    }
}

仔细观察,我想查询的是学生表中所有数据,并创建了一个 ​PreparedStatement​对象来执行该查询。但是调用的是​executeQuery​方法返回一个 ​ResultSet​对象,就是一个临时表。

但是在Java中可以当做集合类来看待 ,采取对应的遍历方式去打印表的结果即可~

结果如图--> 

3.改(狭义)

注意的是,这里的改就是修改表中的数据。

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;

public class JDBCTest4 {
    public static void main(String[] args) throws SQLException {
        //1.
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("JDBC:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("root");
        //2.
        Connection connection = dataSource.getConnection();
        //3.
        String sql="update student set name='李四' where id=1";
        PreparedStatement statement = connection.prepareStatement(sql);
        //4.
        int n=statement.executeUpdate();
        System.out.println(n);
        //5.
        statement.close();
        connection.close();
    }
}

和插入数据的一模一样,不同的就是sql语句,换成对应的update语句~把id为1的name改成 “李四”。

结果如图 ,IDEA依旧输出1,表示1行受到影响

而数据库对应的student表也发生对应修改!

4.删

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;

public class JDBCTest3 {
    public static void main(String[] args) throws SQLException {
        //1.
        DataSource dataSource= new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("JDBC:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("root");
        //2.
        Connection connection=dataSource.getConnection();
        //3.
        String sql="delete from student where id=1";
        PreparedStatement statement= connection.prepareStatement(sql);
        //4.
        int n=statement.executeUpdate();
        System.out.println(n);
        //5.
        statement.close();
        connection.close();
    }
}

删除也是只要改成对应的sql语句,其他的不变-->删除id为1的数据。

结果如图 ,IDEA依旧输出1,表示1行受到影响

而数据库对应的student表也发生对应删除,成了一张空表。

看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力

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

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

相关文章

实验2——基于NAT技术的实验(基于实验1)

目录 实验拓扑图​ 实验要求: 实验思路 基于NAT的简单知识点: 实验步骤 1. 给路由器R1配置IP 2.创建区域 2.1 电信: 2.2 移动: 3.办公区的NAT策略 3.1 服务器映射(移动链路)​编辑 3.2 写一条分公…

【算法/数列】等差数列子序列算术序列

概念: 等差数列:任意两项的差总等于同一个常数 子数组 :是数组中的一个连续序列。 子序列:是通过从原序列删除零个或多个元素并在不改变顺序的情况下排列其余元素而获得的序列 算术序列:是一个数字列表,其中…

HyperSD - 会画草图就能玩AI绘画,AI一键手绘,实时同步 本地一键整合包下载

字节跳动的Lightning团队发布的新图像模型蒸馏算法Hyper-SD,是一项在图像处理和机器学习领域的重要进展。这项技术通过创新的方法提升了模型在不同推理步骤下的性能,同时保持了模型大小的精简。 基于这个算法模型,一个很实用的功能出现了&am…

Linux RTL8111/RTL8168 不能联网 / 最新版驱动下载安装

注: 机翻,未校对。 如何让 Realtek RTL8111/RTL8168 在 Linux 下工作 这篇文章于 2016 年 8 月在我原来的博客上发布。尽管如今 Linux 下的 RTL8111/RTL8168 网络接口的情况变得越来越稳定,但它们仍然会导致数据包丢失或网络连接不稳定等问题…

【错题集】ruby 和薯条(排序 + 二分 / 双指针)

牛客对应题目链接:ruby和薯条 (nowcoder.com) 一、分析题目 1、解法一:排序 二分。 先排序,然后枚举较⼤值,在 [1, i - 1] 区间找差值的左右端点即可。 2、解法二:排序 前缀和 双指针。 先排序; …

数据结构(Java):力扣Stack集合OJ题

1、括号匹配问题 . - 力扣(LeetCode) 1.1 思路分析 根据栈的先进后出原则,我们可以这样解决问题: 遍历字符串,遇见左括号就将左括号push入栈;遇见右括号就pop出栈,将出栈的元素和该右括号比较…

JDK14新特征最全详解

JDK 14一共发行了16个JEP(JDK Enhancement Proposals,JDK 增强提案),筛选出JDK 14新特性。 - 343: 打包工具 (Incubator) - 345: G1的NUMA内存分配优化 - 349: JFR事件流 - 352: 非原子性的字节缓冲区映射 - 358: 友好的空指针异常 - 359: Records…

游戏的无边框模式是什么?有啥用?

现在很多游戏的显示设置中,都有个比较特殊的选项“无边框”。小伙伴们如果尝试过,就会发现这个效果和全屏几乎一毛一样,于是就很欢快地用了起来,不过大家也许会发现,怎么和全屏比起来,似乎有点不够爽快&…

单例模式Singleton

设计模式 23种设计模式 Singleton 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 饿汉式 public class BankTest {public static void main(…

[图解]SysML和EA建模住宅安全系统-14-黑盒系统规约

1 00:00:02,320 --> 00:00:07,610 接下来,我们看下一步指定黑盒系统需求 2 00:00:08,790 --> 00:00:10,490 就是说,把这个系统 3 00:00:11,880 --> 00:00:15,810 我们的目标系统,ESS,看成黑盒 4 00:00:18,030 --> …

Kafka基础入门篇(深度好文)

Kafka简介 Kafka 是一个高吞吐量的分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用与大数据实时处理领域。 1. 以时间复杂度为O(1)的方式提供消息持久化能力。 2. 高吞吐率。(Kafka 的吞吐量是MySQL 吞吐量的30…

数据结构初阶(C语言)-复杂度的介绍

在学习顺序表之前,我们需要先了解下什么是复杂度: 一,复杂度的概念 我们在进行代码的写作时,通常需要用到许多算法,而这些算法又有优劣之分,区分算法的优劣则是通过算法的时间复杂度和空间复杂度来决定。 …

【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow

一、项目介绍 眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练(‘白内障’, ‘糖尿病性视网膜病变’, ‘青光眼’, ‘正常’&…

Python+wxauto=微信自动化?

Pythonwxauto微信自动化? 一、wxauto库简介 1.什么是wxauto库 wxauto是一个基于UIAutomation的开源Python微信自动化库。它旨在帮助用户通过编写Python脚本,轻松实现对微信客户端的自动化操作,从而提升效率并满足个性化需求。这一工具的出现&…

SAP PP学习笔记26 - User Status(用户状态)的实例,订单分割中的重要概念 成本收集器,Confirmation(报工)的概述

上面两章讲了生产订单的创建以及生产订单的相关内容。 SAP PP学习笔记24 - 生产订单(制造指图)的创建_sap 工程外注-CSDN博客 SAP PP学习笔记25 - 生产订单的状态管理(System Status(系统状态)/User Status(用户状态)),物料的可用性检查,生…

语音识别概述

语音识别概述 一.什么是语音? 语音是语言的声学表现形式,是人类自然的交流工具。 图片来源:https://www.shenlanxueyuan.com/course/381 二.语音识别的定义 语音识别(Automatic Speech Recognition, ASR 或 Speech to Text, ST…

数字探秘:用神经网络解密MNIST数据集中的数字!

用神经网络解密MNIST数据集中的数字! 一. 介绍1.1 MNIST数据集简介1.2 MLP(多层感知器)模型介绍1.3 目标:使用MLP模型对MNIST数据集中的0-9数字进行分类 二.数据预处理2.1 数据集的获取与加载2.2 数据集的探索性分析(E…

编写商品列表和商品编辑和商品新增页面

addvue <template><!-- 传过来的id --> <!-- {{ $route.query.id }} --> <el-formref"FormRef"style"max-width: 600px":model"FormData":rule"rules"status-iconlabel-width"auto"class"demo-r…

【中台】数字中台建设方案(PPT)

数字中台建设要点&#xff1a; 数据采集与整合&#xff1a; 打破企业内部各个业务系统的数据隔阂&#xff0c;通过数据采集和数据交换实现数据的集中管理&#xff0c;形成统一的数据中心&#xff0c;为后续数据价值的挖掘提供基础。 利用自研或第三方ETL&#xff08;Extract, T…