resultset.getObject

时间:2016-01-25 03:59:04

标签: java mysql eclipse jdbc minecraft

所以我构建了一个minecraft插件,插件的一部分从mysql中获取了一堆块数据,并在服务器启动时将其加载到缓存中。我有一些在eclipse测试用例中运行良好的代码。但是,当我在本地的Minecraft服务器中加载插件时,我得到了异常。

    java.lang.AbstractMethodError: Method com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; is abstract
            at com.mysql.jdbc.JDBC4ResultSet.getObject(JDBC4ResultSet.java) ~[spigot-1.8.8.jar:git-Spigot-db6de12-d3e0b6f]
            at fws.plugins.trigger.database.ModelDB.loadCollection(ModelDB.java:335) ~[?:?]
            at fws.plugins.trigger.database.ModelDB.all(ModelDB.java:295) ~[?:?]
etc...



抛出exeption的代码。

rs.getObject( field.getName(), p.fieldType());

rs是从执行的查询返回的java.sql.ResultSet实例。
p.fieldType()只返回Class<?>



稍微大一点的片段......不是它真的向你展示了其他任何内容。

if (field.isAnnotationPresent(Persist.class)) {
    try {
        Persist p = field.getAnnotation(Persist.class);
        Object o = rs.getObject( field.getName(), p.fieldType());
        field.set(m,p.fieldType().cast(o));

    } catch (Exception e) {
        // TODO Auto-generated catch block 
        e.printStackTrace();
    } 
}

我看过网上的人说要修复我需要包含ojdbc6.jar并将其用作我的连接驱动程序。
我将文件添加到文件夹lib下的项目结构中,将其包含在我的项目中,然后将其添加到我的构建文件中。 http://i.imgur.com/7TXLbjj.png 并将连接驱动程序更改为oracle.jdbc.OracleDriver

然而我遇到同样的问题,似乎不是一个修复。 虽然我有可能做错了。

任何人都可以帮助我,任何见解等吗?

编辑**
从命令行

$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)


来自Eclipse

System.out.println(System.getProperty("java.runtime.version"));

返回1.8.0_51-b16



但两者都在同一台PC上,所以我期望相同的值?

2 个答案:

答案 0 :(得分:4)

在JDBC 4.1(Java 7)中添加了方法ResultSet.getObject(String columnLabel, Class<T> type)。看起来您使用的是JDBC 4.0驱动程序,而不是JDBC 4.1(或JDBC 4.2 / Java 8)驱动程序。

您可能需要更新JDBC驱动程序(Connector/J MySQL driver的最新版本为5.1.38)。

答案 1 :(得分:1)

好的抱歉我已经反思了我的方法。 我没有使用反射来设置类成员的类型,而是在每个数据模型类中实现了一个方法,该方法将ResultSet值映射到当前对象。

@Override
public Select load(ResultSet rs) throws SQLException {
    this.id = rs.getInt("id");
    this.name = rs.getString("name");
    this.uuid = rs.getString("uuid");
    this.chunkX = rs.getInt("chunkX");
    this.chunkZ = rs.getInt("chunkZ");
    this.blockX = rs.getInt("blockX");
    this.blockY = rs.getInt("blockY");
    this.blockZ = rs.getInt("blockZ");
    return this;
};

关于我使用反射的初始问题,我不知道为什么会失败。