2015-01-28 2 views
1

Я пытаюсь написать этот запрос, чтобы аутентифицировать имя пользователя и пароль моего API, но я получаю столбец ошибок, который не найден. И имя пользователя, и пароли являются строками, и я использую базу данных MYSQL. Я думаю, что есть ошибка с котировками, поскольку имя пользователя и пароль - это строки. Как я могу исправить код ниже или есть лучший способ написать то же самое. P.S - Я использую весенний MVC, и это мой первый проект.Ошибка в шаблоне JDBC Querying

@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; 
       } 

      }); 
     } 

Я получаю сообщение об ошибке, что «выберите роль из registartion где UserName = ******» имя столбца ******* не найдено.

+0

Возможно, имя таблицы не 'registartion', а' registration'? –

+0

В строковых литералах SQL ограничены ** одиночными ** кавычками. Двойные кавычки предназначены для цитирования имен объектов. Поэтому, по сути, вы спрашиваете, где Username = ""; этот столбец не существует. Также: используйте PreparedStatement с параметрами, не объединяйте предоставленные пользователем значения в строку запроса. –

ответ

0

Правильным решением было бы использовать PreparedStatement, чтобы избежать необходимости связываться с цитированием и повышать безопасность.

Если вы действительно должны построить заявление струнной concatination, следует отметить, что строковые литералы в SQL обозначаются одинарные кавычки ('), а не двойные кавычки ("):

String sql = 
"select Role from registartion where UserName='" + typeinfo.getUserName() + "' and Password='" + typeinfo.getPassword() + '"; 
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

0

Попробуйте это.

String sql = "select Role from registartion where UserName='" + typeinfo.getUserName() + "' and Password='" + typeinfo.getPassword() + "'"; 
0
  1. Изменить двойные кавычки (включая спецсимволы) в одинарные кавычки.

  2. Закройте одиночную цитату, в которой указано имя пользователя (typeinfo.getUserName()). Вам нужно сохранить пробел между заключительной одинарной кавычкой и последующей строкой.

Если он по-прежнему не работает, проверьте имена таблиц и имена столбцов. Может быть, это «регистрация», а не «регистрация»? Или, может быть, это «имя пользователя», а не «имя пользователя»? Советы для начинающих: скопируйте строку sql в любой браузер базы данных, замените переменные на фактические значения и выполните. Проверьте наличие ошибок. Так легче исправить ошибки.

И, наконец, используйте параметризованные sql-запросы, чтобы избежать ввода sql. На мой взгляд, параметризованные запросы также уменьшают синтаксические ошибки.