Java JDBC - ResultSet retornando 0 ao tentar efetuar um insert

Olá pessoal, estou com um probleminha aqui e gostaria de uma ajuda por favor, estou tentando fazer um insert num tabela JOGADOR com FK, mas antes pensando a ID do USUARIO, porém não consigo pegar o ID do usuário no select para referenciar no insert.

se na variável abaixo eu deixar 0 ele não achará nenhum usuário, pq não tem ninguém com 0 no ID e ai retorna o erro abaixo e não adiciona nada na DB.

int idresult = 0;

Erro de SQLjava.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0). Erro no SQL2com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (nadalspringmvc.jogador, CONSTRAINT jogador_ibfk_1 FOREIGN KEY (ID_USUARIO) REFERENCES usuario (ID_USUARIO))

Mas se eu mudar a variável para o numero 9 onde existe um usuário com essa ID e por sinal é o mesmo que eu quero inserir quando tento buscar pela SESSION, ele adiciona no banco, mas pq eu setei o 9 e não porque ele buscou no SELECT e me retorna esse erro.

int idresult = 9;

Erro de SQLjava.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

CREATE TABLE USUARIO (
    ID_USUARIO int NOT NULL AUTO_INCREMENT,
    LOGIN VARCHAR (50) NOT NULL,
    SENHA VARCHAR (8) NOT NULL,
    PRIMARY KEY (ID_USUARIO)
);

CREATE TABLE JOGADOR (
    ID_JOGADOR  int NOT NULL AUTO_INCREMENT,
    NOME_JOGADOR VARCHAR (20) NOT NULL,
    ID_USUARIO int,
    PRIMARY KEY (ID_JOGADOR),
    FOREIGN KEY (ID_USUARIO) REFERENCES USUARIO(ID_USUARIO)
);


public void inserirJogador(JogadoresDTO jogador, String sessionLogin, String sessionSenha) {
    conexao();
    int idresult = 0;

    try {
        try (PreparedStatement ps = this.con.prepareStatement("SELECT id_usuario FROM usuario WHERE login = '" + sessionLogin + "' AND senha = '" + sessionSenha + "';")) {
            ps.setString(1, sessionLogin);
            ps.setString(2, sessionSenha);
            try (ResultSet rs = ps.executeQuery()) {
                if (rs.next()) {
                    int tempID = rs.getInt("id_usuario");
                    jogador.setId(tempID);
                    idresult = jogador.getId();
                } else {
                    System.out.println("Cliente não encontrado");
                }
            }
        }
        con.close();
    } catch (SQLException e) {
        System.out.println("Erro de SQL" + e);
    }
    try {
        try (PreparedStatement ps2 = this.con.prepareStatement("INSERT INTO JOGADOR (nome_jogador, id_usuario) VALUES (?,?);")) {
            ps2.setString(1, jogador.getNome());
            ps2.setInt(2, idresult);
            ps2.execute();
        }
        con.close();
    } catch (SQLException e) {
        System.out.println("Erro no SQL2" + e);
    }
}

Resolvido com um insert mais elegante :slight_smile:

public void insert(ModalidadesDTO modalidade, String sessionLogin, String sessionSenha) throws SQLException {
    conexao();
    String sql = "INSERT INTO modalidade (nome_modalidade, id_usuario) VALUES ( ?, (SELECT id_usuario from usuario WHERE login = '" + sessionLogin + "' and senha = '" + sessionSenha + "') );";
    try {
        try (PreparedStatement stmt = con.prepareStatement(sql)) {
            stmt.setString(1, modalidade.getNome());
            stmt.execute();
        }
    } catch (SQLException u) {
        System.out.println("Erro Insert <JogadoresDAO> :" + u.getMessage());
        throw new RuntimeException(u);
    } finally {
        fechar();
    }

}

JDBC tem suporte a transações, use o ReturnGeneretadKeys, olhe um exemplo:

public long executePreparedUpdateAndReturnGeneratedKeys() 
																		throws SQLException {
		
            String query = "insert into tabela values ( ?,? );"
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		long result = 0l;
		try {
			pstmt = conexao.prepareStatement(query,
					PreparedStatement.RETURN_GENERATED_KEYS);
			int i = 0;
			
                   pstmt.setString(1, nome);
                   pstmt.setInt(2, sobrenome);
               pstmt.executeUpdate();

			rset = pstmt.getGeneratedKeys();

			if (rset.next())
				result = rset.getLong(1);

		} finally {
			release(pstmt);
			release(rset);
		}
		return result;
}

você não vai usar extamente este método específico, mas ele te explica como retornar o ultimo ID , este método te retorna um Long, e com ele faz o que precisar, pode usar ele desta forma !

long idRetornado = executePreparedUpdateAndReturnGeneratedKeys() ;

você tem o id do insert acima !