JavaSpringBootPostgreSQL和HikariCP-从语句查询获取原始字符串输出
我试图编写一个Spring引导控制器,允许用户对Postgres数据库进行任意选择查询并查看结果。我通过使用类似于链接中的一个来实现这一点。该项目基于 代码: 表单如下所示:JavaSpringBootPostgreSQL和HikariCP-从语句查询获取原始字符串输出,java,spring,postgresql,spring-boot,hikaricp,Java,Spring,Postgresql,Spring Boot,Hikaricp,我试图编写一个Spring引导控制器,允许用户对Postgres数据库进行任意选择查询并查看结果。我通过使用类似于链接中的一个来实现这一点。该项目基于 代码: 表单如下所示: Row 1: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d Row 2: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResul
Row 1: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
Row 2: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
Row 3: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
Row 4: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
但我得到的结果如下所示:
Row 1: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
Row 2: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
Row 3: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
Row 4: HikariProxyResultSet@188463256 wrapping org.postgresql.jdbc.PgResultSet@ff61f7d
这不是我想要的!我想查看数据库中的实际行,如中所示:
Row 1: "Dave" | 23 | "Philadelphia"
Row 2: "Anne" | 72 | "New York"
Row 3: "Susie" | 44 | "San Francisco"
Row 4: "Alex" | 22 | "Miami"
见鬼,我宁愿得到我通常在数据库中手动键入SQL时得到的原始字符串输出,而不是结果集内存中的地址
如何在不预先知道表中有多少列或列的类型的情况下获得实际的数据库输出?我建议初学者使用
JdbcTemplate
结合ResultSetExtractor
简化代码。您可以使用ResultSet
本身获取结果的列数
我也不清楚您为什么要重新定义数据源
总之,像下面的代码这样的东西应该可以做到这一点(我还没有测试过它并从头顶上键入它,所以可能需要一些润色)
@控制器
@SpringBoot应用程序
公共班机{
@自动连线
私有jdbc模板jdbc;
公共静态void main(字符串[]args)引发异常{
SpringApplication.run(Main.class,args);
}
@GetMapping(“/query”)
公共字符串查询表单(模型){
addAttribute(“query”,newquery());
返回“查询”;
}
@后映射(“/query”)
公共字符串querySubmit(@modeldattribute Query){
最后一个字符串rawQueryContent=query.getContent().trim();
最终字符串查询内容;
如果(!rawQueryContent.toLowerCase()包含(“限制”)){
queryContent=rawQueryContent+“限制500”;
}否则{
queryContent=rawQueryContent;
}
String content=jdbc.query(queryContent,newresultsetextractor(){
公共StringBuilder提取数据(结果集rs){
StringBuilder sb=新的StringBuilder();
int columns=rs.getMetaData().getColumnCount();
while(rs.next()){
int row=rs.getRow();
某人追加(rs.getRow())。追加(“|”);
对于(inti=1;irs.toString()
do?@prasad\uu-rs.toString()正在以字符串形式返回ResultSet在内存中的地址。这不是我想要的。我想要数据库的实际内容。请仔细查看此文档。它是结果集api。它具有从查询输出检索信息的方法:。您需要通过获取相关值来连接每个值columns@user7294900我不知道n我正在查询的表中的列数。我想您指的是queryContent,而不是queryContext。如上所述,在未测试的情况下将其作为答案键入。
@Controller
@SpringBootApplication
public class Main {
@Autowired
private JdbcTemplate jdbc;
public static void main(String[] args) throws Exception {
SpringApplication.run(Main.class, args);
}
@GetMapping("/query")
public String queryForm(Model model) {
model.addAttribute("query", new Query());
return "query";
}
@PostMapping("/query")
public String querySubmit(@ModelAttribute Query query) {
final String rawQueryContent = query.getContent().trim();
final String queryContent;
if(!rawQueryContent.toLowerCase().contains("limit")) {
queryContent = rawQueryContent + " LIMIT 500";
} else {
queryContent = rawQueryContent;
}
String content = jdbc.query(queryContent, new ResultSetExtractor<StringBuilder>() {
public StringBuilder extractData(ResultSet rs) {
StringBuilder sb = new StringBuilder();
int columns = rs.getMetaData().getColumnCount();
while (rs.next()) {
int row = rs.getRow();
sb.append(rs.getRow()).append('|');
for (int i = 1 ; i <= columns ; i++) {
sb.append(rs.getObject(i)).append('|');
}
}
return sb.toString();
}
});
query.setContent(content);
return "queryresult";
}
}