Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Troquei o HSQLDB pelo MySQL

Prezados, alterei como sugerido pelo Maurício, o HSQLDB pelo MySql, e pra minha surpresa, quando chamo o controller InfraController, pela url, não funciona, apenas dando erros. Alguém pode me ajudar? Segue código da classe ConnectionFactory.

package br.com.caelum.contas;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {


//    public Connection getConnection() throws SQLException {
//        System.out.println("conectando ...");
//
//        try {
//            Class.forName("org.hsqldb.jdbcDriver");
//        } catch (ClassNotFoundException e) {
//            throw new SQLException(e);
//        }
//        
//        return DriverManager.getConnection("jdbc:hsqldb:file:contas.db","sa", "");
//    }

    public Connection getConnection()throws SQLException{
        try {
            System.out.println("conectando ...");
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return DriverManager.getConnection("jdbc:mysql://localhost/dbcontas", "root", "minhasenha");

    }


}

Segue a minha stacktrace

GRAVE: Servlet.service() for servlet [spring mvc] in context with path [/contas] threw exception [Request processing failed; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if exists' at line 1] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if exists' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

Quando volto para

3 respostas
solução!

No MySQL a sintaxe do drop table é ao contrario do hsqldb:

DROP TABLE IF EXISTS nomedatabela;

Oi Eduardo, tudo bom?

Pelo erro:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if exists' at line 1

Parece que o problema é uma incompatibilidade de sintaxe que, provavelmente, o hsqldb suporta e o mysql não.

No caso, mais especificamente, com a função if exists.

Dei uma olhada aqui no projeto pronto desse capitulo e não encontrei a query com a função.

Compartilha com a gente o método que contém essa query com o if exists, assim a gente pode procurar uma solução junto =)

Abraço

Galera boa noite.

@Sergio Lopes, você estava certo, era a sintaxe do drop table if exists. Abaixo a classe InfraController original.

@Controller
public class InfraController {

    @RequestMapping("/tabelas")
    public String criaBanco() throws SQLException {
        Connection c = new ConnectionFactory().getConnection();
        PreparedStatement st1 = c.prepareStatement("drop table contas if exists");
        st1.execute();

        PreparedStatement st11 = c.prepareStatement("create table contas (id int identity, descricao varchar(255), valor double, paga boolean, dataPagamento datetime, tipo varchar(20))");
        st11.execute();

        PreparedStatement st2 = c.prepareStatement("drop table usuarios if exists");
        st2.execute();

        PreparedStatement st22 = c.prepareStatement("create table usuarios (login VARCHAR(255),senha VARCHAR(255));");
        st22.execute();

        PreparedStatement st3 = c.prepareStatement("insert into usuarios (login, senha) values ('caelum', 'online');");
        st3.execute();

        c.close();

        return "infra-ok";

    }
}

Aqui foi onde fiz a alteração que funcionou com o Mysql. A parte comentada era por conta do primeiro campo id da tabela, que no hsqldb é identity, e no Mysql primary key, no meu caso auto_increment.

//        PreparedStatement st11 = c.prepareStatement("create table contas (id int identity, descricao varchar(255), valor double, paga boolean, dataPagamento datetime, tipo varchar(20))");
//        st11.execute();

        PreparedStatement st11 = c.prepareStatement("create table contas (id int primary key auto_increment, descricao varchar(255), valor double, paga boolean, dataPagamento datetime, tipo varchar(20))");
        st11.execute();

Quero agradecer a ajuda, tempo e paciência de todos.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software