Solución:
Aquí hay una explicación paso a paso de cómo instalar MySQL y JDBC y cómo usarlo:
-
Descargue e instale el servidor MySQL. Hágalo de la forma habitual. Recuerde el número de puerto siempre que lo cambie. Es por defecto
3306
. -
Descargue el controlador JDBC y colóquelo en classpath, extraiga el archivo ZIP y coloque el archivo JAR que lo contiene en la ruta de clase. El controlador JDBC específico del proveedor es una implementación concreta de la API JDBC (tutorial aquí).
Si está utilizando un IDE como Eclipse o Netbeans, puede agregarlo a la ruta de clase agregando el archivo JAR como Biblioteca al Construir camino en las propiedades del proyecto.
Si lo está haciendo “simple y llanamente” en la consola de comandos, debe especificar la ruta al archivo JAR en el
-cp
o-classpath
argumento al ejecutar su aplicación Java.java -cp .;/path/to/mysql-connector.jar com.example.YourClass
los
.
está ahí para agregar el Actual directorio a la ruta de clases también para que pueda localizarcom.example.YourClass
y el;
es el separador de rutas de clases como en Windows. En Unix y clones:
debería ser usado. -
Crea una base de datos en MySQL. Creemos una base de datos
javabase
. Por supuesto que quieres World Domination, así que usemos UTF-8 también.CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
Crea un usuario para Java y concédele acceso. Simplemente porque usando
root
es una mala práctica.CREATE USER 'java'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
Sí,
java
es el nombre de usuario ypassword
es la contraseña aquí. -
Determine la URL de JDBC. Para conectar la base de datos MySQL usando Java, necesita una URL JDBC con la siguiente sintaxis:
jdbc:mysql://hostname:port/databasename
-
hostname
: El nombre de host donde está instalado el servidor MySQL. Si está instalado en la misma máquina donde ejecuta el código Java, entonces puede usarlocalhost
. También puede ser una dirección IP como127.0.0.1
. Si encuentra problemas de conectividad y utiliza127.0.0.1
en lugar delocalhost
resuelto, entonces tiene un problema en la configuración de su red / DNS / hosts. -
port
: El puerto TCP / IP donde escucha el servidor MySQL. Esto es por defecto3306
. -
databasename
: El nombre de la base de datos a la que le gustaría conectarse. Esa esjavabase
.
Entonces, la URL final debería verse así:
jdbc:mysql://localhost:3306/javabase
-
-
Pruebe la conexión a MySQL usando Java. Cree una clase Java simple con un
main()
método para probar la conexión.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); }
Si obtienes un
SQLException: No suitable driver
, entonces significa que el controlador JDBC no se cargó automáticamente o que la URL de JDBC es incorrecta (es decir, no fue reconocida por ninguno de los controladores cargados). Normalmente, un controlador JDBC 4.0 debe cargarse automáticamente cuando lo suelte en classpath en tiempo de ejecución. Para excluir uno y otro, siempre puede cargarlo manualmente como se muestra a continuación: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); }
Tenga en cuenta que el
newInstance()
la llamada es no necesario aquí. Es solo para arreglar lo viejo y con erroresorg.gjt.mm.mysql.Driver
. Explicación aquí. Si esta linea arrojaClassNotFoundException
, entonces el archivo JAR que contiene la clase del controlador JDBC simplemente no se ha colocado en la ruta de clases.Tenga en cuenta que no necesita cargar el controlador cada vez antes de conectando. Solo una vez durante el inicio de la aplicación es suficiente.
Si obtienes un
SQLException: Connection refused
oConnection timed out
o un MySQL específicoCommunicationsException:
, entonces significa que la base de datos no es accesible en absoluto. Esto puede tener una o más de las siguientes causas:
Communications link failure-
La dirección IP o el nombre de host en la URL de JDBC son incorrectos.
- El servidor DNS local no reconoce el nombre de host en la URL de JDBC.
- Falta el número de puerto o es incorrecto en la URL de JDBC.
- El servidor de base de datos está inactivo.
- El servidor de base de datos no acepta conexiones TCP / IP.
- El servidor de base de datos se ha quedado sin conexiones.
- Algo entre Java y DB está bloqueando las conexiones, por ejemplo, un firewall o proxy.
Para solucionar uno u otro, siga los siguientes consejos:
- Verifíquelos y pruébelos con
ping
. - Actualice el DNS o utilice la dirección IP en la URL de JDBC en su lugar.
- Verifíquelo en base a
my.cnf
de MySQL DB. - Inicie la base de datos.
- Verifique si mysqld se inicia sin el
--skip-networking option
. - Reinicie la base de datos y corrija su código en consecuencia que cierra las conexiones en
finally
. - Deshabilite el firewall y / o configure el firewall / proxy para permitir / reenviar el puerto.
Tenga en cuenta que al cerrar el
Connection
es extremadamente importante. Si no cierra las conexiones y sigue obteniendo muchas de ellas en poco tiempo, es posible que la base de datos se quede sin conexiones y su aplicación se rompa. Adquiera siempre elConnection
en untry-with-resources
declaración. O si aún no está en Java 7, ciérrelo explícitamente enfinally
de untry-finally
cuadra. Cerrando enfinally
es solo para asegurarse de que también se cierre en caso de una excepción. Esto también se aplica aStatement
,PreparedStatement
yResultSet
. -
Eso fue todo en lo que respecta a la conectividad. Puede encontrar aquí un tutorial más avanzado sobre cómo cargar y almacenar objetos de modelo Java completos en una base de datos con la ayuda de una clase DAO básica.
Usar un patrón Singleton para la conexión DB es un mal enfoque. Consulte entre otras preguntas: http://stackoverflow.com/q/9428573/. Este es un error # 1 para los principiantes.
DriverManager
es una forma bastante antigua de hacer las cosas. La mejor forma es conseguir un DataSource
, ya sea buscando uno que el contenedor de su servidor de aplicaciones ya esté configurado para usted:
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");
o instanciar y configurar uno desde el controlador de su base de datos directamente:
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");
y luego obtenga conexiones de él, igual que arriba:
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();
Inicializar las constantes de la base de datos
Cree el nombre de usuario, la contraseña, la URL y los controladores de la base de datos de propiedades constantes, el límite de sondeo, 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 conexión y propiedades
Una vez que se establece la conexión, es mejor almacenar para su reutilización.
// init connection object
private Connection connection;
// init properties object
private Properties properties;
Crear propiedades
El objeto de propiedades contiene la información de conexión, verifique si ya está configurado.
// 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;
}
Conectar la base de datos
Ahora conéctese a la base de datos usando las constantes y propiedades 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;
}
Desconectar la base de datos
Una vez que haya terminado con las operaciones de la base de datos, simplemente cierre la conexión.
// disconnect database
public void disconnect() {
if (connection != null) {
try {
connection.close();
connection = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Todo junto
Usa esta clase MysqlConnect
directamente después de cambiar el nombre de la base de datos, el nombre de usuario y la contraseña, 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();
}
}
}
}
¿Cómo utilizar?
Inicialice la clase de la base de datos.
// !_ note _! this is just init
// it will not create a connection
MysqlConnect mysqlConnect = new MysqlConnect();
En algún otro lugar de su 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();
}
Esto es todo 🙂 ¡Si hay algo para mejorar, edítalo! Espero que esto sea de ayuda.