MySQL原生查询,结果存放在集合java.sql.ResultSet中。
当查询的查询的数据不存在时,ResultSet集合为空。
不会走ResultSet.next逻辑。
封装的数据为空。
因此,使用原生查询时,判断是否查到数据,根据封装的对象是否为空即可。
如,将ResultSet遍历的结果存储在Map中,判断Map是否为空即可。
查询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中判断,应该在映射的结果中判断。