繁体   English   中英

Spring boot MySQL请求在不应该返回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类:

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 脚本中 => 我得到了正确的NOMPRENOM
  • 使用我的 API => 我得到nullnull

要知道, BADGE是一个唯一的字符串,因此每个 BADGE只有一个NOM 和 PRENOM。

这是我第一次创建 REST API,所以如果缺少任何信息,请告诉我

您的代码有一些问题。 首先永远不要使用连接来创建基于用户输入的查询字符串。 有危险。 其次,我建议使用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 配置和您运行的平台)。

将这一行从

 var query = "select NOM, PRENOM from PERSONNEL where BADGE = "+badge;

 var query = "select NOM, PRENOM from PERSONNEL where BADGE = '" + badge + "'";

可能会解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM