- UID
- 102568
- 阅读权限
- 100
- 注册时间
- 2016-8-1
- 最后登录
- 1970-1-1
- 在线时间
- 小时
- 人气
- 点
- MC币
- 个
- 贡献
- 点
TA的每日心情 | 慵懒 2019-2-10 10:44 |
---|
签到天数: 56 天 [LV.5]常住居民I
|
本帖最后由 lss233 于 2017-3-26 10:42 编辑
最近看见不少同学在研究MySQL,所以我打算写一篇关于Java的MySQL使用方法。考虑到各位应该会在自己开发的Bukkit插件里用到MySQL,所以这篇教程的代码就是以插件为例子的。
注意:本帖不是MySQL教程,阅读本教程你需要有一定的Java基础和SQL知识。
初始化MySQL 首先,我们需要准备一些配置信息来链接到MySQL服务器,常用的方法就算把它保存在插件的config.yml配置文件中。通常情况下,你需要这些内容:
- 数据库服务器地址
- 数据库端口
- 数据库用户名
- 数据库密码
- 数据库名
所以你可以在config.yml里预留像这样一段配置文本:
- mysql:
- #数据库服务器地址
- host: localhost
- #数据库服务器端口
- port: 3306
- #数据库用户名
- user: lss233
- #数据库密码
- password: root
- #数据库名
- database: minecraft
复制代码
连接到MySQL
现在,我们写一个方法来获取我们的MySQL连接。这个方法需要访问到上面预先准备的配置信息,因此建议写在插件的主类中。
现在开始写代码:
- private Connection getNewConnection() {
- // 获取之前准备的配置
- String host = getConfig().getString("mysql.host");
- String port = getConfig().getString("mysql.port");
- String database = getConfig().getString("mysql.database");
- String user = getConfig().getString("mysql.user");
- String password = getConfig().getString("mysql.password");
- try {
- Class.forName("com.mysql.jdbc.Driver");
- String url = "jdbc:mysql://" + host + ":" + port + "/" + database;
- Connection connection = DriverManager.getConnection(url, user, password);
- return connection;
- } catch (ClassNotFoundException | SQLException e) {
- e.printStacktrace();
- return null;
- }
- } </span>
- </span>
复制代码
然后,我们就可以在服务器开启时连接到MySQL,把这段代码写在插件主类的相应位置中:
- // 全局变量,数据库连接句柄
- private Connection connection;
- public void onEnable(){
- // 你自己的代码
- connection = getNewConnection(); // 获得一个连接句柄
- }
复制代码
大部分MySQL服务器有一个特性,就是长时间没有操作时会主动断开连接,如果没有及时重新连接,那么接下来所有的数据库查询操作都会出现异常。
为了避免这个情况,我们需要再准备一个定时任务来保持和数据库的通讯。建议把这段代码写在插件主类的onEnable()中。
- (new BukkitRunnable() {
- @Override
- public void run() {
- try {
- if (connection != null && !connection.isClosed()) {
- connection.createStatement().execute("SELECT 1");
- }
- } catch (SQLException e) {
- connection = getNewConnection();
- }
- }
- }).runTaskTimerAsynchronously(this, 60 * 20, 60 * 20);
复制代码
上面这个定时任务就会每隔1分钟执行一次没什么用的查询,以此保持连接。
现在,我们还需要一个方法能关闭数据库连接,以免在空闲时对服务器资源造成浪费。
- public void close() throws SQLException {
复制代码 别忘了在onDisable()里调用一遍这个方法。
执行SQL语句
以下内容涉及到SQL语句。
连接到数据库后,我们就可以开始执行SQL语句了。
Connection提供了两种实用的查询语句,它们分别是Statement和PreparedStatement。关于两者的区别可以参考这篇文章,【Java】PreparedStatement和Statement的区别,这里不再复述。
我们可以用类似于下面的这段来执行SQL语句:详细的内容我就举几个例子来说明吧:
创建表
下面这行代码会创建了一个名为 player_data 的表,如果表已经存在则跳过。- String sql = "CREATE TABLE IF NOT EXISTS player_data(uuid varchar NOT NULL,name varchar NOT NULL,age integer NOT NULL)";
复制代码 插入数据
现在我们向 player_data 插入一段数据。
通过PreparedStatement的set数据类型(索引,数据内容),我们可以快速、安全地拼接SQL语句。
在SQL语句中,我们使用?来代替需要查询的语句,然后使用set来替换。
set中的索引对应的就是我们要替换的第几个问号。注意,这里的索引是从1开始的。
比较常用的set:
- setInt //整数
- setString //字符串
- setBoolean //布尔型
- setDouble //浮点型
- setDate //时间日期
- setObject //泛型
- //准备插入的数据
- String uuid="3c6f1a50-e05d-48ba-952e-10b83b701fbd",name="lss233";
- int age=14;
- //使用?代替变量
- String sql="INSERT INTO player_data (uuid,name,age) values(?,?,?);
- PreparedStatement statement = connection.getprepareStatement(sql);
- //绑定变量
- statement.setString(1,uuid);
- statement.setString(2,name);
- statement.setInt(3,age);
- statement.executeUpdate();
复制代码 查询数据
现在我们试试获取刚刚插入的数据。
通过PreparedStatement的executeQuery方法,我们可以得到一个ResultSet,它是一个集合。
每次调用ResultSet中的next()方法,这个集合就会尝试把当前的光标向下移一行,如果返回True则表示有数据,如果返回False,则表示下一行没有数据。
通过get数据类型(列名),我们就可以方便地获得查询结果,这里和前面的set是一样的:
- getInt //整数
- getString //字符串
- getBoolean //布尔型
- getDouble //浮点型
- getDate //时间日期
- getObject //泛型
- //预留的uuid
- String uuid = "3c6f1a50-e05d-48ba-952e-10b83b701fbd";
复制代码
以上就是MySQL的基本使用教程。
后话
数据库操作涉及的内容较多,建议专门封装成一个Utils方便调用。
如果你在使用过程中遇到了问题,下面这些链接说不定能帮助到你:
如果你还有什么疑问,也可以在这个帖子下提出。
如果本帖有什么错误,还请各位批评指正!
|
|
评分
-
查看全部评分
|