Foro sobre Java SE > Ejecutable JAVA
¿Esa MySQL estará incrustada en la misma aplicación, o requiere que el usuario realice una instalación previa?
Claro, incrustada en la misma aplicación, la idea es entregarle al usuario un solo archivo, es decir el ejecutable donde este todo empaquetado, hasta la base de datos mysql... La idea es que el usuario no tenga que instalar nada previo
http://dev.mysql.com/downloads/connector/mxj/
MUchas Gracias choces, al parecer este conector me permite integrar mysql en una aplicacion java, ahora vamos al grano. Tengo la base de datos en mysql realizada con sus tablas y relaciones. Actualmente para funcionar tengo que encender mysql y luego ejecutar el jar para que funcione la aplicación. Como implemento este conector para meter la base de datos mysql en el jar y que el usuario no tenga que instalar mysql en su computador ni clickear en varias partes para que funcione??
La documentacion esta en ingles y no entiendo casi nada, te agradeceria tu ayuda o alguien que sepa implementar este conector...
De toda la documentación, lo único que te puede interesar son dos maneras de usarlo, y se explican con ejemplos en código fuente:
Como JDBC driver:
http://dev.mysql.com/doc/refman/5.1/en/connector-mxj-configuration-driver-launched.html
Con un Objecto Java:
http://dev.mysql.com/doc/refman/5.1/en/connector-mxj-configuration-java-object.html
Settings:
http://dev.mysql.com/doc/refman/5.1/en/connector-mxj-configuration-options.html
Todos esos ejemplos están también incluidos en los archivos de la distribución, al igual que otros varios tests, que también se pueden usar como referencia de uso.
Una vez que tienes ambas librerías en el classpath de la aplicación, al igual que el JDBC driver para MySQL, todo se reduce a adaptar uno de esos dos ejemplos, según tus requisitos; lo que es bastante fácil de realizar.
De todos modos, después de haber usado el MXJ durante varios años, he decidido dejarlo en favor de H2: http://www.h2database.com/html/main.html
* Listo descargue el conector, abri mi proyecto, ingrese los dos jar en mi classpath,
mysql-connector-mxj-gpl-5-0-12.jar
mysql-connector-mxj-gpl-5-0-12-db-files.jar
* Hice un archivo nuevo de conexion a Base de dato con este codigo
ConnectorMXJUrlTestExample.java
* Abrí mi motor mysql donde tengo mi base de datos, la cual se llama conquerorcentral.
*Trato de configurar el nuevo conector con los datos de mi DB
import java.io.File;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.DriverManager;
import com.mysql.management.driverlaunched.ServerLauncherSocketFactory;
import com.mysql.management.util.QueryUtil;
public class Conector {
public static String DRIVER = "com.mysql.jdbc.Driver";
public static String JAVA_IO_TMPDIR = "java.io.tmpdir";
public static void main(String[] args) throws Exception {
File ourAppDir = new File(System.getProperty(JAVA_IO_TMPDIR));
File databaseDir = new File(ourAppDir, "test-mxj");
String databasePath = URLEncoder.encode(databaseDir.getPath(), "UTF-8");
int port = Integer.parseInt(System.getProperty("c-mxj_test_port",
"3336"));
String dbName = "conquerorcentral";
String url = "jdbc:mysql:mxj://localhost:" + port + "/" + dbName //
+ "?" + "server.basedir=" + databasePath //
+ "&" + "createDatabaseIfNotExist=true"//
+ "&" + "server.initialize-user=true" //
;
System.out.println(url);
String userName = "root";
String password = "**********";
Class.forName(DRIVER);
Connection conn = null;
try {
conn = DriverManager.getConnection(url, userName, password);
String sql = "SELECT *From usuario Where id=77091715";
String queryForString = new QueryUtil(conn).queryForString(sql);
System.out.println("------------------------");
System.out.println(sql);
System.out.println("------------------------");
System.out.println(queryForString);
System.out.println("------------------------");
System.out.flush();
Thread.sleep(100); // wait for System.out to finish flush
} finally {
try {
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
ServerLauncherSocketFactory.shutdown(databaseDir, null);
}
}
}
Pero no logro hacer una conexión. ¿Como hago para conectarme a mi DB actual con este conector?? ¿Que no hecho? ¿O que estoy haciendo mal?
Debería crearte la base de datos, si no existe ya, en la ruta que le hayas definido.
Comprueba que te ha creado la estructura necesaria en esa carpeta, a ver qué contiene.
Me crea una carpeta llamada "text-mxj" y dentro de esta crea otra llamada "data", pero vacia... y con ese mismo codigo, Eclipse me envia este msj de error:
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:mysql:mxj://localhost:/conquerorcentral?server.basedir=C%3A%5CDOCUME%7E1%5CESVIDA%5CCONFIG%7E1%5CTemp%5Ctest-mxj&createDatabaseIfNotExist=true&server.initialize-user=true
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at Conector.main(Conector.java:38)
Como puedo usar mi vieja DB con este codigo?
Como le paso las tablas(que tienen datos) a este conector para que las use y me las exporte cuando haga el .jar??
Esta es mi antigua clase de conexion:
import javax.swing.table.AbstractTableModel;
import java.lang.ClassNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class Conectar extends AbstractTableModel {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost/conquerorcentral";
String usuario = "root";
String clave = "juanmanett";
private static final long serialVersionUID = 1L;
private Statement stat;
private ResultSet rs; // Conjunto de datos de sentencia SELECT
private ResultSetMetaData rsmd; // Necesario para nombres de columnas
private Connection con; // Conexión con base de datos
private String mensaje_error = "Accio no valida";// Registro de mensajes de error
private String sentencia; // Ultima sentencia ejecutada
public PreparedStatement sent = null;
public boolean conexion(String tabla, int accion) {
boolean valor;
if ( !cargarDriver( driver ) ){
System.out.println( obt_mensaje_error() );
return false;
}
if ( !conectar( url, usuario, clave ) ) {
System.out.println( obt_mensaje_error() );
return false;
}
else {
if ( accion==0 ) {
valor=cargarDatos( tabla );
}
else if ( accion==1 ) {
valor=registrarDatos( tabla );
}
else if ( accion==2 ) {
valor=modificarDatos( tabla );
}
else{
System.out.println( obt_mensaje_error() );
return false;
}
}
return valor;
}
private boolean cargarDriver( String driver) {
try {
Class.forName( driver );
return true;
}
catch( ClassNotFoundException e ) {
mensaje_error = new String( "No encuentra el driver. " + e.getMessage() );
return false;
}
}
private boolean conectar( String url, String usuario, String clave ) {
try {
con = DriverManager.getConnection( url, usuario, clave );
return true;
}
catch (SQLException e) {
mensaje_error = new String( "Error de conexión. " + e.getMessage() );
return false;
}
}
private boolean cargarDatos( String tabla ) {
try {
stat = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE );
boolean resultado = actualizar( tabla );
if ( resultado )
rsmd = rs.getMetaData();
return resultado;
}
catch (SQLException e) {
mensaje_error = new String( e.getMessage() );
return false;
}
}
/*********************registrarDatos********************************/
private boolean registrarDatos( String tabla ) {
try{
sent= con.prepareStatement(tabla);
return true;
}
catch (SQLException e) {
mensaje_error = new String( e.getMessage() );
return false;
}
}
/*********************modificarDatos********************************/
private boolean modificarDatos( String tabla ) {
try{
stat= con.createStatement();
stat.executeUpdate(tabla);
return true;
}
catch (SQLException e) {
mensaje_error = new String( e.getMessage() );
return false;
}
}
/**************** obt_mensaje_error() ******************/
public String obt_mensaje_error() { return mensaje_error; }
/**************** actualizar() ************************/
public boolean actualizar( String tabla ) {
try {
sentencia = tabla;
if (rs != null)
rs.close();
if ( stat != null ) {
rs = stat.executeQuery(sentencia); // Ejecutar la consulta
fireTableStructureChanged(); // Ordena a la JTable que se actualice
if(rs.next())
return true;
else
return false;
}
mensaje_error = new String( "No se pueden cargar los datos. Probablemente no hay conexión" );
return false;
}
catch (SQLException e) {
mensaje_error = new String( "No se pueden cargar los datos. " + e.getMessage() );
return false;
}
}
/*************** getColumnName() *********************/
public String getColumnName( int c ) {
try {
if ( rsmd != null )
return rsmd.getColumnName(c + 1);
return "";
}
catch(SQLException e) { e.printStackTrace(); return ""; }
}
/*************** getColumnCount() ******************/
public int getColumnCount() {
try {
if ( rsmd != null )
return rsmd.getColumnCount();
return 0;
}
catch(SQLException e) { e.printStackTrace(); return 0; }
}
/****************** getRowCount() *******************/
public int getRowCount() {
int i=0;
try {
if ( rs != null ) {
rs.last();
i = rs.getRow();
rs.first();// Nos situamos en la última fila
}
}
catch(SQLException e) { e.printStackTrace();}
return i; // Devolvemos el número de la fila
}
/******************** getResultSet() *******************/
public ResultSet getResultSet() {
return rs;
}
/******************* getValueAt() *********************/
public Object getValueAt( int fila, int col ) {
try {
if ( rs != null ) {
rs.absolute( fila + 1 );
return rs.getObject( col + 1 );
}
return "";
}
catch(SQLException e) { e.printStackTrace(); return null; }
}
/****************** cierra recursos ********/
protected void finalize() {
try {
if (rs != null)
rs.close();
if (con != null)
con.close();
if (stat != null)
stat.close();
if(sent!=null)
sent.close();
}
catch(SQLException e) { e.printStackTrace(); }
}
}
Como implemento el nuevo conector?
Ese error apunta a que no accede al Connector/J para MySQL. También es necesario incorporarlo al classpath, de otro modo no se puede establecer la conexión.
Hola choces: (semi-of topic)
¿Qué tal H2 para bases de datos grandes con tablas de más de 1.000.000 de registros?
Hola marc,
Tampoco es muy off-topic, puesto que la he recomendado más arriba ;)
No la he usado con tablas tan grandes, pero sé por la lista de correo de H2, que se emplea con éxito en tablas enormes, más grandes que la que mencionas.
Llevo usando H2 desde hace unos seis meses, tras haber modificado el código que usaba la antigua MySQL MXJ a H2... ¡Y no pienso volver atrás! :D
Hola!!
Tengo un problema similar al de conquistador (necesito integrar mysql en una aplicacion java, para realizar un ejecutable que lance la aplicación y encienda el motor mysql, etc., sin que el el usuario tenga que instalar nada previo), Tal y como esta mi aplicación actual tengo que abrir primero mysql para que todo funcione.
Han quitado el enlace al conector mxj, Lo han quitado porque ya es demasiado antiguo y tendría que realizarlo con otro? Dónde puedo conseguirlo?
El .jar del connector-j también hay que incorporarlo al classpath?
He conseguido las librerías en softpedia, pero todavía no sé si funcionaran...
Necesito hacer un ejecutable con mis clases .class y mi base de datos mysql. El asunto es que voy a vender una aplicacion para una IPS, y la idea es que ellos solo tenga que dar doble click a un ejecutable y este lance la aplicación y encienda el motor mysql, etc..
Yo se hacer un Jar con las clases, la dificultad la tengo es con la DB MySql