#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);