1 原生查询
MySQL原生查询,结果存放在集合java.sql.ResultSet中。
当查询的查询的数据不存在时,ResultSet集合为空。
不会走ResultSet.next逻辑。
封装的数据为空。
因此,使用原生查询时,判断是否查到数据,根据封装的对象是否为空即可。
如,将ResultSet遍历的结果存储在Map中,判断Map是否为空即可。
2 测试
2.1 数据库数据
2.2 样例
查询user_id为0x007的数据,不存在。
不走rs.next()逻辑。
package com.monkey.java_study.functiontest;
import com.monkey.java_study.database.DatabaseConnectionFactory;
import com.monkey.java_study.database.IDatabaseConnection;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import static com.monkey.java_study.common.constant.DatabaseConstant.MY_SQL;
/**
* 数据查询测试.
*
* @author xindaqi
* @date 2021-10-22 11:08
*/
public class DataQueryFromMySQLTest {
private static final Logger logger = LogManager.getLogger(DataQueryFromMySQLTest.class);
@Test
public void queryTest() {
DatabaseConnectionFactory databaseConnectionFactory = new DatabaseConnectionFactory();
IDatabaseConnection databaseConnection = databaseConnectionFactory.databaseConnection(MY_SQL);
Connection conn = databaseConnection.databaseLink();
Statement stmt = null;
try {
Map<String, String> userIdAndStatusMap = new HashMap<>(3);
Connection connUse = conn;
stmt = connUse.createStatement();
String userId = "0x007";
String sql = "SELECT status FROM db_monkey_run.tb_sys_user WHERE user_id=" + "'" + userId + "'" + "LIMIT 1";
ResultSet rs = stmt.executeQuery(sql);
int resultSize = rs.getFetchSize();
logger.info(">>>>>>>>>>结果数量:{}", resultSize);
logger.info(">>>>>>>>>>Result set:{}", rs);
while (rs.next()) {
Integer status = rs.getInt("status");
logger.info(">>>>>>>>>>Status:{}", status);
String statusStr = String.valueOf(status);
logger.info(">>>>>>>>>>String status: {}", statusStr);
userIdAndStatusMap.put(userId, statusStr);
}
if(userIdAndStatusMap.isEmpty()) {
logger.info(">>>>>>>>>>未查到数据,Map:{}", userIdAndStatusMap);
} else {
logger.info(">>>>>>>>>>查到数据,Map:{}", userIdAndStatusMap);
}
rs.close();
} catch (SQLException se) {
throw new RuntimeException(se);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException se1) {
throw new RuntimeException(se1);
}
}
}
}
测试结果:
由测试结果可是,当查不到数据时,RestultSet存储的数据为0,跳过re.next()逻辑,因此,判断是否查到数据,不可以在rs.next中判断,应该在映射的结果中判断。
3 小结
- MySQL原生查询,查不到数据,ResultSet对象存在,
只是没有有效数据; - 将ResultSet结果映射到对象时,
不可通过rs.next()中的逻辑判断是否查到数据,
应该通过判断映射的对象是否为空判断是否查到结果; - 如将查询结果映射到Map,判断Map是否为空,即可判断是否查到数据。