Java JDBC连接MariaDB校验账号密码时SQL查询不执行排查
JDBC查询MariaDB无返回结果排查修复
你当前代码无异常但查询不生效,按以下顺序排查即可:
- 首先修正JDBC连接配置
你当前用的是MySQL协议URL连接MariaDB,如果项目引入的是官方MariaDB驱动,连接串要替换为对应格式,同时显式指定端口和参数,避免连到错误的数据库实例:
如果用MySQL驱动连MariaDB,要确认驱动版本和MariaDB版本匹配,老版MySQL驱动对10.5以上版本MariaDB兼容存在问题。// 替换原getConnection里的URL,确认用户名密码正确 Conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/memorygame?useSSL=false&serverTimezone=UTC","root",""); - 先验证数据库连接有效性
在执行登录查询前先跑一段计数SQL,确认能正常访问目标表:
如果这段代码能正常打印行数,说明连接正常,问题出在查询条件;如果打印不出内容,检查数据库端口、库名、用户权限是否正确。Statement testSt = Conn.createStatement(); ResultSet testRs = testSt.executeQuery("SELECT COUNT(*) FROM user_gegevens"); if (testRs.next()) { System.out.println("user_gegevens表总数据行数:" + testRs.getInt(1)); } testRs.close(); testSt.close(); - 修复SQL拼接问题
直接字符串拼接SQL不仅有SQL注入风险,还容易因为输入带特殊字符、前后空格、字段大小写不匹配导致查询失效:- 先把拼接后的SQL打印出来,复制到MariaDB客户端手动执行,确认SQL本身能查到对应数据,重点检查字段名大小写(Linux环境下MariaDB默认字段、表名大小写敏感)、输入内容是否带多余空格、数据库内密码是否是明文存储。
- 替换为
PreparedStatement做参数化查询,从根源避免拼接问题:
// 替换原Statement和SQL拼接逻辑 String sqlverf = "SELECT * FROM user_gegevens WHERE Username = ? AND Password = ?"; PreparedStatement pst = Conn.prepareStatement(sqlverf); pst.setString(1, username1.trim()); // trim去掉输入前后的多余空格 pst.setString(2, password1.trim()); ResultSet rs = pst.executeQuery(); if (rs.next()) { System.out.println("账号密码匹配成功"); } // 用完记得关闭资源 rs.close(); pst.close(); - 补全异常打印
你当前catch块只打印异常对象,很多JDBC底层报错细节不会输出,改成打印完整堆栈方便定位隐性问题:catch(Exception e) { e.printStackTrace(); }
注意:禁止明文存储用户密码,生产环境需要对密码做加盐哈希处理,校验时比对哈希值即可,不要直接明文查询匹配。
内容的提问来源于stack exchange,提问作者hendrik
相关产品推荐
相关产品推荐

