Ligar o Java a uma base de dados MySQL
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
14 answers
DriverManager
é uma maneira bastante antiga de fazer as coisas. A melhor maneira é obter um DataSource
, quer Procurando um que o seu contentor do servidor de aplicações já tenha configurado para si:
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");
Ou a instigar e configurar directamente um do seu controlador de base de dados:
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");
E depois obter ligações dele, como acima:
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();
Baixe e instale o servidor de MySQL . Faz como sempre. Lembra-te do número do porto sempre que o mudares. É por padrão
3306
.-
Obter O controlador JDBC e colocar em claspath , extrair o ficheiro ZIP e colocar o ficheiro JAR que contém no claspath. O driver específico do Fornecedor JDBC é um concreto implementação da API JDBC (tutorial aqui ).
Se estiver a usar um IDE como o Eclipse ou o Netbeans, então poderá adicioná-lo ao classpath, adicionando o ficheiro JAR como Biblioteca para o local de Compilação nas propriedades do projecto.
Se o estiver a fazer "plain vanilla" na consola de comandos, então terá de indicar a localização do ficheiro JAR no argumento
-cp
ou-classpath
ao executar a sua aplicação Java.java -cp .;/path/to/mysql-connector.jar com.example.YourClass
O
.
é apenas lá para adicionar oactual ao classpath também para que ele possa localizarcom.example.YourClass
e o;
é o separador de classpath tal como está nas janelas. Em Unix e clones:
deve ser usado. -
Crie uma base de dados no MySQL. Vamos criar uma base de dados. Você quer dominar o mundo, então vamos usar UTF-8 também.
CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
Crie um usuário para Java e grant acesso a ti . Simplesmente porque usar
root
é 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 utilizador epassword
é a senha aqui. -
jdbc:mysql://hostname:port/databasename
hostname
: o nome da máquina onde está instalado o servidor de MySQL. Se estiver instalado na mesma máquina onde você executa o código Java, então você pode apenas usarlocalhost
. Também pode ser um Endereço IP como127.0.0.1
. Se você encontrar problemas de conectividade e usar127.0.0.1
em vez delocalhost
resolvê-lo, então você tem um problema em sua configuração de rede/DNS/hosts.port
: a porta TCP / IP onde o servidor de MySQL ouve. Isto é por omissão3306
.databasename
: o nome da base de dados a que gostaria de se ligar. Isso é ...
Então o URL final deve parecer como:
jdbc:mysql://localhost:3306/javabase
-
Ensaio a ligação ao MySQL usando o Java . Crie uma classe Java simples com um método
main()
para testar a ligaçã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ê tiver um
SQLException: No suitable driver
, Então isso significa que ou o driver do JDBC não foi automaticamente carregado ou que a URL do JDBC está errada (ou seja, não foi reconhecida por nenhum dos drivers carregados). Normalmente, um driver JDBC 4.0 deve ser autoloaded quando você apenas deixá-lo em classpath em execução. Para excluir um e outro, você pode sempre 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); }
Note que a chamada é
newInstance()
Não necessária aqui. É só para consertar o velho e o buggy. explicação aqui . Se esta linha lançarClassNotFoundException
, Então o ficheiro JAR que contém a classe de controladores JDBC não é simplesmente colocado no classpath.Note que você não precisa carregar o motorista todas as vezes antes de ligar. Apenas uma vez durante a inicialização da aplicação é suficiente.
Se tiveres um
SQLException: Connection refused
ouConnection timed out
ou um MySQL específicoCommunicationsException: Communications link failure
, significa que o DB não está acessível. Isto pode ter uma ou mais das seguintes causas:- o endereço IP ou o nome da máquina no URL do JDBC está errado.
- O Nome da máquina no URL do JDBC não é reconhecido pelo servidor DNS local.
- O número da porta está em falta ou está errado no URL do JDBC.
- O servidor DB está em baixo.
- O servidor DB não aceita ligações TCP/IP.
- O servidor DB ficou sem ligações. Algo entre Java e DB é ligações de bloqueio, por exemplo uma firewall ou um 'proxy'.
Para resolver um ou outro, siga os seguintes conselhos:
- verifique e teste-os com
ping
. - actualizar o DNS ou usar o endereço IP no URL do JDBC.
- verifique com base em
my.cnf
De MySQL DB. - iniciar o DB.
- verifique se o mysqld é iniciado sem o
--skip-networking option
. - reinicie o DB e corrija o seu código de acordo que fecha as ligações em
finally
. - desactivar a firewall e/ou configurar a firewall/proxy para permitir / encaminhar o porto.
Note que fechar o Connection
é extremamente importante. Se você não fechar conexões e continuar recebendo muitos deles em um curto período de tempo, então a base de dados pode ficar sem conexões e sua aplicação pode quebrar. Adquirir sempre o Connection
em um try-with-resources
declaração Ou se ainda não estiver no Java 7, feche-o explicitamente em finally
de um bloco try-finally
. Fechando em finally
é apenas para garantir que ele seja fechado também em caso de uma exceção. Isto aplica - se também a Statement
, PreparedStatement
e ResultSet
.
Usar um padrão Singleton para a ligação DB é uma má abordagem. Ver entre outras questões: http://stackoverflow.com/q/9428573 isto é um erro de partida número 1.
Inicializar as constantes da base de Dados
Criar um utilizador de base de dados de propriedades constantes, senha, URL e controladores, limite de sondagem, 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 a ligação e as propriedades
Uma vez estabelecida a conexão, é melhor armazenar para fins de reutilização.// init connection object
private Connection connection;
// init properties object
private Properties properties;
Criar Propriedades
O objecto propriedades contém a informação da ligação, verifique se já está definida.
// 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;
}
Ligue a base de Dados
Agora ligue-se a base de dados com 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;
}
Desliga a base de Dados
Assim que terminares as operações da base de dados, fecha a ligação.// disconnect database
public void disconnect() {
if (connection != null) {
try {
connection.close();
connection = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Tudo junto
Utilize esta classe MysqlConnect
directamente após a alteração do nome da base de dados, nome de utilizador 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 utilizar?
Inicializar a classe de base de dados.// !_ note _! this is just init
// it will not create a connection
MysqlConnect mysqlConnect = new MysqlConnect();
Algures no teu 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();
}
Isto é tudo. :) Se alguma coisa melhorar edite-o! Espero que isto seja útil.
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);
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();
Adicionar tratamento de excepções, configuração, etc. provar.
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);
}
Na API Java JDBC faz tudo com bases de dados. usando o JDBC podemos escrever aplicações Java para
1. Enviar as consultas ou actualizar o SQL para DB(qualquer base de dados relacional)
2. Obter e processar os resultados de DB
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");
}
Poderá ver todos os passos para ligar a base de dados MySQL a partir da aplicação Java Aqui . Para outro banco de dados, você só precisa mudar o driver apenas no primeiro passo. Por favor, certifique-se de que fornece o caminho certo para a base de dados e corrige o nome de utilizador e a senha.
Visita http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA
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 o servidor SQL 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();
}
Connection
eu estava usando algum tempo atrás, parecia a maneira mais fácil, mas também havia recomendações para fazer lá if
declaração-exatamente
Connection con = DriverManager.getConnection(
"jdbc:myDriver:DatabaseName",
dBuserName,
dBuserPassword);
if (con != null){
//..handle your code there
}
Ou algo do género:
Provavelmente há algum caso, enquanto getConnection
pode voltar.null
:)
- para configurar o condutor para fazer 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 montar o CLASPATH
Método 1: definir a variável CLASPATH.
export CLASSPATH=".:mysql-connector-java-VERSION.jar"
java MyClassFile
No comando acima, configurei o fecho para a pasta actual e para a versão mysql-connector-java.jar file. Assim, quando o comando java MyClassFile
for executado, o lançador de aplicações java irá tentar carregar toda a classe Java no CLASSSPATH.
E descobriu que os erros de BOOM tinham desaparecido.
Método 2:
java -cp .:mysql-connector-java-VERSION.jar MyClassFile
Nota: Classe.forName ("com.versao.jdbc.Driver"); This is depreciated at this moment 2019 Apr.
Espero que isto possa ajudar alguém!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");
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;
}
}
Obter O controlador JDBC
Ligação de transferência (seleccionar plataforma independente): https://dev.mysql.com/downloads/connector/j/
Mover o controlador JDBC para a unidade C
Abre os ficheiros e passa para C:\ drive. O seu caminho do condutor deve ser como C:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19
Executar O 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);
}
}
}