Подключение сервлета к базе данных

#java #servlets

#java #сервлеты

Вопрос:

Я пытаюсь подключиться к базе данных jdbc из сервлета.У меня есть отдельный класс dbconnect для подключения и вставки данных в базу данных.

Вот мой класс dbconnect:

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class dbconnect {
    Connection conn;
    Statement stm;

    dbconnect(){
      try{
        Class.forName("org.apache.derby.jdbc.ClientDriver");  
        conn = DriverManager.getConnection
         ("jdbc:derby://localhost:1527/type","nika",
         "mypass");  
        stm = conn.createStatement();
        System.out.println("success");
        String sql = "INSERT INTO USERS "   "VALUES ("tsogiaidze@yahoo.com", "nika", "nika", "kaci")";
        stm.executeUpdate(sql);
      }  
      catch (Exception ex){
          System.out.println(ex.getMessage());
      }
    }
}
 

В сервлете я создаю новый объект dbconnect, который должен вставлять данные в базу данных, но этого не происходит.

Кто-нибудь может сказать мне, почему это не работает? Наверное, я совершаю фундаментальную ошибку.

Спасибо.

Для получения более подробной информации у меня есть файл jsp, который отправляет данные html-формы в этот сервлет, а затем я пытаюсь записать эти данные в базу данных, используя класс dbconnect.

Я изменил класс dbconnect следующим образом, теперь я использую preparedstatement для записи файлов, но все равно не работает.

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;

public class dbconnect {
    Connection conn;
    Statement stm;

    dbconnect(){
      try{
        Class.forName("org.apache.derby.jdbc.ClientDriver");  
        conn = DriverManager.getConnection("jdbc:derby://localhost:1527/type","nika","nika");  
        stm = conn.createStatement();
        System.out.println("success");
        String sql = "INSERT INTO NIKA.USERS (mail, pass, gender, saxeli) VALUES (?, ?, ?, ?)";
        PreparedStatement statement = conn.prepareStatement(sql);
        statement.setString(1, "tsogiaidze");
        statement.setString(2, "nika");
        statement.setString(2, "nika");
        statement.setString(2, "kaci");
        int rowsInserted = statement.executeUpdate();
        if (rowsInserted > 0) {
        System.out.println("A new user was inserted successfully!");
        }
      }  
      catch (Exception ex){
          System.out.println(ex.getMessage());
      }
    }
 

}

Комментарии:

1. Как уже отмечалось, проверьте все исключения, в противном случае сначала убедитесь, что вы можете вручную выполнить вставку statment, и если это работает, затем присоедините сеанс отладки и выполните пошаговое выполнение.

2. Если вы беспокоитесь о безопасности, о том, что я не закрываю соединения и так далее, меня это пока не волнует. Можете ли вы точно сказать мне, что является плохой практикой в моем коде? Сервлет работает сам по себе, но не добавляет никаких значений в базу данных.

3. Какую ошибку вы получаете?

4. Я не получаю никаких ошибок или исключений.

5. Странно, что вы не получаете исключения. Возможно, подтвердите это, написав больше в стандартный вывод (например,GetMessage может быть пустым, полагаться только на сообщение не очень хорошая идея), также посмотрите, какое возвращаемое значение executeUpdate .

Ответ №1:

Используйте одинарные кавычки, чтобы заключать ваши тексты.

 String sql = "INSERT INTO USERS VALUES ("
      "'tsogiaidze@yahoo.com', 'nika', 'nika', 'kaci')";
 

Или лучше, используйте PreparedStatement:

     String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)");
    PreparedStatement stm = conn.prepareStatement(sql);
    System.out.println("success");
    stm.setString(1, "tsogiaidze@yahoo.com");
    stm.setString(2, "nika");
    stm.setString(3, "nika");
    stm.setString(4, "kaci");
    stm.executeUpdate();
 

Ответ №2:

Возможно, ваш оператор insert неверен, попробуйте это

        try{
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("making connection");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "welcome");
            PreparedStatement stmt=conn.prepareStatement("INSERT INTO student(student_name,student_id,class) VALUES(?,?,?)");
            stmt.setString(1, "abc");
            stmt.setString(2, "4");
            stmt.setString(3, "ukg");
            stmt.executeUpdate();
            System.out.println("query executed");
        }
        catch (ClassNotFoundException e) {
        e.printStackTrace();
      } catch (SQLException e) {
        e.printStackTrace();
        }
 

Пожалуйста, измените класс драйвера и строку подключения

Комментарии:

1. Почему mysql? Я пытаюсь подключиться к jdbc.

2. M.Sharma выдает исключение из этой строки Class.forName(«org.apache. derby.jdbc.ClientDriver»);

3. Привет сказал вам изменить класс драйвера и строку подключения и, пожалуйста, укажите необходимые jar в classpath. банку вы можете получить здесь

Ответ №3:

в моем случае я использовал PostgreSQL с надстройкой maven pom.xml следующий код

 <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.3.2</version>
</dependency>
 

в классе сервлета

 Class.forName("org.postgresql.Driver").newInstance();
        Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/"   DB_NAME, USER, PASS);