菜鸟科技网

Java如何调用MySQL命令?

Java调用MySQL命令是Java应用程序与MySQL数据库交互的核心操作,主要通过JDBC(Java Database Connectivity)实现,JDBC是Java提供的一套标准API,用于执行SQL语句、处理结果集以及管理数据库连接,以下是详细的实现步骤和注意事项。

Java如何调用MySQL命令?-图1
(图片来源网络,侵删)

环境准备

在开始之前,需确保以下环境已正确配置:

  1. JDK安装:确保Java开发工具包(JDK)已安装,并配置好环境变量JAVA_HOME
  2. MySQL数据库:安装MySQL服务器,并创建目标数据库及表,例如创建一个test数据库和user表:
    CREATE DATABASE test;
    USE test;
    CREATE TABLE user (id INT PRIMARY KEY, name VARCHAR(50), age INT);
  3. JDBC驱动:下载MySQL JDBC驱动(如mysql-connector-java-x.x.x.jar),并将其添加到项目的类路径中,若使用Maven项目,可在pom.xml中添加依赖:
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.28</version>
    </dependency>

Java调用MySQL的基本步骤

加载JDBC驱动

通过Class.forName()方法加载MySQL驱动类,驱动管理器会自动注册驱动:

Class.forName("com.mysql.cj.jdbc.Driver");

建立数据库连接

使用DriverManager.getConnection()方法获取连接,需提供数据库URL、用户名和密码:

String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "password";
Connection connection = DriverManager.getConnection(url, username, password);

url中的参数说明如下: | 参数 | 说明 | |------|------| | localhost:3306 | 数据库服务器地址和端口 | | test | 数据库名称 | | useSSL=false | 禁用SSL连接(开发环境可设置) | | serverTimezone=UTC | 设置时区 |

Java如何调用MySQL命令?-图2
(图片来源网络,侵删)

创建Statement对象

通过Connection对象创建StatementPreparedStatement,后者用于防止SQL注入:

// Statement方式(不推荐,存在SQL注入风险)
Statement statement = connection.createStatement();
// PreparedStatement方式(推荐)
String sql = "INSERT INTO user (id, name, age) VALUES (?, ?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 1);
preparedStatement.setString(2, "Alice");
preparedStatement.setInt(3, 25);

执行SQL命令

  • 执行查询:使用executeQuery()返回ResultSet对象:
    ResultSet resultSet = preparedStatement.executeQuery("SELECT * FROM user");
  • 执行更新:使用executeUpdate()返回受影响的行数:
    int rowsAffected = preparedStatement.executeUpdate();

处理结果集

遍历ResultSet获取查询结果:

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    int age = resultSet.getInt("age");
    System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}

关闭资源

按顺序关闭ResultSetStatementConnection,避免资源泄漏:

if (resultSet != null) resultSet.close();
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();

完整代码示例

import java.sql.*;
public class MySQLExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
        String username = "root";
        String password = "password";
        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            // 插入数据
            String insertSql = "INSERT INTO user (id, name, age) VALUES (?, ?, ?)";
            try (PreparedStatement insertStmt = connection.prepareStatement(insertSql)) {
                insertStmt.setInt(1, 2);
                insertStmt.setString(2, "Bob");
                insertStmt.setInt(3, 30);
                insertStmt.executeUpdate();
            }
            // 查询数据
            String selectSql = "SELECT * FROM user";
            try (Statement selectStmt = connection.createStatement();
                 ResultSet resultSet = selectStmt.executeQuery(selectSql)) {
                while (resultSet.next()) {
                    System.out.println("ID: " + resultSet.getInt("id") + 
                                     ", Name: " + resultSet.getString("name") + 
                                     ", Age: " + resultSet.getInt("age"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

注意事项

  1. 异常处理:数据库操作可能抛出SQLException,需使用try-catchtry-with-resources处理。
  2. 连接池:高并发场景下建议使用连接池(如HikariCP),避免频繁创建和销毁连接。
  3. SQL注入防护:始终使用PreparedStatement拼接动态参数,而非直接拼接SQL字符串。
  4. 时区配置:MySQL 8.0+需在url中明确指定时区,避免时间差问题。

相关问答FAQs

Q1: 如何解决MySQL时区错误“The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone”?
A1: 在数据库连接URL中添加时区参数,例如jdbc:mysql://localhost:3306/test?serverTimezone=UTC,明确指定UTC时区或本地时区(如Asia/Shanghai)。

Java如何调用MySQL命令?-图3
(图片来源网络,侵删)

Q2: 为什么推荐使用PreparedStatement而不是Statement?
A2: PreparedStatement预编译SQL语句,性能更高;同时通过参数化查询有效防止SQL注入攻击,而Statement直接拼接SQL字符串存在安全风险。

分享:
扫描分享到社交APP
上一篇
下一篇