You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精准筛选并查看数据库中特定值的数据——解决Java查询PHPMyAdmin数据库时LIKE匹配范围过大的问题

问题分析与解决方案

你遇到的问题核心在于错误使用了LIKE模糊匹配来处理整数类型的精准查询。LIKE '%2%'会匹配所有包含字符"2"的字符串,而你的bulan字段是int类型,数据库会自动把它转换成字符串来匹配,所以12、22、23这些值都会被命中——因为它们的字符串形式里都包含"2"。

要实现精准筛选,我们需要做两个关键改动:


1. 改用精准匹配运算符=

既然你需要的是bulan值完全等于输入的数字,直接用=代替LIKE即可,这是整数类型字段精准查询的标准写法。

2. 正确使用PreparedStatement参数绑定(避免SQL注入+类型匹配)

你当前的代码虽然声明了PreparedStatement,但实际上还是用字符串拼接SQL,这不仅不安全(存在SQL注入风险),也没利用到预编译语句的类型匹配优势。我们应该用参数占位符?来替代直接拼接输入值。


修改后的完整代码

System.out.print("Masukkan bulan yang ingin ditampilkan [mm]: "); 
String inputBulan = input.nextLine(); 

try {
    // 1. 改用精准匹配的SQL,使用参数占位符
    String sql = "SELECT * FROM lembur WHERE bulan = ?"; 
    PreparedStatement st = conn.prepareStatement(sql); 
    
    // 2. 将输入的字符串转换为整数,绑定到参数(因为bulan是int类型)
    int bulan = Integer.parseInt(inputBulan);
    st.setInt(1, bulan); // 第一个参数对应SQL里的第一个?
    
    // 3. 执行预编译的查询,不需要再传入SQL
    ResultSet rs = st.executeQuery(); 
    
    while (rs.next()) { 
        System.out.println (""); 
        System.out.println ("Nomer Input :"+rs.getString("number")); 
        System.out.println ("Nama :"+rs.getString("nama")); 
        System.out.println ("NIP :"+rs.getString("nip")); 
        System.out.println ("Divisi :"+rs.getString("divisi")); 
        System.out.println ("Waktu Lembur :"); 
        System.out.println ("dd/mm/yyyy"); 
        System.out.println ("\tTanggal :"+rs.getString("tanggal")); 
        System.out.println ("\tBulan :"+rs.getInt("bulan")); // 用getInt更匹配字段类型
        System.out.println ("\tTahun :"+rs.getInt("tahun")); 
        System.out.println ("Keterangan Lembur :"+rs.getString("ket_lembur")); 
        // 注意:你这里原来写错了,应该是对应lama_lembur字段,不是divisi
        System.out.println ("Lama Lembur :"+rs.getString("lama_lembur")); 
        System.out.println (""); 
        System.out.println ("======================================"); 
        System.out.println (""); 
    } 
} catch(SQLException e){ 
    System.out.println("Data Ada Kesalahan" + e.toString()); 
} catch(NumberFormatException e) {
    // 处理用户输入非数字的情况
    System.out.println("Mohon masukkan angka bulan yang valid!");
}

额外说明

  • 因为bulan是int类型,我们用Integer.parseInt()把输入的字符串转成整数,再用st.setInt()绑定参数,这样数据库会直接以整数类型做匹配,避免了类型转换带来的意外匹配。
  • 新增了NumberFormatException的捕获,可以处理用户输入非数字的情况,让程序更健壮。
  • 修正了你代码里的一个小错误:System.out.println ("Lama Lembur :"+rs.getString("divisi"));这里应该取lama_lembur字段(假设字段名是这个),而不是重复取divisi。

内容的提问来源于stack exchange,提问作者dedy kurniawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:38:10