У меня возникла странная проблема с JDBC и java, у меня есть этот код:
Connection connection;
Statement st;
String sentence;
public ConnectorMYSQL() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ehu", "root", "root");
connection.setAutoCommit(false);
st = connection.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void crearProyecto(String pNombreProyecto, String Creador, String Buscado) {
java.sql.Timestamp date = new java.sql.Timestamp(new java.util.Date().getTime());
String cadena = "INSERT INTO proyecto (nombreproyecto, fechacreacion, creador, buscado,eliminado) VALUES ('"
+ pNombreProyecto + "','" + date + "','" + Creador + "','" + Buscado + "','0');";
System.out.println(cadena);
try {
//st.executeUpdate(cadena);
st.execute(cadena);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Error con: " + cadena);
System.out.println(e.getMessage());
}
}
Когда я запускаю crearProyecto(), я не получил сообщение об ошибке, но он не добавил строку в таблицу, но если я вхожу в тот же запрос с phpmyadmin, он работает. Более того, id - Auto_increment, и он подсчитывает время, которое я сделал через java.
Когда вы что-то меняете в БД, это не будет постоянным. Он может отображаться только на вашем сеансе. Если вы хотите, чтобы он был постоянным, вы должны зафиксировать его. Когда сеанс завершен, все изменения становятся постоянными, что означает, что все сеансы могут обращаться к этим данным.
В вашем случае вы закрываете auto_commit, поэтому вставленные строки отображаются только в этом сеансе. Таким образом, вы можете видеть вставленные строки, если вы выберете из java-кода. Но вы не можете видеть эти вставленные строки из phpmyadmin, потому что он подключается к БД с другим сеансом.
Решение: Измените setAutoCommit на true.
connection.setAutoCommit(true);
Редактировать:
Значение по умолчанию auto_commit равно true, как указано в комментарии Mark Rotteveel. Поэтому лучше не использовать setAutoCommit (true). Вы можете удалить эту строку.
Проблемой может быть '0'
в "". Удаление котировок помогло мне несколько раз решить мои вставки. Лучше использовать PreparedStatement
, потому что в этом случае драйвер JDBC позаботится о правильном форматировании данных.
public void crearProyecto(String pNombreProyecto, String Creador, String Buscado) {
java.sql.Timestamp date = new java.sql.Timestamp(new java.util.Date().getTime());
PreparedStatement preparedStatement = null;
try {
preparedStatement = connection.prepareStatement("INSERT INTO 'proyecto' "
+ "('nombreproyecto', 'fechacreacion', 'creador', 'buscado', 'eliminado')"
+ "VALUES (?, ?, ?, ?, ?)");
preparedStatement.setString(1, pNombreProyecto);
preparedStatement.setDate(2, date);
preparedStatement.setString(3, Creador);
preparedStatement.setString(4, Buscado);
preparedStatement.setInt(5, 0);
preparedStatement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Error con: " + cadena);
System.out.println(e.getMessage());
}
}