MySQL原生查询:查不到数据是如何判断的?

1 原生查询

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

2 测试

2.1 数据库数据

MySQL原生查询:查不到数据是如何判断的?

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中判断,应该在映射的结果中判断。
MySQL原生查询:查不到数据是如何判断的?

3 小结

  • MySQL原生查询,查不到数据,ResultSet对象存在,
    只是没有有效数据;
  • 将ResultSet结果映射到对象时,
    不可通过rs.next()中的逻辑判断是否查到数据,
    应该通过判断映射的对象是否为空判断是否查到结果;
  • 如将查询结果映射到Map,判断Map是否为空,即可判断是否查到数据。
上一篇:k8s replicaset controller 分析(1)- 初始化与启动分析


下一篇:Supervisor 进程守护工具