Ann*_*raj 25 java spring jdbctemplate
我想知道从表中选择记录的最佳做法是什么.我在下面提到了两种方法,我想知道哪种方法是使用Spring JdbcTemplate从表中选择数据的最佳方法.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这会引发以下异常:
预计1实际0喜欢
当表不包含任何数据时.我的朋友告诉这不是选择数据的最佳做法.他建议下面提到的代码是选择数据的唯一最佳实践.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我渴望知道正确的一个或任何其他最佳实践.
Dha*_*ath 26
绝对第一种方式是最佳实践,因为在第二种方式中,您将在数据库中击中两次,实际上只应该击中它一次.这可能会导致性能问题.
你需要做的是捕获异常EmptyResultDataAccessException,然后返回null.如果Spring JDBC模板在数据库中找不到数据,则会抛出EmptyResultDataAccessException异常.
您的代码应如下所示.
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
}
Run Code Online (Sandbox Code Playgroud)
我面临类似的情况,并在使用 ResultSetExtractor 而不是 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;
}
});
Run Code Online (Sandbox Code Playgroud)
如果没有从数据库中找到结果,我为结果集设置了一个 if 条件并返回空引用。因此,我不需要尝试捕获代码并将两个查询传递给数据库。
ResultSetExtractor 的主要优点(在这种情况下)是使用 ResultsetExtractor,您需要自己遍历结果集,例如在 while 循环中。
更多积分可以在这里找到
小智 5
这是 queryForObject 方法源代码
@Nullable
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) throws
DataAccessException {
List<T> results = this.query(sql, rowMapper);
return DataAccessUtils.nullableSingleResult(results);
}
Run Code Online (Sandbox Code Playgroud)
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() > 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
} else {
return results.iterator().next();
}
}
Run Code Online (Sandbox Code Playgroud)
不知道为什么他们在空集合上抛出异常,可能这只是上面方法的复制粘贴
public static <T> T requiredSingleResult(@Nullable Collection<T> results) throws IncorrectResultSizeDataAccessException {
if (CollectionUtils.isEmpty(results)) {
throw new EmptyResultDataAccessException(1);
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
} else {
return results.iterator().next();
}
}
Run Code Online (Sandbox Code Playgroud)
比他们应该使用的方法多一步
@Nullable
public static <T> T singleResult(@Nullable Collection<T> results) throws IncorrectResultSizeDataAccessException {
if (CollectionUtils.isEmpty(results)) {
return null;
} else if (results.size() > 1) {
throw new IncorrectResultSizeDataAccessException(1, results.size());
} else {
return results.iterator().next();
}
}
Run Code Online (Sandbox Code Playgroud)
现在解决方案帮助了我:扩展 JdbcTemlate 类(您可以使用注入的数据源构造它)并覆盖 queryForObject 方法:
@Nullable
public <T> T queryForObject(String sql, RowMapper<T> rowMapper) throws DataAccessException {
List<T> results = this.query(sql, rowMapper);
return DataAccessUtils.singleResult(results);
}
Run Code Online (Sandbox Code Playgroud)
现在使用您的实现不要忘记检查它是否适用于春季版本更新(恕我直言,不太可能)