web-dev-qa-db-fra.com

Comment implémenter RowMapper en utilisant l'expression lambda Java

J'ai eu un code de travail RowMapper qui mappe la ligne de table de base de données dans un objet Java. Je voulais changer l'implémentation en utilisant l'expression lambda. Cependant, je reçois toujours des erreurs; Extrait de code comme suit;

String queryString = "select * from person where person_id = ? ";
RowMapper rowMapper = (rs, rowNum) -> {

Person p = new Person();

p.setName(rs.getString("personName"));
p.setAddress(rs.getString("address"));
p.setAge(rs.getInt("age"));
}

Person person = getJdbcTemplate().query(queryString, personId, rowMapper);

return person;

Quelqu'un peut-il m'aider à implémenter le code correctement? Une idée pour obtenir une liste de personnes?

8
nwGCham

RowMapper est une interface avec une méthode abstraite unique (n'héritant pas d'une méthode de Object), donc il peut être considéré comme une interface fonctionnelle . Sa méthode fonctionnelle prend une ResultSet et une int, et retourne un objet.

Le premier problème avec le code est que le type de l'objet renvoyé est un type générique de l'interface. Actuellement utilisé avec RowMapper, vous utilisez un type brut, que vous ne devriez pas faire . Le deuxième problème est que l'expression lambda ne renvoie aucun objet. Elle ne peut donc pas être conforme à la méthode fonctionnelle, à l'exception de l'objet à renvoyer.

En tant que tel, un code corrigé serait:

RowMapper<Person> rowMapper = (rs, rowNum) -> {
    Person p = new Person();
    p.setName(rs.getString("personName"));
    p.setAddress(rs.getString("address"));
    p.setAge(rs.getInt("age"));
    return p;
};
14
Tunaki

RowMapper utilisant l'exemple d'expression lambda:

return jdbcTemplate.query(" select Scale_Point,Scale_Head from TEval_Scale ", new Object[] {},
                (resultSet, rowNum) ->{

                    TEvalScale tEvalScale = new TEvalScale();
                    tEvalScale.setScalePoint(resultSet.getInt("Scale_Point"));
                    tEvalScale.setScaleHead(resultSet.getString("Scale_Head"));
                    return tEvalScale;

                });
2
wahid_cse

@Tunaki est correct. Voici la version abrégée:

RowMapper<Person> rowMapper = (rs, rowNum) -> new Person(rs.getString("personName"), rs.getString("address"),rs.getInt("age")) ;

Les crochets et le retour ne sont pas nécessaires car ils sont impliqués.

0
NuAlphaMan