JDBC模板查询时出错

时间:2015-01-28 06:52:13

标签: java spring jdbctemplate

我正在尝试编写此查询以验证我的API的用户名和密码,但是我找不到错误列。用户名和密码都是字符串,我使用的是MYSQL数据库。我认为引用有错误,因为用户名和密码是字符串。我怎样才能纠正下面的代码,或者有更好的方法来编写相同的代码。 P.S - 我正在使用spring MVC,这是我的第一个项目。

@Override
    public TypeInfo getRole(final TypeInfo typeinfo) {

            String sql =
            "select Role from registartion where UserName=\"" + typeinfo.getUserName() + "and Password=\"" + typeinfo.getPassword() + "/"";
            return jdbcTemplate.query(sql, new ResultSetExtractor<TypeInfo>() {

                @Override
                public TypeInfo extractData(ResultSet rs)
                        throws SQLException, DataAccessException {
                    if (rs.next()) {
                        System.out.println("VALID USER");
                        TypeInfo typeinfo1 = new TypeInfo();
                        typeinfo1.setUserName(typeinfo.getUserName());
                        typeinfo1.setPassword(typeinfo.getPassword());
                        typeinfo1.setRole(rs.getString("Role"));
                        return typeinfo1;
                    }
                    System.out.println("Not A valid user");
                    return null;
                }

            });
        }

我收到错误消息&#34;从注册中选择角色,其中UserName = ******&#34;列名*******未找到。

5 个答案:

答案 0 :(得分:1)

这不是您编写查询的方式。

JdbcTemplate使用Object[]数组作为参数,以避免SQL注入。

将其编码在以下行中的某处:

    String user = "yourUser";
    String password = "yourPassword";
    final String sql = "SELECT * from FOO where username = ? and password = ?";
    Object[] sqlParameters = new Object[]{user, password};

   List<YourEntityClass> list = getJdbcTemplate.query(sql, new BeanPropertyRowMapper<Your Entity Class>(YourEntityClass.class), sqlParameters);

BeanPropertyRowMapper实际上为您映射了值。只需确保您的实体类具有与数据库中的实体类相同的属性名称

更多信息: jdbcTemplate examples

答案 1 :(得分:0)

您必须在列值周围使用单引号:

"select Role from registartion where UserName='" + typeinfo.getUserName() + "' and Password='" + typeinfo.getPassword() + "'";

您最好使用Prepared Statement。它更容易阅读和更安全(防止SQL注入)。

答案 2 :(得分:0)

正确的解决方案是使用PreparedStatement,以避免混淆引用并增强安全性。

如果你真的必须通过字符串连接构造语句,你应该注意SQL中的字符串文字用单引号(')表示,而不是双引号("):

String sql = 
"select Role from registartion where UserName='" + typeinfo.getUserName() + "' and Password='" + typeinfo.getPassword() + '";

答案 3 :(得分:0)

试试这个。

String sql = "select Role from registartion where UserName='" + typeinfo.getUserName() + "' and Password='" + typeinfo.getPassword() + "'";

答案 4 :(得分:0)

  1. 将双引号(包括转义字符)更改为单引号。

  2. 关闭包含用户名的单引号(typeinfo.getUserName())。您需要在结束单引号和后续字符串之间保留一个空格。

  3. 如果仍然无效,请检查表名和列名。也许是注册&#39;而不是&#39; registartion&#39;?或者可能是&#39; user_name&#39;而不是&#39;用户名&#39;? 初学者提示:将sql字符串复制粘贴到任何数据库浏览器中,用实际值替换变量并执行。检查是否有任何错误。以这种方式更容易修复错误。

    最后,使用参数化的sql查询来避免sql注入。在我看来,参数化查询也减少了语法错误。