Conectar Java a um banco de dados MySQL

322

Como você se conecta a um banco de dados MySQL em Java?

Quando tento, recebo

java.sql.SQLException: No suitable driver found for jdbc:mysql://database/table
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)

Ou

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Ou

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
abson
fonte
Aqui está um pequeno tutorial em vídeo de 3 minutos que demonstra o uso do MySQL a partir de Java. Confira aqui: Breve Tutorial: Conectando-se a base de dados MySQL usando Java
drorw

Respostas:

208

DriverManageré uma maneira bastante antiga de fazer as coisas. A melhor maneira é obter um DataSource, pesquisando um que o contêiner do servidor de aplicativos já esteja configurado para você:

Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");

ou instanciar e configurar um diretamente do driver do banco de dados:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");

e, em seguida, obtenha conexões com ele, o mesmo que acima:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();
Sean Owen
fonte
1
como os outros exemplos usam com.mysql.jdbc.Driver? esse método é melhor?
Jason S
7
Eu acho que essa é a classe Driver antiga, que funciona com o mecanismo de driver antigo. MysqlDataSourceimplementa javax.sql.DataSourcequal é o mecanismo mais novo.
Sean Owen
1
Oi @SeanOwen Gostaria de saber, por que fechamos rse stmt? Por que não apenas conn?
Kamuran Sönecek
3
Talvez você deva adicionar dataSource.setDatabaseName ("database").
Myoch
1
É uma boa prática fechar () as coisas explicitamente, embora seja mais código. Qualquer boa implementação teria que fechar os recursos quando a conexão fechar, sim. Considere outros contextos em que você deseja reutilizar uma declaração ou conexão. No try-with-resources do Java 7, você obtém esse comportamento de qualquer maneira gratuitamente:
Sean Owen
476

Aqui está uma explicação passo a passo de como instalar o MySQL e o JDBC e como usá-lo:

  1. Baixe e instale o servidor MySQL . Apenas faça da maneira usual. Lembre-se do número da porta sempre que você o alterar. É por padrão3306.

  2. Faça o download do driver JDBC e coloque no caminho de classe , extraia o arquivo ZIP e coloque o arquivo JAR que contém no caminho de classe. O driver JDBC específico do fornecedor é uma implementação concreta da API JDBC ( tutorial aqui ).

    Se você estiver usando um IDE como Eclipse ou Netbeans, poderá adicioná-lo ao caminho de classe adicionando o arquivo JAR como Biblioteca ao Caminho de Construção nas propriedades do projeto.

    Se você estiver fazendo isso "plain vanilla" no console de comandos, precisará especificar o caminho para o arquivo JAR no argumento -cpou -classpathao executar seu aplicativo Java.

    java -cp.; / caminho / para / mysql-connector.jar com.example.YourClass

    O .está ali apenas para adicionar o atual diretório ao classpath bem para que ele possa localizar com.example.YourClasse ;é o separador classpath, pois é no Windows. No Unix e clones :devem ser usados.

  3. Crie um banco de dados no MySQL . Vamos criar um banco de dados javabase. Você, é claro, deseja dominar o mundo, então vamos usar o UTF-8 também.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Crie um usuário para Java e conceda acesso a ele . Simplesmente porque usarrooté uma má prática.

    CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
    

    Sim, javaé o nome de usuário e passworda senha aqui.

  5. Determine a URL JDBC . Para conectar o banco de dados MySQL usando Java, você precisa de uma URL JDBC na seguinte sintaxe:

    jdbc: mysql: // nome do host: port / databasename
    • hostname: O nome do host em que o servidor MySQL está instalado. Se estiver instalado na mesma máquina em que você executa o código Java, basta usar localhost. Também pode ser um endereço IP como 127.0.0.1. Se você encontrar problemas de conectividade e usar em 127.0.0.1vez de localhostresolvê-lo, terá um problema na sua configuração de rede / DNS / hosts.

    • port: A porta TCP / IP na qual o servidor MySQL atende. Isso é por padrão 3306.

    • databasename: O nome do banco de dados ao qual você deseja se conectar. É isso javabase.

    Portanto, o URL final deve se parecer com:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Teste a conexão com o MySQL usando Java . Crie uma classe Java simples com ummain()método para testar a conexão.

    String url = "jdbc:mysql://localhost:3306/javabase";
    String username = "java";
    String password = "password";
    
    System.out.println("Connecting database...");
    
    try (Connection connection = DriverManager.getConnection(url, username, password)) {
        System.out.println("Database connected!");
    } catch (SQLException e) {
        throw new IllegalStateException("Cannot connect the database!", e);
    }
    

    Se você receber um SQLException: No suitable driver, significa que o driver JDBC não foi carregado automaticamente ou que o URL JDBC está errado (ou seja, não foi reconhecido por nenhum dos drivers carregados). Normalmente, um driver JDBC 4.0 deve ser carregado automaticamente quando você o solta no caminho de classe do tempo de execução. Para excluir um e outro, você sempre pode carregá-lo manualmente, como abaixo:

    System.out.println("Loading driver...");
    
    try {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Driver loaded!");
    } catch (ClassNotFoundException e) {
        throw new IllegalStateException("Cannot find the driver in the classpath!", e);
    }
    

    Observe que a newInstance()chamada não é necessária aqui. É apenas para consertar o velho e o buggy org.gjt.mm.mysql.Driver. Explicação aqui . Se essa linha for lançada ClassNotFoundException, o arquivo JAR que contém a classe do driver JDBC simplesmente não será colocado no caminho de classe.

    Observe que você não precisa carregar o driver todas as vezes antes de conectar. Apenas uma vez durante a inicialização do aplicativo é suficiente.

    Se você obtém um SQLException: Connection refusedou Connection timed outum específico do MySQL CommunicationsException: Communications link failure, significa que o banco de dados não é acessível. Isso pode ter uma ou mais das seguintes causas:

    1. O endereço IP ou o nome do host no URL JDBC está incorreto.
    2. O nome do host na URL JDBC não é reconhecido pelo servidor DNS local.
    3. O número da porta está ausente ou incorreto no URL JDBC.
    4. O servidor de banco de dados está inoperante.
    5. O servidor de banco de dados não aceita conexões TCP / IP.
    6. O servidor do banco de dados ficou sem conexões.
    7. Algo entre Java e DB está bloqueando as conexões, por exemplo, um firewall ou proxy.

    Para resolver um ou outro, siga os seguintes conselhos:

    1. Verifique e teste-os com ping.
    2. Atualize o DNS ou use o endereço IP no URL JDBC.
    3. Verifique-o com base no my.cnfbanco de dados MySQL.
    4. Inicie o banco de dados.
    5. Verifique se o mysqld foi iniciado sem o --skip-networking option.
    6. Reinicie o banco de dados e corrija seu código de forma que ele feche as conexões finally.
    7. Desative o firewall e / ou configure o firewall / proxy para permitir / encaminhar a porta.

    Observe que fechar o Connectioné extremamente importante. Se você não fechar as conexões e continuar recebendo muitas delas em pouco tempo, o banco de dados poderá ficar sem conexões e o aplicativo poderá falhar. Sempre adquira o Connectionem uma try-with-resourcesdeclaração . Ou se você ainda não estiver no Java 7, feche-o explicitamente em finallyum try-finallybloco. Fechar finallyé apenas para garantir que ele seja fechado também em caso de exceção. Isso também se aplica a Statement, PreparedStatemente ResultSet.

Era isso que diz respeito à conectividade. Você pode encontrar aqui um tutorial mais avançado sobre como carregar e armazenar objetos de modelo Java completos em um banco de dados com a ajuda de uma classe DAO básica.


Usar um padrão Singleton para a conexão com o banco de dados é uma abordagem ruim. Veja entre outras perguntas: http://stackoverflow.com/q/9428573/ . Este é um erro nº 1 para iniciantes.

BalusC
fonte
39

Inicializar constantes do banco de dados

Crie um nome de usuário, senha, URL e drivers constantes no banco de dados de propriedades constantes, limite de pesquisa etc.

// init database constants
// com.mysql.jdbc.Driver
private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
private static final String USERNAME = "root";
private static final String PASSWORD = "";
private static final String MAX_POOL = "250"; // set your own limit

Inicializar conexão e propriedades

Depois que a conexão é estabelecida, é melhor armazenar para fins de reutilização.

// init connection object
private Connection connection;
// init properties object
private Properties properties;

Criar propriedades

O objeto de propriedades mantém as informações de conexão, verifique se já estão configuradas.

// create properties
private Properties getProperties() {
    if (properties == null) {
        properties = new Properties();
        properties.setProperty("user", USERNAME);
        properties.setProperty("password", PASSWORD);
        properties.setProperty("MaxPooledStatements", MAX_POOL);
    }
    return properties;
}

Conecte o banco de dados

Agora conecte-se ao banco de dados usando as constantes e propriedades inicializadas.

// connect database
public Connection connect() {
    if (connection == null) {
        try {
            Class.forName(DATABASE_DRIVER);
            connection = DriverManager.getConnection(DATABASE_URL, getProperties());
        } catch (ClassNotFoundException | SQLException e) {
            // Java 7+
            e.printStackTrace();
        }
    }
    return connection;
}

Desconecte o banco de dados

Depois de concluir as operações do banco de dados, feche a conexão.

// disconnect database
public void disconnect() {
    if (connection != null) {
        try {
            connection.close();
            connection = null;
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Tudo junto

Use esta classe MysqlConnectdiretamente após alterar database_name, nome de usuário e senha etc.

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

public class MysqlConnect {
    // init database constants
    private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "";
    private static final String MAX_POOL = "250";

    // init connection object
    private Connection connection;
    // init properties object
    private Properties properties;

    // create properties
    private Properties getProperties() {
        if (properties == null) {
            properties = new Properties();
            properties.setProperty("user", USERNAME);
            properties.setProperty("password", PASSWORD);
            properties.setProperty("MaxPooledStatements", MAX_POOL);
        }
        return properties;
    }

    // connect database
    public Connection connect() {
        if (connection == null) {
            try {
                Class.forName(DATABASE_DRIVER);
                connection = DriverManager.getConnection(DATABASE_URL, getProperties());
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }

    // disconnect database
    public void disconnect() {
        if (connection != null) {
            try {
                connection.close();
                connection = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Como usar?

Inicialize a classe do banco de dados.

// !_ note _! this is just init
// it will not create a connection
MysqlConnect mysqlConnect = new MysqlConnect();

Em outro lugar do seu código ...

String sql = "SELECT * FROM `stackoverflow`";
try {
    PreparedStatement statement = mysqlConnect.connect().prepareStatement(sql);
    ... go on ...
    ... go on ...
    ... DONE ....
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    mysqlConnect.disconnect();
}

Isso é tudo :) Se houver algo para melhorar, edite-o! Espero que isso seja útil.

Madan Sapkota
fonte
Mark, cada classe precisa manter sua própria instância separada do MysqlConnect aberta o tempo todo - supondo que eles precisem interagir com os dados? Só estou me perguntando como essa configuração funciona entre as classes.
18717 Michael Sims
em vez com.mysql.jdbc.Driverdisso, jdbc:mysql://localhost:3306/stocksdeve ser usado, pois o primeiro está obsoleto.
Chaudhry Waqas
Se você for usar o nome da conta, a senha, o nome do banco de dados, etc., é muito desajeitado. Basta colocar todos esses detalhes na cadeia de URL JDBC. (Incluindo o tamanho da piscina ...)
Stephen C
24
String url = "jdbc:mysql://127.0.0.1:3306/yourdatabase";
String user = "username";
String password = "password";

// Load the Connector/J driver
Class.forName("com.mysql.jdbc.Driver").newInstance();
// Establish connection to MySQL
Connection conn = DriverManager.getConnection(url, user, password);
heffaklump
fonte
qual é o seu banco de dados aqui? nome do banco de dados?
precisa
newInstance () não é necessário. É isso?
Mohamed Ennahdi El Idrissi
Não. Não é. E desde o Java 6, toda essa abordagem está desatualizada. E o nome da classe de motorista mudou e ...
Stephen C
12

Aqui está o mínimo necessário para obter dados de um banco de dados MySQL:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection
   ("jdbc:mysql://localhost:3306/foo", "root", "password");

Statement stmt = conn.createStatement();
stmt.execute("SELECT * FROM `FOO.BAR`");
stmt.close();
conn.close();

Adicione manipulação de exceção, configuração etc. a gosto.

Kilian Foth
fonte
3
por que você precisa Class.forName(...).newInstance()?
Don Cheadle
5
@mmcrae Você não faz, desde 2007.
Marquês de Lorne
3

Conexão MySQL JDBC com useSSL.

private String db_server = BaseMethods.getSystemData("db_server");
private String db_user = BaseMethods.getSystemData("db_user");
private String db_password = BaseMethods.getSystemData("db_password");

private String connectToDb() throws Exception {
   String jdbcDriver = "com.mysql.jdbc.Driver";
   String dbUrl = "jdbc:mysql://" + db_server  +
        "?verifyServerCertificate=false" +
        "&useSSL=true" +
        "&requireSSL=true";
    System.setProperty(jdbcDriver, "");
    Class.forName(jdbcDriver).newInstance();

    Connection conn = DriverManager.getConnection(dbUrl, db_user, db_password);
    Statement statement = conn.createStatement();
    String query = "SELECT EXTERNAL_ID FROM offer_letter where ID =" + "\"" + letterID + "\"";
    ResultSet resultSet = statement.executeQuery(query);
    resultSet.next();
    return resultSet.getString(1);
}
AJC
fonte
2

você precisa ter o jar do conector mysql no seu caminho de classe.

na Java JDBC API faz tudo com bancos de dados. usando JDBC, podemos escrever aplicativos Java para
1. Enviar consultas ou atualizar SQL para DB (qualquer banco de dados relacional) 2. Recuperar e processar os resultados do DB

com os três passos abaixo, podemos recuperar dados de qualquer banco de dados

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table");

while (rs.next()) {
    int x = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
}
Kapil das
fonte
2

Código curto e doce.

try {       
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("Driver Loaded");
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","");
    //Database Name - testDB, Username - "root", Password - ""
    System.out.println("Connected...");         
} catch(Exception e) {
    e.printStackTrace();
}

Para SQL Server 2012

try {
    String url = "jdbc:sqlserver://KHILAN:1433;databaseName=testDB;user=Khilan;password=Tuxedo123"; 
    //KHILAN is Host    and 1433 is port number     
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    System.out.println("Driver Loaded");
    conn = DriverManager.getConnection(url);
    System.out.println("Connected...");
} catch(Exception e) {
    e.printStackTrace();
}
KhiLan PaTeL
fonte
1

ConnectionEu estava usando há algum tempo, parecia a maneira mais fácil, mas também havia recomendações para fazer a ifdeclaração - exatamente

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);
if (con != null){
 //..handle your code there 
}

Ou algo assim dessa maneira :)

Provavelmente há algum caso, enquanto getConnectionpode retornar null :)

xxxvodnikxxx
fonte
1

Você pode ver todas as etapas para conectar o banco de dados MySQL a partir do aplicativo Java aqui . Para outro banco de dados, você só precisa alterar o driver apenas na primeira etapa. Certifique-se de fornecer o caminho certo para o banco de dados e corrigir o nome de usuário e a senha.

Visite http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA

Jwalant
fonte
1
COMO
  • Para configurar o driver para executar uma amostra rápida
1. Go to https://dev.mysql.com/downloads/connector/j/, get the latest version of Connector/J

2. Remember to set the classpath to include the path of the connector jar file.
If we don't set it correctly, below errors can occur:

No suitable driver found for jdbc:mysql://127.0.0.1:3306/msystem_development

java.lang.ClassNotFoundException: com.mysql.jdbc:Driver
  • Para configurar o CLASSPATH

Método 1: defina a variável CLASSPATH.

export CLASSPATH=".:mysql-connector-java-VERSION.jar"
java MyClassFile

No comando acima, eu configurei o CLASSPATH para a pasta atual e o arquivo mysql-connector-java-VERSION.jar. Portanto, quando o java MyClassFilecomando for executado, o iniciador de aplicativos java tentará carregar toda a classe Java no CLASSPATH. E descobriu que os Driveerros de classe => BOOM se foram.

Método 2:

java -cp .:mysql-connector-java-VERSION.jar MyClassFile

Nota: Class.forName ("com.mysql.jdbc.Driver"); Este item foi descontinuado neste momento 2019 abr.

Espero que isso possa ajudar alguém!

Nhat Dinh
fonte
-1

Conexão JDBC MySql:

Class.forName("com.mysql.jdbc.Driver");     

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/DatabaseName","Username","Password");         
Statement stmt=con.createStatement();            
stmt = con.createStatement();
ResultSet rs=stmt.executeQuery("Select * from Table");  
Sarat Chandra
fonte
-1

Download e Instalação do Driver JDBC

Link para download (independente da plataforma selecionada): https://dev.mysql.com/downloads/connector/j/

Mova o driver JDBC para a unidade C

Descompacte os arquivos e vá para C: \ drive. O caminho do driver deve ser comoC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Execute seu Java

java -cp "C:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19.jar" testMySQL.java

testMySQL.java

import java.sql.*;
import java.io.*;

public class testMySQL {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
        try
        {  
            Class.forName("com.mysql.cj.jdbc.Driver");  
            Connection con=DriverManager.getConnection(  
                "jdbc:mysql://localhost:3306/db?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root","");  
            Statement stmt=con.createStatement();  
            ResultSet rs=stmt.executeQuery("show databases;");  
            System.out.println("Connected");  
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

    }  

}

insira a descrição da imagem aqui

Chew Zai
fonte
-2

Código curto

public class DB {

    public static Connection c;

    public static Connection getConnection() throws Exception {
        if (c == null) {
            Class.forName("com.mysql.jdbc.Driver");
            c =DriverManager.getConnection("jdbc:mysql://localhost:3306/DATABASE", "USERNAME", "Password");
        }
        return c;
    }

    // Send data TO Database
    public static void setData(String sql) throws Exception {
        DB.getConnection().createStatement().executeUpdate(sql);
    }

    // Get Data From Database
    public static ResultSet getData(String sql) throws Exception {
        ResultSet rs = DB.getConnection().createStatement().executeQuery(sql);
        return rs;
    }
}
Corrupted_S.K
fonte