Spring boot MySQL request return null 在不应该的时候
Spring boot MySQL request return null when it shouldn't
我正在为正在创建的应用程序休息 API,
我有一个 MySQL 数据库,我正在使用 Springboot。
我编码了这个
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MySQLInfosGateway implements InfosGateway {
private NamedParameterJdbcTemplate jdbcTemplate;
public MySQLInfosGateway(NamedParameterJdbcTemplate jdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}
@Override
public Personne getInfos(String badge){
var query = "select NOM, PRENOM from PERSONNEL where BADGE = "+badge;
var result = jdbcTemplate.query(query, new ResultSetExtractor<Object>() {
@Override
public Object extractData(ResultSet resultSet) throws SQLException, DataAccessException {
resultSet.next();
return new Personne(resultSet.getString("NOM"),resultSet.getString("PRENOM"));
}
});
return (Personne) result;
}
}
这是我的 Personne
class :
package com.piroux.phoenixrhbackend.domain.entities;
public class Personne {
private String nom;
private String prenom;
public Personne(String nom, String prenom){
this.nom=nom;
this.prenom=prenom;
}
public String getPrenom() {
return prenom;
}
public String getNom() {
return nom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
public void setNom(String nom) {
this.nom = nom;
}
}
我正在尝试对 Postman 提出以下请求:
localhost:8080/fonction-recup-infos/nom-prenom?badge=50387
如果我执行请求select NOM, PRENOM from PERSONNEL where BADGE = 50387
- 在 SQL 脚本中 => 我得到正确的
NOM
和 PRENOM
;
- 用我的 API => 我得到
null
和 null
您知道,BADGE
是一个 唯一的 字符串,因此每个徽章 只有一个 NOM 和 PRENOM .
这是我第一次创建 REST API 所以如果缺少任何信息请告诉我
从
更改此行
var query = "select NOM, PRENOM from PERSONNEL where BADGE = "+badge;
至
var query = "select NOM, PRENOM from PERSONNEL where BADGE = '" + badge + "'";
可能会解决。
您的代码有几处错误。首先 never 使用连接根据用户输入创建查询字符串。有危险。其次我建议使用 RowMapper
而不是 ResultSetExtractor
它更容易使用。
如果您的数据库不公开元数据,您正在使用 getString("<column-name>")
,这将不起作用,您必须使用位置标识符。
总而言之,我建议你这样做。
@Override
public Personne getInfos(String badge){
var query = "select NOM, PRENOM from PERSONNEL where BADGE = :badge";
var result = jdbcTemplate.queryForObject(query, Map.of("badge", badge), (rs, rowNum) ->
new Personne(rs.getString("NOM"), rs.getString("PRENOM"));
return result;
}
注意: 您可能还想尝试 nom
和 prenom
作为列名,您使用的是 MySQL对大小写有点挑剔(取决于您 MySQL 的配置和您 运行 所在的平台)。
我正在为正在创建的应用程序休息 API, 我有一个 MySQL 数据库,我正在使用 Springboot。 我编码了这个
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MySQLInfosGateway implements InfosGateway {
private NamedParameterJdbcTemplate jdbcTemplate;
public MySQLInfosGateway(NamedParameterJdbcTemplate jdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}
@Override
public Personne getInfos(String badge){
var query = "select NOM, PRENOM from PERSONNEL where BADGE = "+badge;
var result = jdbcTemplate.query(query, new ResultSetExtractor<Object>() {
@Override
public Object extractData(ResultSet resultSet) throws SQLException, DataAccessException {
resultSet.next();
return new Personne(resultSet.getString("NOM"),resultSet.getString("PRENOM"));
}
});
return (Personne) result;
}
}
这是我的 Personne
class :
package com.piroux.phoenixrhbackend.domain.entities;
public class Personne {
private String nom;
private String prenom;
public Personne(String nom, String prenom){
this.nom=nom;
this.prenom=prenom;
}
public String getPrenom() {
return prenom;
}
public String getNom() {
return nom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
public void setNom(String nom) {
this.nom = nom;
}
}
我正在尝试对 Postman 提出以下请求:
localhost:8080/fonction-recup-infos/nom-prenom?badge=50387
如果我执行请求select NOM, PRENOM from PERSONNEL where BADGE = 50387
- 在 SQL 脚本中 => 我得到正确的
NOM
和PRENOM
; - 用我的 API => 我得到
null
和null
您知道,BADGE
是一个 唯一的 字符串,因此每个徽章 只有一个 NOM 和 PRENOM .
这是我第一次创建 REST API 所以如果缺少任何信息请告诉我
从
更改此行 var query = "select NOM, PRENOM from PERSONNEL where BADGE = "+badge;
至
var query = "select NOM, PRENOM from PERSONNEL where BADGE = '" + badge + "'";
可能会解决。
您的代码有几处错误。首先 never 使用连接根据用户输入创建查询字符串。有危险。其次我建议使用 RowMapper
而不是 ResultSetExtractor
它更容易使用。
如果您的数据库不公开元数据,您正在使用 getString("<column-name>")
,这将不起作用,您必须使用位置标识符。
总而言之,我建议你这样做。
@Override
public Personne getInfos(String badge){
var query = "select NOM, PRENOM from PERSONNEL where BADGE = :badge";
var result = jdbcTemplate.queryForObject(query, Map.of("badge", badge), (rs, rowNum) ->
new Personne(rs.getString("NOM"), rs.getString("PRENOM"));
return result;
}
注意: 您可能还想尝试 nom
和 prenom
作为列名,您使用的是 MySQL对大小写有点挑剔(取决于您 MySQL 的配置和您 运行 所在的平台)。