一定要看!MySQL5与MySQL8的区别

一、回顾JDBC的普通使用(以MySQL8.0为例)

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/(此处更改替换为你要访问的数据库的名字)?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
username=admin(用户名)
password=1234567(密码)
需要jar包的支持:
  • java.sql
  • javax.sql
  • mysql-conneter-java… 连接驱动(必须要导入)

 

1-1 执行JDBC时必须的步骤

1. 加载驱动
2. 连接数据库,代表数据库
3. 向数据库发送SQL的对象Statement : CRUD
4. 编写SQL (根据业务,不同的SQL)
5. 执行SQL
6. 关闭连接
 
package com.kuang.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class TestJDBC {
    public static void main(String[] args) throws Exception {
        //配置信息
//        String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC";
        String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false";
        String username="root";
        String password="admin";
//        1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
//        2. 连接数据库
        Connection connection = DriverManager.getConnection(url, username, password);
//        3. 向数据库发送SQL对象STATEMENT:CRUD
        Statement statement = connection.createStatement();//不安全
//        4.编写sql  jdbc的套路是️死的,sql会变
        String sql = "select * from users";
        String sql2 = "delete from users where id = 1";
        //受影响的行数
//        int r = statement.executeQuery(sql);
//        5. 执行SQL 返回一个结果集
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()){
            System.out.println("id = " + rs.getObject("id"));
            System.out.println("name " + rs.getObject("name"));
            System.out.println("password = " + rs.getObject("password"));
            System.out.println("email = " + rs.getObject("email"));
            System.out.println("birthday = " + rs.getObject("birthday"));
        }
//        6. 关闭连接释放资源  原则 先开后关
        rs.close();
        statement.close();
        connection.close();

    }
}

 

1-2 预编译的SQL

 

package com.kuang.test;

import java.sql.*;

public class TestJDBC2 {
    public static void main(String[] args) throws Exception {
        //配置信息
//        String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC";
        String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false";
        String username="root";
        String password="admin";
//        1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
//        2. 连接数据库
        Connection connection = DriverManager.getConnection(url, username, password);
//        3. 编写sql
        String sql = "insert into users(id,name,password,email,birthday) values (?,?,?,?,?)";
//        4. 预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,6);//给第一个占位符?的值
        preparedStatement.setString(2,"MadGod say");//给第二个占位符?的值
        preparedStatement.setString(3,"15151");//给第三个占位符?的值
        preparedStatement.setString(4,"dsaogj@google.com");//给第四个占位符?的值
        preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符?的值 注意util.date和sql.date

//        5. 执行sql
        int i=preparedStatement.executeUpdate();

        if (i>0){
            System.out.println(" 插入成功 " );
        }

//        6. 关闭连接释放资源  原则 先开后关

        preparedStatement.close();
        connection.close();

    }
}

 

1-3 执行事务的SQL

开启事务
事务提交 commit()
事务回滚 rollback()
关闭事务
 
package com.kuang.test;

import com.mysql.cj.jdbc.exceptions.ConnectionFeatureNotAvailableException;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

public class TestJDBC3 {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false";
        String username="root";
        String password="admin";
        Connection connection=null;
    try {
        //    1. 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
//    2. 连接数据库,代表数据库
        connection = DriverManager.getConnection(url,username,password);
//    3. 通知数据库开启事物,false表示开启
        connection.setAutoCommit(false);

        String sql = "update account set money = money -200 where name='张三'";
        connection.prepareStatement(sql).executeUpdate();
//    4. 制造错误
        int i = 1/0;

        String sql2 = "update account set money = money+200 where name ='李四'";
        connection.prepareStatement(sql2).executeUpdate();
        connection.commit();//以上两条sql都执行成功了就提交事物
        System.out.println(" sql1 sql2 执行成功 coding: SUCCESS-accept ");
    }catch (Exception e){
        try {
//            如果出现了异常,就进行回滚
            connection.rollback();
        } catch (SQLException ex) {
            throw new RuntimeException(ex);
        }
    }finally {
        try {
            connection.close();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
        }
}

 

二、核心功能差异

  1. JSON支持

    • MySQL 5:通过字符串存储和处理JSON数据,操作复杂且效率低14。

    • MySQL 8:原生支持JSON数据类型及相关函数,简化了JSON数据的存储和查询,提升了处理效率。

  2. 窗口函数与CTE(公共表表达式)

    • MySQL 5:不支持窗口函数和CTE,复杂分析需依赖子查询。

    • MySQL 8:新增窗口函数(如ROW_NUMBERRANK)和CTE,支持更灵活的数据分析与查询优化。

  3. 事务管理

    • MySQL 5:事务处理较弱,ACID特性支持有限。

三、性能优化

    • 查询速度与并发

      • MySQL 8:优化了查询执行引擎和索引算法,官方称其性能比MySQL 5快2倍,高并发场景下甚至可达5-30倍。

      • MySQL 5:索引和锁机制较简单,高负载下性能可能受限。

    • 存储引擎

      • MySQL 8:默认使用InnoDB Cluster,支持自动故障转移和组复制,提升高可用性;新增MyRocks引擎,优化写入性能37。

    • 数据压缩与内存管理

      • MySQL 8:引入高效数据压缩技术,减少存储占用并提升查询效率;改进内存管理,减少锁竞争

    • 和隔离性,支持更严格的事务控制

四、安全性提升

  1. 加密与认证

    • MySQL 8:默认启用SSL/TLS加密,支持SHA-256密码和公钥加密插件;新增角色权限管理,细化访问控制。

    • MySQL 5:安全功能较基础,依赖手动配置加密和权限。

  2. 审计与日志

    • MySQL 8:增强操作日志和审计功能,支持用户行为追踪

五、配置与兼容性

  1. 驱动与连接配置

    • 驱动类:MySQL 5使用com.mysql.jdbc.Driver,而MySQL 8需改用com.mysql.cj.jdbc.Driver

    • 连接URL:MySQL 8需在JDBC URL中指定时区参数(如?serverTimezone=UTC),否则可能报错25。

  2. 字符编码

    • MySQL 8:默认字符集改为utf8mb4,支持更广泛的Unicode字符(如Emoji),而MySQL 5默认使用latin1

  3. 配置持久化

    • MySQL 8:通过SET PERSIST命令可将配置保存至mysqld-auto.cnf,重启后生效,弥补了MySQL 5仅支持临时配置的不足。

posted @ 2025-04-29 14:01  逃逸线LinesOfFlight  阅读(166)  评论(0)    收藏  举报