Bom dia pessoal!
Depois de muito tentar e pesquisar, infelizmente não consegui a solução.
Estou tentando inserir os dados de uma tabela que contém uma foreign_key através do formulário, mas infelizmente, sem sucesso!
Preciso da ajuda de vocês para aprender mais essa lição.
Essa é minha classe PaisDAO
package br.com.homologacao.jdbc.modelo.local.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import br.com.homologacao.jdbc.ConnectionFactory;
import br.com.homologacao.jdbc.modelo.local.Pais;
public class PaisDAO {
private Connection connection;
public PaisDAO(){
this.connection = new ConnectionFactory().getConnection();
}
public PaisDAO(Connection connection){
this.connection = connection;
}
public void adiciona(Pais pais){
try {
PreparedStatement stmtAdiciona = connection.prepareStatement(sqlAdiciona);
stmtAdiciona.setString(1, pais.getNome().toUpperCase());
stmtAdiciona.setString(2, pais.getSigla().toUpperCase());
stmtAdiciona.execute();
stmtAdiciona.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
// Método para alterar País.
public void alteraPais(Pais pais){
String sqlAltera = "update pais set nome=?, sigla=? where codigo=?";
try {
PreparedStatement stmtAltera = connection.prepareStatement(sqlAltera);
stmtAltera.setString(1, pais.getNome().toUpperCase());
stmtAltera.setString(2, pais.getSigla().toUpperCase());
stmtAltera.setLong(3, pais.getId());
stmtAltera.execute();
//stmtAltera.close();
//connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
// Método para remover País.
public void removePais(Pais pais){
String sqlRemove = "delete from pais where codigo=?";
try {
PreparedStatement stmtRemove = connection.prepareStatement(sqlRemove);
stmtRemove.setLong(1, pais.getId());
stmtRemove.execute();
stmtRemove.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
// Método para Listar todos os Países do Banco de Dados.
public List<Pais> getLista(){
try {
ArrayList<Pais> pais = new ArrayList<Pais>();
String sqlLista = "select * from pais";
PreparedStatement stmtLista = this.connection.prepareStatement(sqlLista);
ResultSet rs = stmtLista.executeQuery();
while(rs.next()){
Pais paises = new Pais();
paises.setId(rs.getLong("codigo"));
paises.setNome(rs.getString("nome"));
paises.setSigla(rs.getString("sigla"));
pais.add(paises);
}
rs.close();
stmtLista.close();
connection.close();
return pais;
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
public List<Pais> getId(Long id){
try {
ArrayList<Pais> pais = new ArrayList<Pais>();
String sqlId = "select * from pais";
PreparedStatement stmtId = this.connection.prepareStatement(sqlId);
ResultSet rs = stmtId.executeQuery();
while(rs.next()){
if(id == rs.getLong("codigo")){
Pais paises = new Pais();
paises.setId(rs.getLong("codigo"));
paises.setNome(rs.getString("nome"));
paises.setSigla(rs.getString("sigla"));
pais.add(paises);
}
}
return pais;
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}
E Agora a classe EstadoDAO
package br.com.homologacao.jdbc.modelo.local.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import br.com.homologacao.jdbc.ConnectionFactory;
import br.com.homologacao.jdbc.modelo.local.Estado;
import br.com.homologacao.jdbc.modelo.local.Pais;
public class EstadoDAO {
private Connection connection;
public EstadoDAO(){
this.connection = new ConnectionFactory().getConnection();
}
public EstadoDAO(Connection connection){
this.connection = connection;
}
public void adiciona(Estado estado){
String sqlAdiciona = "insert into estado (nome, sigla, pais) values (?, ?, ?)";
try {
PreparedStatement stmtAdiciona = connection.prepareStatement(sqlAdiciona);
stmtAdiciona.setString(1, estado.getNome().toUpperCase());
stmtAdiciona.setString(2, estado.getSigla().toUpperCase());
stmtAdiciona.setLong(3, estado.getPais().getId());
stmtAdiciona.execute();
stmtAdiciona.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
public void altera(Estado estado){
String sqlAltera = "update estado set nome=?, sigla=?, pais=? where codigo=?";
try {
PreparedStatement stmtAltera = connection.prepareStatement(sqlAltera);
stmtAltera.setString(1, estado.getNome().toUpperCase());
stmtAltera.setString(2, estado.getSigla().toUpperCase());
stmtAltera.setLong(3, estado.getPais().getId());
stmtAltera.setLong(4, estado.getId());
stmtAltera.execute();
stmtAltera.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
public void remove(Estado estado){
String sqlRemove = "delete from estado where codigo=?";
try {
PreparedStatement stmtRemove = connection.prepareStatement(sqlRemove);
stmtRemove.setLong(1, estado.getId());
stmtRemove.execute();
stmtRemove.close();
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
public List<Estado> getLista(){
try {
ArrayList<Estado> estados = new ArrayList<Estado>();
String sqlLista = "select e.codigo, e.nome, e.sigla, p.nome from estado e " +
"join pais p on e.pais = p.codigo";
PreparedStatement stmlLista = connection.prepareStatement(sqlLista);
ResultSet rs = stmlLista.executeQuery();
while(rs.next()){
Estado estado = new Estado();
estado.setId(rs.getLong("e.codigo"));
estado.setNome(rs.getString("e.nome"));
estado.setSigla(rs.getString("e.sigla"));
estado.setPais(new Pais(rs.getString("p.nome")));
estados.add(estado);
}
rs.close();
stmlLista.close();
connection.close();
return estados;
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
public List<Estado> getId(Long id){
ArrayList<Estado> estado = new ArrayList<Estado>();
String sqlId = "select * from estado e join pais p on e.pais = p.codigo";
try {
PreparedStatement stmtId = connection.prepareStatement(sqlId);
ResultSet rs = stmtId.executeQuery();
while(rs.next()){
if(id == rs.getLong("e.codigo")){
Estado estados = new Estado();
estados.setId(rs.getLong("e.codigo"));
estados.setNome(rs.getString("e.nome"));
estados.setSigla(rs.getString("e.sigla"));
estados.setPais(new Pais(rs.getString("p.nome")));
}
}
return estado;
} catch (SQLException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
}
A questão agora é: Por que não estou conseguindo enviar os dados do meu formulário *.jsp para o banco de dados.
Seguem o formulário e também a servlet.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<jsp:useBean id="dao" class="br.com.homologacao.jdbc.modelo.local.dao.PaisDAO"></jsp:useBean>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Adiciona Estado - Homologação</title>
</head>
<body>
<table align="center" border="1">
<tr>
<td>Sistema de Homologação
</tr>
</table>
<h3>Inserindo um novo Estado - Sistema de Homologação</h3>
<form:errors path="estado.nome" cssStyle="color:red" />
<form:errors path="estado.sigla" cssStyle="color:red"/>
<form action="adicionaEstado" method="post">
Nome: <input type="text" name="nome" />
<br />
Sigla: <input type="text" name="sigla" />
<br />
País: <select name="pais" id="pais">
<option value="0" id="pais">Selecione o País </option>
<c:forEach items="${dao.lista}" var="pais">
<option value="${pais.id}" id="${pais.id}" >${pais.nome} </option>
</c:forEach>
</select>
<br />
<input type="submit" value="Adicionar"/>
</form>
<a href="listaEstado"> <input type="button" value="Lista Estado"/></a>
</body>
</html>
package br.com.homologacao.jdbc.modelo.spring.controller.local;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import br.com.homologacao.jdbc.modelo.local.Estado;
import br.com.homologacao.jdbc.modelo.local.Pais;
import br.com.homologacao.jdbc.modelo.local.dao.EstadoDAO;
@Controller
public class EstadoController {
@RequestMapping("novoEstado")
public String form(){
return"local/estado/adicionaEstado";
}
@RequestMapping("adicionaEstado")
public String adiciona(Estado estado, BindingResult result{
EstadoDAO estadoDAO = new EstadoDAO();
Pais pais = new Pais();
Long id = pais.getId();
pais.setId(id);
estado.setPais(pais);
estadoDAO.adiciona(estado);
return"local/estado/estadoAdicionado";
}
@RequestMapping("listaEstado")
public String lista(Model model){
EstadoDAO estadoDAO = new EstadoDAO();
model.addAttribute("estados", estadoDAO.getLista());
return "local/estado/listaEstado";
}
}
Na classe Estado tem uma foreign_key (private Pais pais) referenciando (private long id) da classe País
Pessoal, se não puderem mandar o código, pelo menos mandem a ideia. O importante pra mim é aprender e não somente fazer.
Estou fazendo um projeto de cadastros somente para efeitos de estudo.
Agradeço a todos!