配置 MySQL 数据库与插件集成
先决条件
你需要先安装 JDBC,它可以从:http://dev.mysql.com/downloads/connector/j/5.1.html#downloads 获取。
关于 JDBC 的基本解释
JDBC 是 Java 数据库连接 API,允许使用 SQL 工作。Spigot 提供了 J MySQL 连接器,让你可以连接到 MySQL 数据库并在 Java 语言中运行 MySQL 查询。
代码示例
我们必须创建一些可以让我们连接到数据库的变量。这就是我们需要创建的东西。(注意,这些是字段变量而不是局部变量)。
//数据库
final String username="YOUR DB USERNAME"; // (1)
final String password="YOUR DB PASSWORD"; // (2)
final String url = "jdbc:mysql://db4free.net:3306/DataBaseName"; // (3)
//连接
static Connection connection; // (4)
- 数据库用户名
- 数据库密码
- 数据库地址
- 用于连接数据库的变量
现在我们需要使用我们制作的由 Java 提供的连接变量连接到数据库。我们通过在 onEnable 中给我们的连接变量分配属性,然后尝试进行连接。这就是我们需要使用的代码。
同样,把这段代码放在 onEnable();
方法中,因为我们要在启动服务器后立即尝试连接。
try { // (1)
connection = DriverManager.getConnection(url, username, password);
// (2)
} catch (SQLException e) { // (3)
e.printStackTrace(); // (4)
}
- 尝试捕获以获得任何 SQL 错误(例如连接错误)
- 通过
DriverManager
的getConnection()
方法,我们试图将连接的 url、用户名、密码设置为我们之前制作的变量,并试图同时获得一个连接。JDBC 允许我们这样做。 - 捕获异常
- 将 SQLException 错误打印到控制台(如果有)
现在是时候让我们的插件关闭连接了,因为我们不希望无用的连接还在附近徘徊。我们将通过在 onDisable()
方法中关闭连接变量来做到这一点。因此,当服务器关闭时,我们不需要这个连接还在那里。
public void onDisable() {
// (1)
try { // (2)
if (connection!=null && !connection.isClosed()){ // (3)
connection.close(); // (4)
}
} catch(Exception e) {
e.printStackTrace();
}
}
- 禁用时调用
- 使用 try catch 来捕捉连接错误(如错误的 sql 密码......)
- 检查连接是否为空,以避免收到空指针
- 关闭连接字段变量
如果你可以建立一个连接,那么你就可以执行查询和更新。这里有一个快速提示,无论何时你想修改数据库,请使用 Statement#executeUpdate,但如果你只是想从数据库中获取信息,只需执行 Statement#executeQuery。
首先,我们必须创建一个表。
String sql = "CREATE TABLE IF NOT EXISTS myTable(Something varchar(64));"; // (1)
try {
PreparedStatement stmt = connection.prepareStatement(sql); //(2)
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
- 准备要执行的语句
- 使用
executeUpdate()
来更新数据库表
之后,我们就可以从数据库中进行更新和查询了。
String sql = "SELECT * FROM myTable WHERE Something=?"; // (1)
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, "Something"); // (2)
ResultSet results = stmt.executeQuery();
if (!results.next()) {
System.out.println("Failed");
} else {
System.out.println("Success");
}
- 注意问号作为输入值的占位符
- 将第一个
?
设置为查询字符串
这段代码将打印出 "失败",因为我们没有值可以选择。让我们现在添加一些。
String sql = "INSERT INTO myTable(Something) VALUES ('?');";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, "Something"); // (1)
stmt.executeUpdate();
- 将第一个
?
设为Something
现在,如果我们重新运行之前的查询代码,我们会得到 "成功",因为一个值已经被插入并被选中供我们查看。
如果在 Spigot 插件中使用,你应该确保你的数据库查询不会在主服务器线程上运行(通过使用 BukkitScheduler#runTaskAsynchronously),除非绝对必要。
推荐的库
有几个不同类型的库可用于使与 MySQL 数据库的工作更容易。
连接池
你可能想要使用的主要设计原则是连接池,以允许共享多个连接,而不必在你当前的连接上等待。Java 的 SQL API 包括一个简单的连接池设计,但像 HikariCP 这样的附加库简化了它们的使用并提高了它们的性能。只要记住在你使用完连接后直接关闭所有的连接,这样它们就可以被池子重新使用。
对象关系映射(ORM)
ORM 是一种直接将 Java 对象映射到其在数据库中的表现形式的方法,不需要自己编写查询或表结构,它们为你做这一切。
常用的提供该功能的库有 OrmLite(支持 MySQL、Postgres、Microsoft SQL Server、H2、Derby、HSQLDB,而不仅仅是 Sqlite)以及 Hibernate(一种先进的、可能是行业标准的 ORM 解决方案)。
查询简化和一般帮助工具
SansOrm 是一个旨在取代 ORM 的库,它允许你仍然完全控制你的表方案以及你的查询,同时与编写传统的 SQL 查询相比,仍然大量减少模板。
IDB(Intuitive Database Wrapper)旨在简化创建 SQL 查询的模板,并与 HikariCP 集成。