是否可以在Java中将一行MySQL表读取为字符串?

时间:2014-02-07 09:45:27

标签: java mysql jdbc

我想知道是否有可能将整个MySQL表格作为字符串读取,而不是将其拆分为不同的字符串,如不同的字符串,整数,布尔值等。

我问的原因是这是针对共享包的,因此显然每个表都有不同的列和数据类型。如果我可以将该行作为字符串读取然后将其传递给处理该表中数据的单个类,而不是将其拆分为不同的数据类型,那将会容易得多。显然,只有在表中只查找一行

时,这才是可行的
private String row;

public String getRow(){
   return row;
}

public String getRowFromTable(){
   Class.forName("com.mysql.jdbc.Driver").newInstance();
   Connection con = DriverManager.getConnection("jdbc:mysql://localhost/t", "", "");

   Statement st = con.createStatement();
   String sql = ("SELECT * FROM posts LIMIT 1;");
   ResultSet rs = stmt.executeQuery(sql);
   row = rs.getRow(); // Basically, is this part possible?
   con.close();
}

4 个答案:

答案 0 :(得分:5)

我不相信你的建议方式可能。但是,在盒子外面思考:

  • 您可以使用SQL字符串连接将所有列连接成一个字符串。

  • 您可以使用result set's meta data创建一个框架,该框架将根据类型进行类型转换并将数据注入您的类。

当然,更好的建议可能是使用像Hibernate这样的ORM框架。

答案 1 :(得分:0)

您可以使用MySQL CONCAT函数来连接所有列,但这个想法充其量是可疑的。

答案 2 :(得分:0)

如果您知道表posts的结构,将整个记录作为字符串读取然后将其传递给某个解析器实际上没有意义。创建某种Post类的新实例(与posts表相关),编写简单的marshaller方法并用数据提供它会更有效,例如:

try (
    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM posts LIMIT 1");
) {
    return rs.next() ? this.marshall(rs, new Post()) : null;
}
catch (SQLException x) {
    x.printStacktrace();
}

你可以这样编写marshall方法:

private Post marshall(ResultSet rs, Post post) {
    post.setId(rs.getInt("id"));
    post.setSubject(rs.getString("subject"));
    // Fill other fields as needed.
    return post;
}

但实际上你可以把结果作为一个字符串(如果你坚持在SQL查询中使用*),但你需要使用MetaData

try (
    Statement st = con.createStatement();
    ResultSet rs = st.executeQuery("SELECT * FROM posts LIMIT 1");
) {
    if (!rs.next()) {
        return null;
    }
    ResultSetMetaData md = rs.getMetaData();
    StringBuilder sb = new StringBuilder();
    for (int i = 1, l = md.getColumnCount(); i <= l; i++) {
        sb.append(rs.getString(i));
        if (i < l) {
            sb.append(';');
        }
    }
    return sb.toString();
}
catch (SQLException x) {
    x.printStacktrace();
}

注意:在JDBC中的SQL查询结束时避免使用;。当然,如果一个字符串中有更多查询,则需要使用分号来分隔查询,但通常;不应该是JDBC查询字符串中的最后一个字符。

答案 3 :(得分:0)

无法一步完成,您必须自己创建该字符串。我认为有更好的通用表示而不是每行一个字符串,比如对象或字符串的列表/数组,每列一个或作为地图。

未经测试的代码:

ResultSet rs = stmt.executeQuery("SELECT * FROM posts LIMIT 1;");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

/* Choose your representation */
String asString = "";
List<String> asStringList = new ArrayList<String>();
Map<String, String> asMap = new LinkedHashMap<String, String>();

for (int i = 0; i < numberOfColumns; i++) {
    Object c = rs.getObject(i+1);
    asStringColumn = c == null ? null : c.toString();
    asString += ";" + asStringColumn;
    asStringList.add(asStringColumn);
    asMap.put(rsmd.getColumnLabel(i+1), asStringColumn);
}