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;
    }
}

这是我的 Personneclass :

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

您知道,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;
}

注意: 您可能还想尝试 nomprenom 作为列名,您使用的是 MySQL对大小写有点挑剔(取决于您 MySQL 的配置和您 运行 所在的平台)。