您尚未登录,请登录后浏览更多内容! 登录 | 加入最MC

QQ登录

只需一步,快速开始

 找回密码
 加入最MC

QQ登录

只需一步,快速开始

查看: 4066|回复: 0
打印 上一主题 下一主题

[教程]Bukkit中的MySql基本教程

[复制链接]
  • TA的每日心情
    慵懒
    2019-2-10 10:44
  • 签到天数: 56 天

    [LV.5]常住居民I

    跳转到指定楼层
    楼主
    发表于 2017-3-7 20:54:44 | 只看该作者 |0人打赏回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 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方便调用。
    如果你在使用过程中遇到了问题,下面这些链接说不定能帮助到你:
    如果你还有什么疑问,也可以在这个帖子下提出。
    如果本帖有什么错误,还请各位批评指正!


    评分

    参与人数 1人气 +6 MC币 +24 收起 理由
    Dream_Black + 6 + 24 支持原创内容!

    查看全部评分

    打赏

    0

    收藏

    0

    支持

    0

    反对

    0

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    您需要登录后才可以回帖 登录 | 加入最MC

    本版积分规则