跳到主要内容

MySQL Connector/J 连接 seekdb 示例程序

seekdb 支持通过 MySQL 官方 JDBC 驱动连接。本文介绍了如何通过 MySQL Connector/J 连接并使用 seekdb。

点击下载 mysql-connector/j 示例工程

前提条件

  • 您已下载并安装 IntelliJ IDEA
  • 您已下载 JDK 1.8.0。
  • 您已下载并在 IntelliJ IDEA 中配置 Maven
  • 您已下载本文所使用的工程示例代码。

版本兼容性

MySQL Connector/J 版本推荐版本说明
5.x5.1.40 ~ 5.1.49稳定版本
8.x8.0.7 ~ 8.0.25, 8.2.0 ~ 8.4.0新特性支持

功能特性

  • 支持标准的 JDBC API
  • 提供连接池管理
  • 支持 SSL 连接
  • 支持批量操作
  • 支持预处理语句

安装后检查

  1. 检查 JDK 是否安装成功:

    java -version
  2. 检查 Maven 是否安装成功:

    mvn -version
  3. (可选)检查 IntelliJ IDEA 中配置 Maven 是否正确:

    本文仅提供简单的示例工程供您参考。如果您需要尝试开发更为复杂的示例,可以下载适合您开发环境版本的 Maven,并通过如下路径,在 IntelliJ IDEA 中完成配置。

    1. 检查 Maven 是否安装成功:

      mvn -version
    2. 打开 IntelliJ IDEA,点击 IntelliJ IDEA > Settings > Build,Execution,Development > Build Tools > Maven,在 Maven home path 配置 Maven 安装包所在路径。

    Setting Maven

操作步骤

  1. 获取 seekdb 连接信息。
  2. 修改您已下载的工程示例代码。
  3. 运行工程示例代码。

创建 Java 应用程序

步骤一:获取数据库连接串

联系 seekdb 部署人员或者管理员获取相应的数据库连接串,例如:

mysql -h$host -P$port -u$user_name -p$password -D$database_name

参数说明:

  • host:提供 seekdb 的连接 IP。使用实际的 IP 替换,也可以使用本地 IP 及 127.0.0.1。
  • port:提供 seekdb 接端口。使用实际的端口替换,默认是 2881,在部署 seekdb 时可自定义。
  • $database_name:需要访问的数据库名称。
  • $user_name:提供连接账户。格式:用户名
  • $password:提供账户密码。

更多连接串的信息,请参见 通过 MySQL 客户端连接 seekdb

示例如下:

mysql -hxxx.xxx.xxx.xxx -P2881 -uroot -p****** -Dtest -A

步骤二:修改工程示例代码

  1. 解压已下载好的工程示例。

  2. 打开 IntelliJ IDEA,点击 File > Open,添加工程示例文件。

  3. 根据步骤一中获取的连接串信息,修改工程代码 JDBCDemo > src > main > java > JDBCTest 文件中如下数据库连接参数。

    修改代码中的数据库连接参数。参考如下字段及拼接方法,对应的值,则取自步骤一获取的数据库连接串。

    connection = DriverManager.getConnection("jdbc:mysql://{host}:{port}/{dbname}?user={username}&password={******}")

    //示例
    jdbc:mysql://100.88.xx.xx:2881/test?user=r***&password=******`
    • host:取自 -h 参数,seekdb 连接地址。

    • port:取自 -P 参数,seekdb 连接端口。

    • dbname:取自 -D 参数,需要访问的数据库名称。

    • username:取自 -u 参数,连接用户名,默认是 'root'。

    • password:取自 -p 参数,用户密码。

    修改后代码段示例如下:

    //示例
    Connection connection = DriverManager.getConnection("jdbc:mysql://100.88.xx.xx:2881/test?user=r***&password=******");
    提示

    若使用 MySQL Connector/J 8.x,账号密码中需避免包含 #,否则会导致示例工程运行报错。

在正确安装 MySQL Connector/J 5.1.47 驱动并配置环境之后,可以通过以下 Test.java 文件的示例代码进行数据库连接及使用。

提示

如果是 MySQL Connector/J 8.x 版本,Class.forName("com.mysql.jdbc.Driver") 中的 com.mysql.jdbc.Driver 需要替换成 com.mysql.cj.jdbc.Driver

完整代码示例如下:

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

public class JDBCTest {

public static void main(String[] args) {
try {
//load driver
Class.forName("com.mysql.jdbc.Driver"); //mysql-jdbc 5
// Class.forName("com.mysql.cj.jdbc.Driver"); //mysql-jdbc 8

//create connection
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:2881/test?user=r***&password=");
System.out.println("jdbc version : " + connection.getMetaData().getDriverVersion());
Statement stmt = connection.createStatement();

//create table
stmt.execute("drop table if exists test");
stmt.execute("create table test (id int, name varchar(25))");
System.out.println("create table successfully");

//insert data
stmt.execute("insert into test values (1, 'aaa'),(2, 'bbb')");
System.out.println("insert data successfully");

//query data
System.out.println("query data : ");
ResultSet rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}

//update data
stmt.execute("update test set name = 'bbb' where id = 1");
System.out.println("update data successfully");

//query data after update
System.out.println("query data after update : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}

//delete data
stmt.execute("delete from test where id = 1");
System.out.println("delete data successfully");

//query data after delete
System.out.println("query data after delete : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}

//drop table
stmt.execute("drop table test");
//close
rs.close();
stmt.close();
connection.close();
} catch (Exception e) {
System.out.println("error!");
e.printStackTrace();
}
}
}

步骤三:运行应用程序

在 IntelliJ IDEA 中运行示例工程。若返回如下结果,说明数据库连接成功,示例工程执行正确。

connect-j-zh

项目代码介绍

点击 mysql-connector/j 下载项目代码,是一个名称为 JDBCDemo.zip 的压缩包。

解压后,得到一个名为 JDBCDemo 的文件夹。目录结构如下所示:

JDBCDemo
├── src
│ └── main
│ └── java
│ └── JDBCTest.java
└── pom.xml

文件说明:

  • src:源代码根目录。
  • main:主代码目录,包含应用程序的主要逻辑。
  • java:Java 源代码目录。
  • JDBCTest.java:主类,包含创建表和插入数据等逻辑。
  • pom.xml:Maven 项目的配置文件,用于管理项目的依赖和构建设置。

pom.xml 代码介绍

pom.xml 文件是 Maven 项目的配置文件,定义了项目的依赖项、插件和构建规则等信息。Maven 是一个 Java 项目管理工具,可以自动下载依赖项、编译和打包项目等操作。

本文 pom.xml 文件的代码主要包括以下几个部分:

  1. 文件声明语句。

    声明本文件是一个 XML 文件,使用的 XML 版本是 1.0,字符编码方式是 UTF-8

    代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
  2. 配置 POM 的命名空间和 POM 模型版本。

    1. 通过 xmlns 指定 POM 的命名空间为 http://maven.apache.org/POM/4.0.0
    2. 通过 xmlns:xsi 指定 XML 命名空间 http://www.w3.org/2001/XMLSchema-instance
    3. 通过 xsi:schemaLocation 指定 POM 的命名空间为 http://maven.apache.org/POM/4.0.0 和 POM 的 XSD 文件的位置为 http://maven.apache.org/xsd/maven-4.0.0.xsd
    4. 通过 <modelVersion> 元素指定了该 POM 文件使用的 POM 模型版本为 4.0.0

    代码如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 其他配置 -->

    </project>
  3. 配置基本信息。

    1. 通过 <groupId> 指定项目所属组织为 com.example
    2. 通过 <artifactId> 指定项目的名称为 JDBCDemo
    3. 通过 <version> 项目的版本号为 1.0-SNAPSHOT

    代码如下:

        <groupId>org.example</groupId>
    <artifactId>JDBCDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
  4. 配置项目所依赖组件。

    1. 添加 mysql-connector-java 依赖库,用于与数据库进行交互:

      信息

      本部分代码定义项目所依赖组件是 MySQL Connector/J 的 V5.1.40 版本,如果需要了解其他版本的信息,请参见 MySQL Connector/J

      1. 通过 <groupId> 指定依赖项所属的组织为 mysql
      2. 通过 <artifactId> 指定依赖项的名称为 mysql-connector-java
      3. 通过 <version> 指定依赖项的版本号为 5.1.40

      代码如下:

              <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.40</version>
      </dependency>

JDBCTest.java 代码介绍

JDBCTest.java 文件是示例程序的一部分,代码演示了如何使用 MySQL Connector/J执行数据库操作。它首先配置了数据库连接信息,然后创建了一个 JDBCTest 对象来执行数据库操作。代码中还包括了创建表、插入数据和查询数据的示例。

本文 JDBCTest.java 文件的代码主要包括以下几个部分:

  1. 导入 Java 程序中使用 JDBC API 需要的 Java 类。

    1. Connection 用于建立与数据库之间的连接。
    2. DriverManager 负责管理一组 JDBC 驱动程序。
    3. ResultSet 用于处理 SQL 查询返回的数据。
    4. Statement 用于执行静态 SQL 语句并返回结果。

    代码如下:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
  2. 创建一个 JDBCTest 类,并定义了 main 方法。

    1. 定义一个名为 JDBCTest 的公共类,作为程序的入口点。类名需要与文件名保持一致。
    2. 定义一个公共静态方法 main,作为程序的起始执行点。
    3. 其他数据库操作。

    代码如下:

    public class Main {
    public static void main(String[] args) {
    // 数据库连接信息
    // 创建数据源
    // 创建表
    // 插入数据
    // 更新数据
    // 删除数据
    }
    }
  3. 定义数据库连接信息。

    1. Class.forName() 来加载并注册 MySQL JDBC 驱动程序。
    2. DriverManager.getConnection() 方法定义用于连接数据库的 URL、用户名和密码。您需要将 $host$port$database_name$user_name$password 替换为实际的数据库连接信息。

    代码如下:

        Class.forName("com.mysql.jdbc.Driver"); //mysql-jdbc 5
    //Class.forName("com.mysql.cj.jdbc.Driver"); //mysql-jdbc 8
    Connection connection = DriverManager.getConnection("jdbc:mysql://xx.xxx.xxx.xxx:2881/test?user=test@tt1&password=test");

    参数解释:

    • $host:提供 seekdb 的连接 IP。使用实际的 IP 替换,也可以使用本地 IP 及 127.0.0.1。
    • $port:提供 seekdb 接端口。使用实际的端口替换,默认是 2881,在部署 seekdb 时可自定义。
    • $database_name:需要访问的数据库名称。
    • $user_name:提供连接账户。格式:用户名
    • $password:提供账户密码。
  4. 创建和执行 SQL 声明。

        Statement stmt = connection.createStatement();
    stmt.execute("...");
  5. 创建表。

    代码如下:

        // 用 SQL 语句删除如果存在名为 "test" 的表
    stmt.execute("drop table if exists test");
    // 创建一个新的名为 "test" 的表,包含两个字段:整型的 "id" 和字符型的 "name"
    stmt.execute("create table test (id int, name varchar(25))");
    // 打印创建表成功的消息
    System.out.println("create table successfully");
  6. 插入数据。

    代码如下:

        // 在 "test" 表中插入两行数据
    stmt.execute("insert into test values (1, 'aaa'),(2, 'bbb')");
    // 打印插入数据成功的消息
    System.out.println("insert data successfully");
  7. 查询数据。

    代码如下:

        // 打印查询数据的消息
    System.out.println("query data : ");
    // 执行查询 SQL 语句,获取 "test" 表中的所有数据
    ResultSet rs = stmt.executeQuery("select * from test");
    // 遍历结果集
    while (rs.next()) {
    // 打印每条数据的 "id" 和 "name" 字段
    System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
  8. 更新数据。

    代码如下:

        // 更新 "test" 表中 id 为 1 的记录的 "name" 字段为 'bbb'
    stmt.execute("update test set name = 'bbb' where id = 1");
    // 打印更新数据成功的消息
    System.out.println("update data successfully");
  9. 删除数据。

    代码如下:

        // 删除 "test" 表
    stmt.execute("drop table test");
    // 关闭结果集、语句和数据库连接
    rs.close();
    stmt.close();
    connection.close();
  10. 异常处理。

    执行以上数据库操作的过程中发生任何异常,这些异常将被捕捉,并打印错误信息以及堆栈跟踪详情。

    代码如下:

        } catch (Exception e) {
    System.out.println("error!");
    e.printStackTrace();
    }

完整的代码展示

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>JDBCDemo</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.mysql</groupId>-->
<!-- <artifactId>mysql-connector-j</artifactId>-->
<!-- <version>8.0.33</version>-->
<!-- </dependency>-->
</dependencies>
</project>

Main.java

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

public class JDBCTest {

public static void main(String[] args) {
try {
//load driver
Class.forName("com.mysql.jdbc.Driver"); //mysql-jdbc 5
// Class.forName("com.mysql.cj.jdbc.Driver"); //mysql-jdbc 8

//create connection
Connection connection = DriverManager.getConnection("jdbc:mysql://{host}:{port}/{dbname}?user={username}&password={******}");
System.out.println("jdbc version : " + connection.getMetaData().getDriverVersion());
Statement stmt = connection.createStatement();

//create table
stmt.execute("drop table if exists test");
stmt.execute("create table test (id int, name varchar(25))");
System.out.println("create table successfully");

//insert data
stmt.execute("insert into test values (1, 'aaa'),(2, 'bbb')");
System.out.println("insert data successfully");

//query data
System.out.println("query data : ");
ResultSet rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}

//update data
stmt.execute("update test set name = 'bbb' where id = 1");
System.out.println("update data successfully");

//query data after update
System.out.println("query data after update : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}

//delete data
stmt.execute("delete from test where id = 1");
System.out.println("delete data successfully");

//query data after delete
System.out.println("query data after delete : ");
rs = stmt.executeQuery("select * from test");
while (rs.next()) {
System.out.println(rs.getString("id") + "\t" + rs.getString("name"));
}

//drop table
stmt.execute("drop table test");
//close
rs.close();
stmt.close();
connection.close();
} catch (Exception e) {
System.out.println("error!");
e.printStackTrace();
}
}
}

最佳实践

批量操作

使用批处理提高性能:

PreparedStatement pstmt = connection.prepareStatement("INSERT INTO test VALUES (?, ?)");
for (int i = 0; i < 1000; i++) {
pstmt.setInt(1, i);
pstmt.setString(2, "name" + i);
pstmt.addBatch();
}
pstmt.executeBatch();

预处理语句

使用预处理语句防止 SQL 注入:

PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM test WHERE id = ?");
pstmt.setInt(1, 1);
ResultSet rs = pstmt.executeQuery();

常见问题

1. 连接超时

配置连接超时参数:

jdbc:mysql://host:port/database?connectTimeout=30000&socketTimeout=60000

2. 字符集问题

设置正确的字符集:

jdbc:mysql://host:port/database?characterEncoding=utf8&useUnicode=true

3. SSL 连接

启用 SSL 连接:

jdbc:mysql://host:port/database?useSSL=true&requireSSL=true

4. 账号密码中的特殊字符

如果账号密码中包含特殊字符(如 #),需要进行 URL 编码:

String encodedPassword = URLEncoder.encode(password, "UTF-8");
信息

使用 MySQL Connector/J 8.x 版本时,账号密码中需避免包含 # 字符,否则可能导致连接失败。

更多信息

创建 Java 示例应用程序的完整示例,参见 Java 示例应用程序