Il est recommandé de choisir des données en utilisant Spring JdbcTemplate

Je veux savoir comment choisir de choisir les entrées de la table. J'ai mentionné deux méthodes ci-dessous, à partir duquel je veux savoir lequel est le meilleur à utiliser pour sélectionner des données à partir de la table en utilisant Spring
https://docs.spring.io/spring/ ... .html
.

Premier exemple


try {
String sql = "SELECT id FROM tableName WHERE column_name = '" + coulmn value + "'";

long id = jdbcTemplate.queryForObject/sql, Long.class/;
} catch /Exception e/ {
if /log.isDebugEnabled/// {
log.debug/e/;
}
}


Cela conduit à l'exception suivante:

Attendu 1 réel 0 Comme

Lorsque le tableau ne contient aucune donnée. Mon ami a dit que ce n'est pas la meilleure pratique de sélectionner des données. Il a suggéré que le code ci-dessous soit la seule meilleure pratique pour la sélection des données.

Le deuxième exemple


try {
String countQuery = "SELECT COUNT/id/ FROM tableName";

int count = jdbcTemplate.queryForInt/countQuery/;
if /count > 0/ {
String sql = "SELECT id FROM tableName WHERE column_name = '" + coulmn value + "'";

long id = jdbcTemplate.queryForObject/sql, Long.class/;
}
} catch /Exception e/ {
if /log.isDebugEnabled/// {
log.debug/e/;
}
}


Je désire de façon extrêmement envie de découvrir la bonne ou une autre meilleure pratique.
Invité:

Damien

Confirmation de:

Bien sûr, la première façon est la meilleure pratique, car dans le second cas, vous entrez dans la base de données deux fois, où vous ne devez en fait entrer qu'une seule fois. Cela peut conduire à des problèmes de performance.

Ce que vous devez faire est de prendre une exception
EmptyResultDataAccessException

Puis retourner null retour. Spring JDBC templates jette une exception EmptyResultDataAccessException, Si cela ne trouve pas les données de la base de données.

Votre code devrait ressembler à quelque chose comme ça.


try {
sql = "SELECT id FROM tableNmae WHERE column_name ='"+ coulmn value+ "'";
id= jdbcTemplate.queryForObject/sql, Long.class/;
}
catch /EmptyResultDataAccessException e/ {
if/log.isDebugEnabled///{
log.debug/e/;
}
return null
}

Eugene

Confirmation de:

J'ai rencontré un scénario similaire et j'ai trouvé une solution plus propre lorsqu'il est utilisé ResultSetExtractor au lieu RowMapper


jdbcTemplate.query/DBConstants.GET_VENDOR_DOCUMENT, new Object[]{vendorid}, rs -> {

if/rs.next///{
DocumentPojo vendorDoc = new DocumentPojo//;
vendorDoc.setRegDocument/rs.getString/"registrationdoc"//;
vendorDoc.setMsmeLetter/rs.getString/"msmeletter"//;
vendorDoc.setProprietorshipDocument/rs.getString/"propertiershipformat"//;
vendorDoc.setNeftDocument/rs.getString/"neftdoc"//;
vendorDoc.setPanCardDocument/rs.getString/"pancard"//;
vendorDoc.setCancelledChequeDoc/rs.getString/"cheque"//;
return vendorDoc;
}
else {
return null;
}

}/;


Si le résultat n'est pas trouvé dans la base de données, j'ai défini la condition if pour resultset Et renvoyé le lien null. Ainsi, je n'ai pas besoin d'essayer d'attraper le code et de transférer deux demandes à la base de données.

L'avantage principal ResultSetExtractor /Dans ce scénario/ chose est

avec ResultsetExtractor Vous devrez régler indépendamment l'ensemble résultant, disons, dans le cycle while.

Plus de points peuvent être trouvés ici
https://coderoad.ru/10074025/

Emilie

Confirmation de:

Ceci est le code source de la méthode queryForObject


@Nullable
public <t> T queryForObject/String sql, RowMapper<t> rowMapper/ throws
DataAccessException {
List<t> results = this.query/sql, rowMapper/;
return DataAccessUtils.nullableSingleResult/results/;
}


DataAccessUtils.nullableSingleResult


@Nullable
public static <t> T nullableSingleResult/@Nullable Collection<t> results/ throws IncorrectResultSizeDataAccessException {
if /CollectionUtils.isEmpty/results// {
throw new EmptyResultDataAccessException/1/;
} else if /results.size// &gt; 1/ {
throw new IncorrectResultSizeDataAccessException/1, results.size///;
} else {
return results.iterator//.next//;
}
}


Je ne sais pas pourquoi ils font une exception à une collection vide, c'est probablement une pâte de copie de la méthode ci-dessus


public static <t> T requiredSingleResult/@Nullable Collection<t> results/ throws IncorrectResultSizeDataAccessException {
if /CollectionUtils.isEmpty/results// {
throw new EmptyResultDataAccessException/1/;
} else if /results.size// &gt; 1/ {
throw new IncorrectResultSizeDataAccessException/1, results.size///;
} else {
return results.iterator//.next//;
}
}


Une autre étape au-dessus de la méthode qu'ils ont dû utiliser


@Nullable
public static <t> T singleResult/@Nullable Collection<t> results/ throws IncorrectResultSizeDataAccessException {
if /CollectionUtils.isEmpty/results// {
return null;
} else if /results.size// &gt; 1/ {
throw new IncorrectResultSizeDataAccessException/1, results.size///;
} else {
return results.iterator//.next//;
}
}


Maintenant, la solution m'a aidé:
Développer la classe JdbcTemlate /Vous pouvez le construire avec DataSource injected/
et annuler la méthode queryForObject:


@Nullable
public <t> T queryForObject/String sql, RowMapper<t> rowMapper/ throws DataAccessException {
List<t> results = this.query/sql, rowMapper/;
return DataAccessUtils.singleResult/results/;
}


Maintenant travaille avec votre implémentation
N'oubliez pas de vérifier si cela fonctionne sur la version de mise à jour spring /très improbable IMHO/
</t></t></t></t></t></t></t></t></t></t></t></t>

Emilie

Confirmation de:

Il vaut mieux utiliser ifNull Enquête

, donc s'il y a null, alors vous obtiendrez 0
Par exemple


sql = "SELECT ifNull/id,0/ FROM tableName WHERE column_name ='"+ coulmn value+ "'";


Utilisation de cette méthode, vous pouvez obtenir par défaut 0 Sinon, votre identifiant

Pour répondre aux questions, connectez-vous ou registre