问题
Query to Oracle DB being sent via following code and supposed to return the query result as JSON
:
Connection conn ;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:dbname";
conn = DriverManager.getConnection(url,"username","pwd");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM table4 where ID = '5'");
while (rs.next()) {
String s = rs.getString("*");
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(s);
}
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
However, the value of String s
is always null.
I've been to the solution here but it doesn't work for selecting *
from the table.
回答1:
To output JSON, you want to accumulate your data into a List<Map<String, Object>>
first.
Use ResultSetMetaData
to get the column count and column name.
List<Map<String, Object>> rows = new ArrayList<>();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
while (rs.next()) {
// Represent a row in DB. Key: Column name, Value: Column value
Map<String, Object> row = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
// Note that the index is 1-based
String colName = rsmd.getColumnName(i);
Object colVal = rs.getObject(i);
row.put(colName, colVal);
}
rows.add(row);
}
// Write the list of rows to output
// Recommend to use jackson-ObjectMapper to streaming json directly to outputstream:
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.writeValue(response.getOutputStream(), rows);
To use Jackson ObjectMapper, add dependency to your project:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
回答2:
The problem here is not the conversion to JSON (which is already addressed in this question you link in your post) but the way you are calling the ResultSet. Looking through its documentation, we can see the getString
method can take either a column index or a column label, but mentions nothing about wildcard searches such as *
. If you don't know anything about the columns in the database, you can use the getMetadata() method to obtain information about the columns (including the column names).
来源:https://stackoverflow.com/questions/50814792/java-query-resultset-to-json