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

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是否为空,即可判断是否查到数据。
经验分享 程序员 微信小程序 职场和发展