From 26a49e8fbec4d89e8e0f304f351d712e3f74e928 Mon Sep 17 00:00:00 2001 From: 502647092 Date: Mon, 5 Sep 2016 11:08:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=A0=B8=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 502647092 --- .../yumc/YumCore/sql/core/DataBaseCore.java | 184 ++++++++++++++++++ .../pw/yumc/YumCore/sql/core/KeyValue.java | 176 +++++++++++++++++ .../pw/yumc/YumCore/sql/core/MySQLCore.java | 96 +++++++++ .../pw/yumc/YumCore/sql/core/SQLiteCore.java | 126 ++++++++++++ 4 files changed, 582 insertions(+) create mode 100644 src/main/java/pw/yumc/YumCore/sql/core/DataBaseCore.java create mode 100644 src/main/java/pw/yumc/YumCore/sql/core/KeyValue.java create mode 100644 src/main/java/pw/yumc/YumCore/sql/core/MySQLCore.java create mode 100644 src/main/java/pw/yumc/YumCore/sql/core/SQLiteCore.java diff --git a/src/main/java/pw/yumc/YumCore/sql/core/DataBaseCore.java b/src/main/java/pw/yumc/YumCore/sql/core/DataBaseCore.java new file mode 100644 index 0000000..1fabb3b --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/sql/core/DataBaseCore.java @@ -0,0 +1,184 @@ +package pw.yumc.YumCore.sql.core; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import pw.yumc.YumCore.bukkit.Log; + +/** + * 数据库核心类 + * + * @since 2015年12月14日 下午1:26:15 + * @author 喵♂呜 + */ +public abstract class DataBaseCore { + /** + * 创建数据表 + * + * @param tableName + * 表名 + * @param fields + * 字段参数 + * @param Conditions + * -附加值 + * @return 运行结果 + * @throws SQLException + * SQL异常 + */ + public abstract boolean createTables(final String tableName, final KeyValue fields, final String Conditions) throws SQLException; + + /** + * 执行SQL语句 + * + * @param sql + * SQL语句 + * @return 是否执行成功 + * @throws SQLException + * SQL执行异常 + */ + public boolean execute(final String sql) throws SQLException { + debug(sql); + final Statement st = getStatement(); + final boolean result = st.execute(sql); + st.close(); + return result; + } + + /** + * 执行SQL语句(预处理) + * + * @param sql + * SQL语句 + * @param obj + * 参数 + * @return 是否执行成功 + * @throws SQLException + * SQL执行异常 + */ + public boolean execute(final String sql, final Object... obj) throws SQLException { + debug(sql); + final PreparedStatement ps = prepareStatement(sql); + for (int i = 0; i < obj.length; i++) { + ps.setObject(i + 1, obj[i]); + } + final boolean result = ps.execute(sql); + ps.close(); + return result; + } + + /** + * @return 获得自增关键词 + */ + public String getAUTO_INCREMENT() { + return "AUTO_INCREMENT"; + } + + /** + * 获得连接池中打开的数据连接. + * + * @return 数据连接 + */ + public abstract Connection getConnection(); + + /** + * 查询数据库 + * + * @param sql + * SQL查询语句 + * @return 查询结果 + * @throws SQLException + * SQL查询异常 + */ + public ResultSet query(final String sql) throws SQLException { + debug(sql); + final Statement st = getStatement(); + final ResultSet result = st.executeQuery(sql); + return result; + } + + /** + * 更新数据库内的数据 + * + * @param sql + * SQL更新语句 + * @return 受到影响的行数 + * @throws SQLException + * SQL执行异常 + */ + public int update(final String sql) throws SQLException { + debug(sql); + final Statement st = getStatement(); + final int result = st.executeUpdate(sql); + st.close(); + return result; + } + + /** + * 更新数据库内的数据(预处理) + * + * @param sql + * SQL更新语句 + * @param obj + * 参数 + * @return 受到影响的行数 + * @throws SQLException + * SQL执行异常 + */ + public int update(final String sql, final Object[] obj) throws SQLException { + debug(sql); + final PreparedStatement ps = prepareStatement(sql); + for (int i = 0; i < obj.length; i++) { + ps.setObject(i + 1, obj[i]); + } + final int result = ps.executeUpdate(sql); + ps.close(); + return result; + } + + /** + * 发送警告 + * + * @param warn + * 警告消息 + */ + public void warn(final String warn) { + Log.warning(warn); + } + + /** + * SQL调试消息 + * + * @param sql + * SQL语句 + */ + private void debug(final String sql) { + Log.debug("[SQL] " + sql); + } + + /** + * 获得数据操作对象 + * + * @return 操作对象 + * @throws SQLException + * SQL执行异常 + */ + protected Statement getStatement() throws SQLException { + return getConnection().createStatement(); + } + + /** + * 获得数据操作对象(预处理) + * + * @param sql + * SQL语句 + * @return 操作对象 + * @throws SQLException + * SQL执行异常 + */ + protected PreparedStatement prepareStatement(final String sql) throws SQLException { + return getConnection().prepareStatement(sql); + } +} diff --git a/src/main/java/pw/yumc/YumCore/sql/core/KeyValue.java b/src/main/java/pw/yumc/YumCore/sql/core/KeyValue.java new file mode 100644 index 0000000..02f382a --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/sql/core/KeyValue.java @@ -0,0 +1,176 @@ +package pw.yumc.YumCore.sql.core; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +/** + * 数据库键值管理类 + * + * @since 2015年12月14日 下午1:26:24 + * @author 喵♂呜 + */ +public class KeyValue { + + private final HashMap keyvalues = new HashMap(); + + /** + * 数据库键值管理类 + */ + public KeyValue() { + } + + /** + * 数据库键值管理类 + * + * @param key + * 键 + * @param value + * 值 + */ + public KeyValue(final String key, final Object value) { + add(key, value); + } + + /** + * 添加数据 + * + * @param key + * 键 + * @param value + * 值 + * @return {@link KeyValue} + */ + public KeyValue add(final String key, final Object value) { + this.keyvalues.put(key, value); + return this; + } + + /** + * 获得所有的键 + * + * @return 所有的键 + */ + public String[] getKeys() { + return this.keyvalues.keySet().toArray(new String[0]); + } + + /** + * 获得值 + * + * @param key + * 查询的键 + * @return 值 + */ + public String getString(final String key) { + final Object obj = this.keyvalues.get(key); + return obj == null ? "" : obj.toString(); + } + + /** + * 获得所有的值 + * + * @return 所有的值 + */ + public Object[] getValues() { + final List keys = new ArrayList(); + for (final Entry next : this.keyvalues.entrySet()) { + keys.add(next.getValue()); + } + return keys.toArray(new Object[0]); + } + + /** + * 判断数据是否为空 + * + * @return 数据是否为空 + */ + public boolean isEmpty() { + return this.keyvalues.isEmpty(); + } + + /** + * 转换为数据表创建SQL语句 + * + * @return 数据表创建SQL语句 + */ + public String toCreateString() { + final StringBuilder sb = new StringBuilder(); + for (final Entry next : this.keyvalues.entrySet()) { + sb.append("`"); + sb.append(next.getKey()); + sb.append("` "); + sb.append(next.getValue()); + sb.append(", "); + } + return sb.toString().substring(0, sb.length() - 2); + } + + /** + * 转换字段为数据添加SQL语句 + * + * @return 添加SQL语句 + */ + public String toInsertString() { + String ks = ""; + String vs = ""; + for (final Entry next : this.keyvalues.entrySet()) { + ks += "`" + next.getKey() + "`, "; + vs += "'" + next.getValue() + "', "; + } + return "(" + ks.substring(0, ks.length() - 2) + ") VALUES (" + vs.substring(0, vs.length() - 2) + ")"; + } + + /** + * @return 转换为键列 + */ + public String toKeys() { + final StringBuilder sb = new StringBuilder(); + for (final Object next : this.keyvalues.keySet()) { + sb.append("`"); + sb.append(next); + sb.append("`, "); + } + return sb.toString().substring(0, sb.length() - 2); + } + + @Override + public String toString() { + return this.keyvalues.toString(); + } + + /** + * 转换字段为更新SQL语句 + * + * @return 更新SQL语句 + */ + public String toUpdateString() { + final StringBuilder sb = new StringBuilder(); + for (final Entry next : this.keyvalues.entrySet()) { + sb.append("`"); + sb.append(next.getKey()); + sb.append("`='"); + sb.append(next.getValue()); + sb.append("' ,"); + } + return sb.substring(0, sb.length() - 2); + } + + /** + * 转换字段为查询SQL语句 + * + * @return 查询SQL语句 + */ + public String toWhereString() { + final StringBuilder sb = new StringBuilder(); + for (final Entry next : this.keyvalues.entrySet()) { + sb.append("`"); + sb.append(next.getKey()); + sb.append("`='"); + sb.append(next.getValue()); + sb.append("' and "); + } + return sb.substring(0, sb.length() - 5); + } +} diff --git a/src/main/java/pw/yumc/YumCore/sql/core/MySQLCore.java b/src/main/java/pw/yumc/YumCore/sql/core/MySQLCore.java new file mode 100644 index 0000000..8e3ced9 --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/sql/core/MySQLCore.java @@ -0,0 +1,96 @@ +package pw.yumc.YumCore.sql.core; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +import org.bukkit.configuration.ConfigurationSection; + +/** + * 数据库操作类 + * + * @since 2015年12月14日 下午1:26:39 + * @author 喵♂呜 + */ +public class MySQLCore extends DataBaseCore { + private static final String driverName = "com.mysql.jdbc.Driver"; + private Connection connection; + private final Properties info; + private final String url; + + /** + * 初始化连接信息 + * + * @param cfg + * 配置节点 + */ + public MySQLCore(final ConfigurationSection cfg) { + this(cfg.getString("ip", "127.0.0.1"), cfg.getInt("port", 3306), cfg.getString("database", "minecraft"), cfg.getString("username", "root"), cfg.getString("password", "")); + } + + /** + * 初始化连接信息 + * + * @param host + * 域名 + * @param port + * 端口 + * @param dbname + * 数据库 + * @param username + * 用户名 + * @param password + * 密码 + */ + public MySQLCore(final String host, final int port, final String dbname, final String username, final String password) { + this.info = new Properties(); + this.info.put("autoReconnect", "true"); + this.info.put("user", username); + this.info.put("password", password); + this.info.put("useUnicode", "true"); + this.info.put("characterEncoding", "utf8"); + this.url = "jdbc:mysql://" + host + ":" + port + "/" + dbname; + try { + Class.forName(driverName).newInstance(); + } catch (final Exception e) { + warn("数据库初始化失败 请检查驱动 " + driverName + " 是否存在!"); + } + } + + /** + * 创建数据表 + * + * @param tableName + * 表名 + * @param fields + * 字段参数 + * @param Conditions + * -附加值 + * @return 运行结果 + * @throws SQLException + * SQL异常 + */ + @Override + public boolean createTables(final String tableName, final KeyValue fields, final String Conditions) throws SQLException { + final String sql = "CREATE TABLE IF NOT EXISTS `%s` ( %s %s ) ENGINE = InnoDB DEFAULT CHARSET=UTF8"; + return execute(String.format(sql, tableName, fields.toCreateString(), Conditions == null ? "" : ", " + Conditions)); + } + + @Override + public Connection getConnection() { + try { + if (this.connection != null && !this.connection.isClosed()) { + return this.connection; + } + this.connection = DriverManager.getConnection(this.url, this.info); + return this.connection; + } catch (final SQLException e) { + warn("数据库操作出错: " + e.getMessage());// 得到出错信息 + warn("登录URL: " + this.url); // 发生错误时,将连接数据库信息打印出来 + warn("登录账户: " + this.info.getProperty("user")); + warn("登录密码: " + this.info.getProperty("password")); + return null; + } + } +} diff --git a/src/main/java/pw/yumc/YumCore/sql/core/SQLiteCore.java b/src/main/java/pw/yumc/YumCore/sql/core/SQLiteCore.java new file mode 100644 index 0000000..2e5ecca --- /dev/null +++ b/src/main/java/pw/yumc/YumCore/sql/core/SQLiteCore.java @@ -0,0 +1,126 @@ +package pw.yumc.YumCore.sql.core; + +import java.io.File; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.plugin.Plugin; + +/** + * 数据库操作类 + * + * @since 2015年7月14日 下午3:25:06 + * @author 喵♂呜 + */ +public class SQLiteCore extends DataBaseCore { + private static final String driverName = "org.sqlite.JDBC"; + private Connection connection; + private final File dbFile; + + /** + * 初始化连接信息 + * + * @param dbFile + * 数据库文件 + */ + public SQLiteCore(final File dbFile) { + this.dbFile = dbFile; + if (this.dbFile.exists()) { + // So we need a new connection + try { + this.dbFile.createNewFile(); + } catch (final IOException e) { + warn("数据库文件 " + dbFile.getAbsolutePath() + " 创建失败!"); + e.printStackTrace(); + } + } + try { + Class.forName(driverName).newInstance(); + } catch (final Exception e) { + warn("数据库初始化失败 请检查驱动 " + driverName + " 是否存在!"); + e.printStackTrace(); + } + } + + /** + * 初始化连接信息 + * + * @param plugin + * 插件实体 + * @param cfg + * 配置信息 + */ + public SQLiteCore(final Plugin plugin, final ConfigurationSection cfg) { + this(plugin, cfg.getString("database")); + } + + /** + * 初始化连接信息 + * + * @param plugin + * 插件实体 + * @param filename + * 文件名称 + */ + public SQLiteCore(final Plugin plugin, final String filename) { + this.dbFile = new File(plugin.getDataFolder(), filename + ".db"); + if (this.dbFile.exists()) { + // So we need a new connection + try { + this.dbFile.createNewFile(); + } catch (final IOException e) { + warn("数据库文件 " + this.dbFile.getAbsolutePath() + " 创建失败!"); + e.printStackTrace(); + } + } + try { + Class.forName(driverName).newInstance(); + } catch (final Exception e) { + warn("数据库初始化失败 请检查驱动 " + driverName + " 是否存在!"); + e.printStackTrace(); + } + } + + /** + * 初始化连接信息 + * + * @param filepath + * 文件路径 + */ + public SQLiteCore(final String filepath) { + this(new File(filepath)); + } + + @Override + public boolean createTables(final String tableName, final KeyValue fields, final String Conditions) throws SQLException { + final String sql = "CREATE TABLE IF NOT EXISTS `%s` ( %s %s )"; + return execute(String.format(sql, tableName, fields.toCreateString().replace("AUTO_INCREMENT", "AUTOINCREMENT"), Conditions == null ? "" : " , " + Conditions)); + } + + /** + * @return 获得自增关键词 + */ + @Override + public String getAUTO_INCREMENT() { + return "AUTOINCREMENT"; + } + + @Override + public Connection getConnection() { + try { + if (this.connection != null && !this.connection.isClosed()) { + return this.connection; + } + this.connection = DriverManager.getConnection("jdbc:sqlite:" + this.dbFile); + return this.connection; + } catch (final SQLException e) { + warn("数据库操作出错: " + e.getMessage());// 得到出错信息 + warn("数据库文件: " + this.dbFile.getAbsolutePath()); // 发生错误时,将连接数据库信息打印出来 + return null; + } + } + +}