Java MySQL 连接

JDBC 驱动、连接数据库、执行查询与 PreparedStatement 防注入。

Intermediate
Key PointsJDBC 四步:加载驱动、建连接、执行 SQL、关资源;SQL 一律用 PreparedStatement 占位符,不要拼字符串。

添加驱动依赖

Java reaches databases through JDBC and a vendor driver jar. For MySQL use mysql-connector-j; one Maven dependency is enough — since JDBC 4.0 no manual Class.forName is needed.

Text
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.3.0</version>
</dependency>

JDBC URL 示例:
jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8

连接数据库

DriverManager.getConnection(url, user, password) opens a connection and conn.isValid(2) checks it. In production use a pool such as HikariCP instead of connecting per request.

Java
import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectDemo {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai";
        String user = "root";
        String pwd = "your_password";

        try (Connection conn = DriverManager.getConnection(url, user, pwd)) {
            System.out.println(conn.isValid(2));
            System.out.println(conn.getMetaData().getDriverName());
        }
    }
}
Output
true
MySQL Connector/J
This needs a local MySQL with testdb created. If it cannot connect you get CommunicationsException — check the service and whether port 3306 is open.

执行查询

Statement runs static SQL; executeQuery returns a ResultSet you walk with next() and read via getXxx(column). Always close the result set and statement.

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

public class QueryDemo {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai";

        try (Connection conn = DriverManager.getConnection(url, "root", "your_password");
             Statement st = conn.createStatement();
             ResultSet rs = st.executeQuery("SELECT id, name FROM sites")) {

            while (rs.next()) {
                System.out.println(rs.getInt("id") + " " + rs.getString("name"));
            }
        }
    }
}
Output
1 runoob
2 python

PreparedStatement

Parameterised SQL must use PreparedStatement with ? placeholders bound via setXxx. It prevents SQL injection, is faster thanks to precompilation, and handles quotes and dates correctly.

Java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class PreparedDemo {
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai";
        String sql = "INSERT INTO sites (name, url) VALUES (?, ?)";

        try (Connection conn = DriverManager.getConnection(url, "root", "your_password");
             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setString(1, "runoob");
            ps.setString(2, "https://www.runoob.com");
            int rows = ps.executeUpdate();

            System.out.println(rows);
        }
    }
}
Output
1
Concatenating values into SQL ("... WHERE name='" + name + "'") is the classic injection hole. Parameterised queries are mandatory, not an optimisation.

Friends & Partners