Update num campo SQL

5 respostas
M

Boa noite!

estou dando um update num campo da minha tabela mysql e ele não modifica!, ele adiciona uma nova linha, com os campos iguais, e o Saldo novo. porfavor se alguem encontrar o erro, eu agradeceria, pois não faço a menor ideia:

Classe DAO:

public void altera(PessoaFisica pf){
		String sql = "update pessoa_fisica set saldo=? where id=?";

		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, pf.getSaldo());
			stmt.setLong(2, pf.getId());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

Classe View:

public void execDeposito() {
		System.out.println("Valor a ser Depositado: ");
		p1.setSaldo(this.scan.next());
		
		pDAO.adiciona(p1);
		System.out.println("Depósito realizado com sucesso.");
	}

5 Respostas

M

Me Perdoem pelo post

o nome do metodo de alterar é public void altera() e eu estou usando o de Inclusão que é public void adiciona()

e tou aqui a 2 horas refazendo mta coisa pra achar o erro…
acontece…

Obrigado e mais uma vez Desculpe!! Boa noite! =]

von.juliano
O auto-commit da sua conexão deve estar setada como false, quando for criar a conexão, configure-a como auto-commit true:
connection.setAutoCommit(true)
Uma dica: a forma como você estruturou esse método não garante fechamento de statement, conexão, etc. Eu faço mais ou menos dessa forma:
public void altera(PessoaFisica pf){
	String sql = "update pessoa_fisica set saldo=? where id=?";

	PreparedStatement stmt = null;
	try {
		stmt = connection.prepareStatement(sql)

		stmt.setString(1, pf.getSaldo());
		stmt.setLong(2, pf.getId());
		stmt.execute();
		
	} catch (SQLException e) {
		throw new RuntimeException(e);
	} finally {
		try {
			if (stmt != null)
				stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		try {
			if (connection != null && !connection.isClosed()) 
				connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
Com a diferença que encapsulo a conexão em outra classe, entre outras coisas.

Espero que ajude! Flw! :thumbup:

M

Humm
boa dica!

aproveitando que vc jah deu essa dica (dá a mao e jah quero o braço hehe)
da uma olhada na minha classe de conecção:

classe que cria conecções

public class ConnectionFactory {
	private static String DATABASE_URL = "jdbc:mysql://localhost/Doom";
	private static String user = "root";
	private static String password = "saruman";

	public Connection getConnection() {
		//Conectando ao banco
		try {
			return DriverManager.getConnection(DATABASE_URL, user, password);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

e em cada DAO eu deixo no construtor:

public PessoaFisicaDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}

essas práticas estão corretas? Obrigado!!

von.juliano
Vou te passar a forma que costumo fazer quando trabalho com jdbc, segue a classe que trabalha com a conexão (usando os seus dados de conexão):
public class ConnectionManager {

	private static Connection connection;

	private static final String DATABASE_URL = "jdbc:mysql://localhost/Doom";
	private static final String USER = "root";
	private static String PASSWORD = "saruman";

	static {
		try {
			Class.forName("com.abc.ClasseDoDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		return connection;
	}

	public static void startTransaction() throws SQLException {
		openConnection(true);
	}

	public static void startReading() throws SQLException {
		openConnection(false);
	}

	public static void endReading() throws SQLException {
		if (connection != null && !connection.isClosed()) {
			connection.close();
		}
	}

	private static void openConnection(boolean isTransactionEnabled)
			throws SQLException {
		if (connection == null || connection.isClosed()) {
			connection = DriverManager.getConnection(DATABASE_URL, USER, PASSWORD);
			if (isTransactionEnabled) {
				connection.setAutoCommit(false);
			}
		}
	}

	public static void commitTransaction() throws SQLException {
		if (connection != null && !connection.isClosed()) {
			connection.commit();
			connection.close();
		}
	}

	public static void rollBackTransaction() throws SQLException {
		if (connection != null && !connection.isClosed()) {
			connection.rollback();
			connection.close();
		}
	}
}
Algumas partes podem não estar 100% certas, como a parte de carregar o Driver, na classe original eu uso DataSource, então não é necessária só a coloquei aqui. Como não há transações, os métodos startTransaction, commitTransaction e rollBackTransaction simulam o funcionamento transacional, setando o auto-commit da conexão para falso e te dando o controle sobre o commit e rollback. Quando não há necessidade de transações, use os métodos startReading e endReading. Exemplo de uso da classe:
public void insere(Objeto qqcoisa) {
	// Statement, ResultSet, etc
	try {
		ConnectionManager.startTransaction();
		Connection connection = ConnectionManager.getConnection();

		// insere alguma coisa

	} catch (SQLException e) {
		ConnectionManager.rollbackTransaction();
	} finally {
		try {
			ConnectionManager.commitTransaction();
		} catch (SQLException e) {
		}
	}
}
Acho que essa classe poderia ser melhorada, mas eu mesmo não uso jdbc puro faz um bom tempo. Mas ela facilita bastante, e permite você trabalhar com transações de forma um pouco melhorada. :D

Se for possível, utilize as classes do Spring que lidam com jdbc, vão te ajudar bastante!

Blz? Flw! :thumbup:

M

Muito obrigado von.juliano!
eu conheço o Spring, no trabalho usamos ele, e hibernate também, mas me deparei que aprendi a usar eles mas uma coisa mais básica eu nao sabia, usamos JSF lá tambem, mas me deparei que precisava remover apenas um div e nao sabia fazer isso! porisso estou estudando coisas mais básicas agora!

obrigado pela ajuda vou utilizar essas dicas! =]

Criado 4 de junho de 2010
Ultima resposta 4 de jun. de 2010
Respostas 5
Participantes 2