我正在尝试编写此查询以验证我的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;列名*******未找到。
答案 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)
将双引号(包括转义字符)更改为单引号。
关闭包含用户名的单引号(typeinfo.getUserName())。您需要在结束单引号和后续字符串之间保留一个空格。
如果仍然无效,请检查表名和列名。也许是注册&#39;而不是&#39; registartion&#39;?或者可能是&#39; user_name&#39;而不是&#39;用户名&#39;? 初学者提示:将sql字符串复制粘贴到任何数据库浏览器中,用实际值替换变量并执行。检查是否有任何错误。以这种方式更容易修复错误。
最后,使用参数化的sql查询来避免sql注入。在我看来,参数化查询也减少了语法错误。