如何精准筛选并查看数据库中特定值的数据——解决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
相关产品推荐
相关产品推荐

