最MC论坛

标题: [教程]Bukkit中的MySql基本教程 [打印本页]

作者: lss233    时间: 2017-3-7 20:54
标题: [教程]Bukkit中的MySql基本教程
本帖最后由 lss233 于 2017-3-26 10:42 编辑


最近看见不少同学在研究MySQL,所以我打算写一篇关于Java的MySQL使用方法。考虑到各位应该会在自己开发的Bukkit插件里用到MySQL,所以这篇教程的代码就是以插件为例子的。
注意:本帖不是MySQL教程,阅读本教程你需要有一定的Java基础和SQL知识。

初始化MySQL
首先,我们需要准备一些配置信息来链接到MySQL服务器,常用的方法就算把它保存在插件的config.yml配置文件中。通常情况下,你需要这些内容:
  • 数据库服务器地址
  • 数据库端口
  • 数据库用户名
  • 数据库密码
  • 数据库名
所以你可以在config.yml里预留像这样一段配置文本:
  1. mysql:
  2.   #数据库服务器地址
  3.   host: localhost
  4.   #数据库服务器端口
  5.   port: 3306
  6.   #数据库用户名
  7.   user: lss233
  8.   #数据库密码
  9.   password: root
  10.   #数据库名
  11.   database: minecraft
复制代码



连接到MySQL

现在,我们写一个方法来获取我们的MySQL连接。这个方法需要访问到上面预先准备的配置信息,因此建议写在插件的主类中。
现在开始写代码:
  1. private Connection getNewConnection() {
  2.     // 获取之前准备的配置
  3.     String host = getConfig().getString("mysql.host");
  4.     String port = getConfig().getString("mysql.port");
  5.     String database = getConfig().getString("mysql.database");
  6.     String user = getConfig().getString("mysql.user");
  7.     String password = getConfig().getString("mysql.password");
  8.     try {
  9.           Class.forName("com.mysql.jdbc.Driver");

  10.           String url = "jdbc:mysql://" + host + ":" + port + "/" + database;
  11.           Connection connection = DriverManager.getConnection(url, user, password);
  12.           return connection;
  13.     } catch (ClassNotFoundException | SQLException e) {
  14.           e.printStacktrace();
  15.           return null;
  16.     }
  17. }    </span>
  18. </span>
复制代码

然后,我们就可以在服务器开启时连接到MySQL,把这段代码写在插件主类的相应位置中:
  1. // 全局变量,数据库连接句柄
  2. private Connection connection;
  3. public void onEnable(){
  4.   // 你自己的代码
  5.   connection = getNewConnection(); // 获得一个连接句柄
  6. }
复制代码

大部分MySQL服务器有一个特性,就是长时间没有操作时会主动断开连接,如果没有及时重新连接,那么接下来所有的数据库查询操作都会出现异常。
为了避免这个情况,我们需要再准备一个定时任务来保持和数据库的通讯。建议把这段代码写在插件主类的onEnable()中。
  1. (new BukkitRunnable() {
  2.       @Override
  3.       public void run() {
  4.            try {
  5.                 if (connection != null && !connection.isClosed()) {
  6.                     connection.createStatement().execute("SELECT 1");
  7.                }
  8.            } catch (SQLException e) {
  9.                connection = getNewConnection();
  10.           }
  11.      }
  12. }).runTaskTimerAsynchronously(this, 60 * 20, 60 * 20);
复制代码

上面这个定时任务就会每隔1分钟执行一次没什么用的查询,以此保持连接。
现在,我们还需要一个方法能关闭数据库连接,以免在空闲时对服务器资源造成浪费。
  1. public void close() throws SQLException {
复制代码
别忘了在onDisable()里调用一遍这个方法。

执行SQL语句
以下内容涉及到SQL语句。
连接到数据库后,我们就可以开始执行SQL语句了。
Connection提供了两种实用的查询语句,它们分别是StatementPreparedStatement。关于两者的区别可以参考这篇文章,【Java】PreparedStatement和Statement的区别,这里不再复述。
我们可以用类似于下面的这段来执行SQL语句:
  1. String sql="你的SQL语句";
复制代码
详细的内容我就举几个例子来说明吧:
创建表
下面这行代码会创建了一个名为 player_data 的表,如果表已经存在则跳过。
  1. String sql = "CREATE TABLE IF NOT EXISTS player_data(uuid varchar NOT NULL,name varchar NOT NULL,age integer NOT NULL)";
复制代码
插入数据
现在我们向 player_data 插入一段数据。
通过PreparedStatementset数据类型(索引,数据内容),我们可以快速、安全地拼接SQL语句。
在SQL语句中,我们使用?来代替需要查询的语句,然后使用set来替换。
set中的索引对应的就是我们要替换的第几个问号。注意,这里的索引是从1开始的。
比较常用的set:
  • setInt //整数
  • setString //字符串
  • setBoolean //布尔型
  • setDouble //浮点型
  • setDate //时间日期
  • setObject //泛型
  1. //准备插入的数据
  2. String uuid="3c6f1a50-e05d-48ba-952e-10b83b701fbd",name="lss233";
  3. int age=14;
  4. //使用?代替变量
  5. String sql="INSERT INTO player_data (uuid,name,age) values(?,?,?);
  6. PreparedStatement statement = connection.getprepareStatement(sql);
  7. //绑定变量
  8. statement.setString(1,uuid);
  9. statement.setString(2,name);
  10. statement.setInt(3,age);
  11. statement.executeUpdate();
复制代码
查询数据
现在我们试试获取刚刚插入的数据。
通过PreparedStatement的executeQuery方法,我们可以得到一个ResultSet,它是一个集合。
每次调用ResultSet中的next()方法,这个集合就会尝试把当前的光标向下移一行,如果返回True则表示有数据,如果返回False,则表示下一行没有数据。
通过get数据类型(列名),我们就可以方便地获得查询结果,这里和前面的set是一样的:
  • getInt //整数
  • getString //字符串
  • getBoolean //布尔型
  • getDouble //浮点型
  • getDate //时间日期
  • getObject //泛型
  1. //预留的uuid
  2. String uuid = "3c6f1a50-e05d-48ba-952e-10b83b701fbd";
复制代码

以上就是MySQL的基本使用教程。

后话

数据库操作涉及的内容较多,建议专门封装成一个Utils方便调用。
如果你在使用过程中遇到了问题,下面这些链接说不定能帮助到你:
如果你还有什么疑问,也可以在这个帖子下提出。
如果本帖有什么错误,还请各位批评指正!







欢迎光临 最MC论坛 (https://www.zuimc.com/) Powered by Discuz! X3.2