【Java+MySQL】使用JDBC连接MySQL 8.0数据库

2023-11-15

一、Java MySQL 8.0连接驱动包

下载链接:https://pan.baidu.com/s/1YFOImz0dCHtzIajSFq9xgg?pwd=boul
提取码:boul

【IDEA】导入方式:

1、在【External Libraries】下右键点击【JDK】,选择【Open Library Settings】。
请添加图片描述

2、点击【+】号将下载的jar包导入进来。
请添加图片描述

二、Java连接MySQL数据库

1、新建一个类用来存放4大常量。

public class Config {
    //驱动,8.0固定为该格式
    public static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    //数据库地址,修改该数据库名称
    public static final String DB_URL = "jdbc:mysql://localhost:3306/database_name?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    //用户名
    public static final String USER = "user_name";
    //密码
    public static final String PASSWORD = "password";
}

2、主类中设置3个全局变量。

    //3个全局变量,Connection连接数据库,创建一个Statement对象,用于向数据库发送SQL语句。
    private static Connection connection;
    //Statement用于执行静态SQL语句并返回其产生的结果的对象。
    private static Statement statement;
    //ResultSet用于存放Statement返回的结果。
    private static ResultSet resultSet;

3、主类中连接数据库。

    static {
        //静态块连接数据库
        try{
            //加载驱动
            Class.forName(Config.JDBC_DRIVER);
            //创建链接
            connection = DriverManager.getConnection(Config.DB_URL, Config.USER, Config.PASSWORD);
            //访问数据库
            statement = connection.createStatement();
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("数据库连接失败!");
        }
    }

4、Statement类。

  • executeQuery方法

    • 执行SQL查询
    • 返回ResultSet对象
  • executeUpdate方法

    • 可执行表、数据的增加、删除、修改操作
    • 返回执行受到影响的行数
  • execute方法

    • 可执行任何SQL语句
    • 返回一个布尔值

5、资源释放。

    public static void release(){
        try{
            if (connection != null)
                connection.close();
            if (statement != null)
                statement.close();
            if (resultSet != null)
                resultSet.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

三、执行测试语句

1、在数据库中新建一个Tiobe编程语言排行表名为【tioberank】。

CREATE TABLE IF NOT EXISTS `tioberank`(
`id` INT UNSIGNED AUTO_INCREMENT,
`language` CHAR(20) NOT NULL DEFAULT '',
`rank` INT UNSIGNED NOT NULL,
`ratings` FLOAT NOT NULL,
`change` FLOAT NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、插入几个测试数据。

INSERT INTO `tioberank` VALUES
('1', 'Python', '1', '15.74', '4.07'),
('2', 'C', '2', '13.96', '2.13'),
('3', 'Java', '3', '11.72', '0.6');

四、增删查改接口函数

1、数据表存在与否查询,返回TRUE或FALSE。

    public static boolean tableIsExist(String table){
        boolean result = false;
        int colIndex = 1;
        try{
            resultSet = statement.executeQuery("SHOW TABLES");
            while (resultSet.next()){
                if (resultSet.getString(colIndex).equals(table)){
                    result = true;
                    break;
                }
            }
            if (!result){
                System.out.println("数据表不存在!");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

2、查询表字段名,返回一个字符串列表。

    public static List<String> descTable(String table){
        List<String> list = new ArrayList<>();
        int colIndex = 1;
        try {
            if (tableIsExist(table)){
                resultSet = statement.executeQuery("DESC " + table);
                while (resultSet.next()){
                    list.add(resultSet.getString(colIndex));
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

3、【查询】根据SQL语句查询数据内容,返回一个哈希表列表。

    private static void dataQuery(String table, String sql, List<Map<String, Object>> list) throws SQLException {
        Map<String, Object> map;
        List<String> headers = descTable(table);
        System.out.println("执行SQL语句:" + sql);
        resultSet = statement.executeQuery(sql);

        while (resultSet.next()){
            map = new HashMap<>();
            for(String header : headers){
                map.put(header, resultSet.getObject(header));
            }
            list.add(map);
        }
    }

根据上面方法衍生:

3.1 查询所有数据内容

    public static List<Map<String, Object>> selectTable(String table){
        List<Map<String, Object>> list = new ArrayList<>();

        try{
            if (tableIsExist(table)){
                //查询所有内容
                String sql = "SELECT * FROM " + table;
                dataQuery(table, sql, list);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }

3.2 根据具体的SQL语句查询数据内容

    public static List<Map<String, Object>> selectTable(String table, String sql){
        List<Map<String, Object>> list = new ArrayList<>();

        try{
            if (tableIsExist(table)){
                //自定义SQL语句查询内容
                dataQuery(table, sql, list);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }

或是根据不同的SQL语句自定义不同的接口函数,如根据字段名和数据进行模糊查询(这里只写了一个单条件,多条件可以参照下方删除数据的写法):

    public static List<Map<String, Object>> selectTable(String table, String key, Object value){
        List<Map<String, Object>> list = new ArrayList<>();

        try{
            if (tableIsExist(table)){
                String sql = "SELECT * FROM " + table + " WHERE " + key + " LIKE '" + value + "'";
                dataQuery(table, sql, list);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }
//调用
selectTable("tioberank", "language", "%a%");

4、【增加、删除、修改】定义一个执行executeUpdate的函数,使其根据是否有数据得到修改为依据返回TRUE或FALSE。

    private static boolean dataUpdate(String sql) throws SQLException {
        System.out.println("执行SQL语句:" + sql);
        int executeResult = statement.executeUpdate(sql);
        return executeResult > 0;
    }

4.1 增加数据操作

    public static String addTable(String table, String[] values){
        String result = "";
        try {
            if (tableIsExist(table)){
                StringBuilder stringBuilder = new StringBuilder();
                //第一个为id自增量,用null表示使其自动增加
                stringBuilder.append("INSERT INTO ").append(table).append(" VALUES(null, ");
                String sql = "";
                for (String value : values){
                    stringBuilder.append("'").append(value).append("', ");
                }
                //去除最后一个逗号
                stringBuilder.delete(stringBuilder.length()-2, stringBuilder.length()-1);
                stringBuilder.append(");");

                sql = stringBuilder.toString();
                if (dataUpdate(sql))
                    result = "添加数据成功!";
                else
                    result = "添加数据失败!";
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return  result;
    }
//调用
String[] data = new String[]{"C++", "4", "9.76", "2.63"};
System.out.println(addTable("tioberank", data));

4.2 删除数据操作。

删除数据后可能会出现自增ID序列混乱的问题,若想解决,需要先删除ID列再重新增加,相当于刷新序列刷新序列SQL语句参照:

ALTER TABLE TABLE_NAME DROP id;
ALTER TABLE TABLE_NAME ADD id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Java代码参照(这里多条件删除为【与】的关系,【或】的关系参照该方式可以很快写出):

    private static String refreshDataID(String table){
        //刷新数据ID序列
        String sql;
        String result;
        try {
            sql = "ALTER TABLE " + table + " DROP id";
            statement.execute(sql);
            sql = "ALTER TABLE " + table + " ADD id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST";
            statement.execute(sql);
            result = "刷新ID序列成功!";
        }catch (Exception e){
            e.printStackTrace();
            result = "刷新ID序列失败!";
        }
        return result;
    }
    public static String deleteTable(String table, Map<String, String> conditions){
        //删除数据
        String result = "";
        try {
            if (tableIsExist(table)){
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("DELETE FROM ").append(table).append(" WHERE ");
                String sql = "";
                conditions.forEach((key, value) -> {
                    stringBuilder.append(key).append("='").append(value).append("' AND ");
                });
                //去除最后一个&及空格
                stringBuilder.delete(stringBuilder.length()-5, stringBuilder.length());

                sql = stringBuilder.toString();
                if (dataUpdate(sql)) {
                    result = "删除数据成功!";
                    System.out.println(refreshDataID(table));
                }
                else
                    result = "删除数据失败!";
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
//调用
HashMap<String, String> deleteConditions = new HashMap<>();
deleteConditions.put("id", "4");
System.out.println(deleteTable("tioberank", deleteConditions));

4.3 数据更新操作

    public static String updateTable(String table, String conditionKey, String conditionValue, String aimKey, String aimValue){
        //更新数据
        String result = "";
        try {
            if (tableIsExist(table)){
                String sql = "UPDATE " + table + " SET `" + aimKey + "`='" + aimValue + "' WHERE " + conditionKey + "='" + conditionValue + "'";
                if (dataUpdate(sql)) {
                    result = "更新数据成功!";
                }
                else
                    result = "更新数据失败!";
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
//调用
	System.out.println(updateTable("tioberank", "language", "Python", "rank", "2"));

以上这些接口函数本质上就是使用statement的executeQuery、executeUpdate和execute方法来执行SQL语句并返回执行结果,我们完全可以按照不同项目的不同需求去进行构建,减少徒手敲SQL语句的次数。

项目码云地址https://gitee.com/boulete/MysqlJDBC.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java+MySQL】使用JDBC连接MySQL 8.0数据库 的相关文章

  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 从所有表中选择

    我的数据库中有很多表都具有相同的结构 我想从所有表中进行选择 而不必像这样列出所有表 SELECT name FROM table1 table2 table3 table4 我尝试过 但这不起作用 SELECT name FROM 有没有
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • Mockito 和 Hamcrest:如何验证 Collection 参数的调用?

    我遇到了 Mockito 和 Hamcrest 的泛型问题 请假设以下界面 public interface Service void perform Collection
  • 如何更改 Swagger-ui URL 前缀?

    我正在使用 Springfox Swagger2 和 Spring boot 1 5 9 我可以通过此链接访问 swagger UI http localhost 8090 swagger ui html http localhost 80
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据

随机推荐

  • unity shader加载序列帧图片

    先设置序列帧图WarpMode 为Repeat Shader部分 Shader My Sequence Properties Opacity 透明度 range 0 1 0 5 Sequence 序列帧 2d gray RowCount 行
  • global clk 的 skew & jitter

    ku040 的 skew 同一个 clk 下的不同寄存器 clk 到达时间可能会差 300ps 跟 clk 走线的长度相关 一般同一个 bank内 clk 在 30ps 之内 但是不同的 clk 即使从同一个 mmcm pll 的不同管脚发
  • 【C语言的栈溢出问题以及部分解决】

    C语言的栈溢出问题 例如 针对学习过程中遇到的栈溢出问题 C语言的栈溢出问题 前言 栈溢出 Stack overflow 导致栈溢出的原因 函数递归层次太深 1 修改栈区空间大小 2 尾部递归优化 附一 设置优化选项 O1 O2 附二 解决
  • idea中 mybatis 的 mapper.xml 新建没有 头文件

    idea中 mybatis 的 mapper xml 新建没有 头文件 解决步骤 1 直接 settings 2 直接 选择 MybatisMapper 添加
  • C6678多核DSP开发——image_processing例程

    前言 这篇学习笔记记录了在DSP上实现简单图像处理算法的image processing例程 该例程在CCS安装时安装在目录下 主要实现了对图像的分割 灰度处理以及边缘检测 学会了调用和修改DSP例程以及图像处理基本程序框架 1 打开CCS
  • iOS 的 APP 在系统中如何适应 iPhone 5s/6/6 Plus 三种屏幕的尺寸?

    iOS 的 APP 在系统中如何适应 iPhone 5s 6 6 Plus 三种屏幕的尺寸 iOS开发如何标准化的适应新的iPhone 5s iPhone6 6 Plus 是否有一种一劳永逸的解决方法 而不需要设计师针对不同的尺寸单独进行设
  • 基础算法题——炎炎消防队(取巧、三分)

    炎炎夏日 题目描述 夏天的重庆格外地炎热 很容易起火 消防士们都全副武装 一旦发生险情就立马赶往救火 森罗是消防队中的一员 他在灭火的过程中突发奇想 如果能用退火的原理求解函数求最小值 那不就可以很容易计算了吗 翌日 森罗来到即将高考的弟弟
  • Android中如何重新启动应用APP或重启系统

    重新启动应 程序 有两种 法 分别是 1 通过ActivityManager来重新启动应 程序 java 代码 ActivityManager manager ActivityManager this getSystemService Co
  • pm grant 命令

    CustomLocale apk所需要的权限 android permission CHANGE CONFIGURATION 自Android 4 2 4 2 2起系统定义为android protectionLevel signature
  • java学习笔记——众筹项目练习——前台系统的实名认证功能、ajax发送跨域请求、后台manager系统的实名认证人工审核

    实名认证功能 前面的文章中我们实现了后台manager系统中的流程管理功能 并且将实名认证的流程上传到了服务器并完成部署 不过 仅仅是长传和部署当然不是我们的目的啦 我们上传这个实名认证流程时为了可以让前台的广大用户可以使用这个流程 怎么才
  • C++ Primer 第五章 Statements

    C Primer 第五章 Statements 5 3 Conditional Statements 5 3 2 The switch Statement 5 4 Iterative Statements 5 4 3 Range for S
  • VScode 运行java出现exited with code=1 in 0.695 seconds的问题解决

    在运行vs中Java代码时 配置过程中可能会出现一些问题 导致运行结果为上述所示 在vs中运行Java代码时 首先要确保Java环境配置无误 出现下面的则证明配置成功 之后需要安装几个插件 最后就可以在vs中编写Java代码了
  • 使用C++调用C#的DLL

    SwfDotNet是C 编写的 作者的C 水平 真是令我佩服 这是个特别好的读写Swf文件的库 但是 我要用在C 项目中 怎么让C 调用C 的DLL呢 今天一上午都在琢磨这个问题 耽误了很多时间 原因是编译是出现 warning C4819
  • LeetCode题目笔记——389. 找不同/Python/C++

    文章目录 题目描述 题目难度 简单 方法一 使用哈希表计数出现次数 代码 Python 方法二 利用字母的ASCII码 代码 C Python 方法三 位运算 总结 题目描述 给定两个字符串 s 和 t 它们只包含小写字母 字符串 t 由字
  • thttpd嵌入式www服务工具的使用

    thttpd是一个非常小巧的轻量级web server 它非常简单 仅仅提供了HTTP 1 1和简单的CGI支持 在其官方网站上有一个与其他web server 如Apache Zeus等 的对比图 Benchmark 可以参考 此外 th
  • 空间频率 MTF和 SFR

    什么叫空间频率 我们日常中一般的频率是指时间频率 其单位是Hz 其定义是单位时间内 s 运动次数 官方定义 1 单位时间内完成振动或振荡的次数或周数 2 某一时间内某事物发生的次数或完成某过程的次数 这里的被除数是单位所以是时间频率 但是如
  • [现代控制理论]11_现代控制理论串讲_完结_pdf获取

    DR CAN的现代控制理论的笔记就结束了 加上这篇一共11篇 现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8
  • 数据结构(五):前序遍历、中序遍历、后序遍历

    我们先看下二叉树的前序 后序和中序遍历 遍历下面这个二叉树 分别以前中后三种遍历方式 写出结点的顺序 前序遍历 顺序 根左右 或 中左右 遍历根节点 遍历根结点的左子结点 如果左结点不是叶节点 则以当前结点开始 重新从第一步开始循环 遍历根
  • keil错误 *** FATAL ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED 解决方法

    keil错误 FATAL ERROR L250 CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED 解决方法 出现这个是你的keli没有破解 步骤如下 1 以管理员的身份运行你的keli 2 以管理
  • 【Java+MySQL】使用JDBC连接MySQL 8.0数据库

    一 Java MySQL 8 0连接驱动包 下载链接 https pan baidu com s 1YFOImz0dCHtzIajSFq9xgg pwd boul 提取码 boul IDEA 导入方式 1 在 External Librar