2010-05-15 6 views

Répondre

165

DriverManager est une façon assez ancienne de faire les choses. La meilleure façon est d'obtenir un DataSource, que ce soit en regardant un vers le haut que votre conteneur de serveur d'applications déjà configuré pour vous:

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

ou instanciation et la configuration de l'un de pilote de base de données directement:

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

et puis obtenir des connexions de lui, comme ci-dessus:

Connection conn = dataSource.getConnection(); 
Statement stmt = conn.createStatement(); 
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS"); 
... 
rs.close(); 
stmt.close(); 
conn.close(); 
+1

comment les autres exemples utilisent 'com.mysql.jdbc.Driver'? cette méthode est-elle meilleure? –

+6

Je pense que c'est la vieille classe de pilote qui fonctionne avec le mécanisme de pilote à l'ancienne. 'MysqlDataSource' implémente' javax.sql.DataSource' qui est le mécanisme le plus récent. –

+0

@SeanOwen +1 pour une bonne explication. Je n'étais pas au courant de cette méthode, car la plupart des gens parlent de DriverManager. –

19
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); 
+0

ce qui est votre_base_de_données ici? nom de la base de données? –

+16

Je vais répondre à ma propre question: C'est "yourdatabase" –

+0

* newInstance() * n'est pas nécessaire. Est-ce? –

11

est ici le strict minimum dont vous avez besoin pour obtenir des données sur une base de données 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(); 

Ajouter la gestion des exceptions, la configuration, etc. au goût.

+2

Pourquoi avez-vous besoin de 'Class.forName (...). NewInstance()'? – mmcrae

+1

@mmcrae Vous n'avez pas, depuis 2007. – EJP

380

Voici une explication étape par étape comment installer MySQL et JDBC et comment l'utiliser:

  1. Download et installer le serveur MySQL. Faites-le comme d'habitude. Rappelez-vous le numéro de port chaque fois que vous l'avez modifié. C'est par défaut 3306.

  2. Download le pilote JDBC et mettre en classpath, extraire le fichier ZIP et placez le fichier contenant JAR dans le classpath. Le pilote JDBC spécifique au fournisseur est une implémentation concrète du JDBC API (tutorial here).

    Si vous utilisez un IDE comme Eclipse ou Netbeans, vous pouvez l'ajouter à la classpath en ajoutant le fichier JAR comme Library au chemin de génération dans les propriétés du projet. Si vous le faites "plain vanilla" dans la console de commande, vous devez spécifier le chemin d'accès au fichier JAR dans l'argument -cp ou -classpath lors de l'exécution de votre application Java.

    java -cp .;/path/to/mysql-connector.jar com.example.YourClass

    Le . est juste là pour ajouter au classpath répertoire courant afin qu'il puisse localiser com.example.YourClass et le ; est le séparateur de classpath comme il est dans Windows. Dans Unix et les clones : doivent être utilisés.

  3. Créer un database dans MySQL. Créons une base de données javabase. Vous voulez bien sûr World Domination, alors utilisons aussi UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
    
  4. Create an user pour Java et grant il accès. Tout simplement parce que l'utilisation de root est une mauvaise pratique.

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

    Oui, java est le nom d'utilisateur et le mot de passe est password ici.

  5. Determine l'URL JDBC. Pour connecter la base de données MySQL en utilisant Java, vous avez besoin d'une URL JDBC dans la syntaxe suivante:

    jdbc:mysql://hostname:port/databasename
    • hostname: Le nom d'hôte où le serveur MySQL est installé. S'il est installé sur la même machine où vous exécutez le code Java, vous pouvez simplement utiliser localhost. Il peut également s'agir d'une adresse IP telle que 127.0.0.1. Si vous rencontrez des problèmes de connectivité et que vous utilisez 127.0.0.1 au lieu de localhost l'avez résolu, alors vous avez un problème dans votre configuration réseau/DNS/hosts.

    • port: Le port TCP/IP où le serveur MySQL écoute. C'est par défaut 3306.

    • databasename: Nom de la base de données à laquelle vous souhaitez vous connecter. C'est javabase.

    Donc, l'URL finale devrait ressembler à:

    jdbc:mysql://localhost:3306/javabase
  6. Test the connection à MySQL en utilisant Java. Créez une classe Java simple avec une méthode main() pour tester la connexion.

    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 vous obtenez un SQLException: No suitable driver, cela signifie que soit le pilote JDBC n'a pas été automatiquement chargé du tout ou que l'URL JDBC est erroné (à savoir qu'il n'a pas été reconnu par l'un des pilotes chargés). Normalement, un pilote JDBC 4.0 doit être automatiquement chargé lorsque vous le déposez simplement dans le classpath d'exécution. Pour exclure un et l'autre, vous pouvez toujours charger manuellement comme ci-dessous:

    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); 
    } 
    

    Notez que l'appel est newInstance()pas nécessaire ici. C'est juste pour réparer le vieux et buggy org.gjt.mm.mysql.Driver. Explanation here. Si cette ligne lance ClassNotFoundException, le fichier JAR contenant la classe de pilote JDBC n'est simplement pas placé dans le chemin de classe.

    Notez que vous n'avez pas besoin de charger le pilote à chaque foisavant la connexion. Juste une seule fois au démarrage de l'application est suffisant.

    Si vous obtenez un SQLException: Connection refused ou un Connection timed out ou un CommunicationsException: Communications link failure spécifique à MySQL, cela signifie que le DB n'est pas accessible du tout. Cela peut avoir une ou plusieurs des causes suivantes:

    1. L'adresse IP ou le nom d'hôte dans l'URL JDBC est incorrect.
    2. Le nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
    3. Le numéro de port est manquant ou incorrect dans l'URL JDBC.
    4. Le serveur de base de données est arrêté.
    5. Le serveur de base de données n'accepte pas les connexions TCP/IP.
    6. Le serveur de base de données n'a plus de connexions.
    7. Quelque chose entre Java et DB bloque les connexions, par ex. un pare-feu ou un proxy.

    Pour résoudre l'un ou l'autre, suivez les conseils suivants:

    1. Vérifiez et testez avec ping.
    2. Actualisez DNS ou utilisez l'adresse IP dans l'URL JDBC à la place.
    3. Vérifiez-le basé sur my.cnf de MySQL DB.
    4. Démarrez le DB.
    5. Vérifiez si mysqld est démarré sans le --skip-networking option.
    6. Redémarrez le DB et corrigez votre code en conséquence qu'il ferme les connexions au finally.
    7. Désactiver le pare-feu et/ou configurer pare-feu/proxy pour autoriser/transférer le port.

    Notez que la fermeture de la Connection est extrêmement importante. Si vous ne fermez pas les connexions et n'en conservez pas beaucoup dans un court laps de temps, la base de données risque de manquer de connexions et votre application risque de se casser. Acquiers toujours le Connection dans un try-with-resources statement. Ou si vous n'êtes pas encore sur Java 7, fermez-le explicitement dans finally d'un bloc try-finally. La fermeture en finally est juste pour s'assurer qu'il se ferme aussi bien en cas d'exception. Ceci s'applique également à Statement, PreparedStatement et ResultSet.

C'était aussi loin que les problèmes de connectivité. Vous pouvez trouver here un didacticiel plus avancé sur le chargement et le stockage d'objets de modèle Java complets dans une base de données à l'aide d'une classe DAO de base. L'utilisation d'un motif Singleton pour la connexion DB est une mauvaise approche. Voir entre autres questions: http://stackoverflow.com/q/9428573/. C'est une erreur # 1 étoiles.

2

Vous pouvez voir toutes les étapes pour connecter la base de données MySQL à partir de l'application Java here. Pour les autres bases de données, il suffit de changer le pilote dans la première étape seulement. Assurez-vous de fournir le bon chemin vers la base de données et de corriger le nom d'utilisateur et le mot de passe.

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

1

vous devez avoir pot de connecteur mysql dans votre classpath.

en Java L'API JDBC crée tout avec des bases de données.en utilisant JDBC, nous pouvons écrire des applications Java pour
1. Envoyer requêtes SQL ou mise à jour de DB (toute base de données relationnelle) 2. Récupérer et traiter les résultats de DB

avec ci-dessous trois étapes que nous pouvons en mesure de récupérer des données à partir de tout Base de données

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"); 
} 
1

Connection j'utilisais il y a quelque temps, il était à la recherche comme la meilleure façon, mais aussi il y avait recommandation pour y faire if Instruction- exactement

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

Ou quelque chose comme de cette façon :)

Probablement, il y a un certain cas, alors que getConnection peut retourner null :)

26

base de données Initialiser constantes

Créer nom d'utilisateur de base de données de propriétés constantes, mot de passe , URL et pilotes, limite d'interrogation, etc.

// init database constants 
private static final String DATABASE_DRIVER = "com.mysql.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 

Connexion et Propriétés Initialiser

Une fois la connexion établie, il est préférable de stocker à des fins de réutilisation.

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

Créer des propriétés

Les propriétés objet contiennent les informations de connexion, vérifiez si elle est déjà définie.

// 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; 
} 

Connectez la base de données

maintenant se connecter à la base de données en utilisant les constantes et les propriétés initialisées.

// 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; 
} 

Débranchez la base de données

Une fois que vous avez terminé avec les opérations de base de données, il suffit de fermer la connexion.

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

Tout ensemble

Utilisez cette classe MysqlConnect directement après le changement bdd, nom d'utilisateur et mot de passe, 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.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(); 
      } 
     } 
    } 
} 

Comment utiliser?

Initialise la classe de base de données.

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

Quelque part d'autre dans votre code ...

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(); 
} 

C'est tout :) Si quoi que ce soit pour améliorer l'éditer! J'espère que c'est utile.

+0

Mark, est-ce que chaque classe a besoin de maintenir sa propre instance MysqlConnect séparée ouverte à tout moment - en supposant qu'ils doivent interagir avec les données? Je me demande simplement comment cette configuration fonctionne entre les classes. –

+0

Belle classe. Je vous remercie. –

2

Code court et doux.

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(); 
    } 

Pour 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(); 
    } 
0

MySql JDBC Connection:

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"); 
1

JDBC MySQL avec connexion 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); 
} 
0

Short Code

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; 
    } 
} 
+0

quelque chose ne va pas avec votre indentation, 1 fermeture '}' est manquant, s'il vous plaît vérifier et corriger. Cordialement – YakovL

+1

Merci Bro! YakovL :) –

Questions connexes