Подключите Java к базе данных MySQL

223

Как вы подключаетесь к базе данных MySQL в Java?

Теги:
jdbc

12 ответов

153
Лучший ответ

DriverManager - довольно старый способ делать вещи. Лучше всего получить DataSource, либо посмотрев, что ваш контейнер сервера приложений уже настроен для вас:

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

или создать экземпляр и настроить его непосредственно из драйвера базы данных:

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

а затем получить от него соединения, такие же, как указано выше:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();
  • 1
    почему другие примеры используют com.mysql.jdbc.Driver ? этот метод лучше?
  • 7
    Я думаю, что это класс драйвера старого стиля, который работает с механизмом драйвера старого стиля. MysqlDataSource реализует javax.sql.DataSource который является более новым механизмом.
Показать ещё 10 комментариев
352

Вот пошаговое объяснение, как установить MySQL и JDBC и как его использовать:

  • Download и установите сервер MySQL. Просто делайте это обычным способом. Помните номер порта, когда вы его изменили. Он по умолчанию 3306.

  • Download драйвер JDBC и поместив путь к классам, извлеките ZIP файл и поместите содержащий JAR файл в пути к классам. Спецификатор JDBC для конкретного поставщика - это конкретная реализация JDBC API (учебник здесь).

    Если вы используете IDE, например Eclipse или Netbeans, вы можете добавить его в путь к классам, добавив JAR файл в качестве библиотеки в путь сборки в свойствах проекта.

    Если вы делаете это "plain vanilla" в командной консоли, вам нужно указать путь к JAR файлу в аргументе -cp или -classpath при выполнении вашего Java-приложения.

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

    . находится там, чтобы добавить текущий каталог в путь к классам, чтобы он мог найти com.example.YourClass, а ; - это разделитель класса, как и в Windows. В Unix и клоны следует использовать :.

  • Создайте database в MySQL. Позвольте создать базу данных javabase. Вы, разумеется, хотите World Domination, поэтому также используйте UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    
  • Создать пользователя для Java и grant он имеет доступ к. Просто потому, что использование root является плохой практикой.

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

    Да, java - это имя пользователя, а password - пароль здесь.

  • Определить URL-адрес JDBC. Для подключения базы данных MySQL с использованием Java вам нужен URL-адрес JDBC в следующем синтаксисе:

    jdbc:mysql://hostname:port/databasename
    • hostname: имя хоста, в котором установлен сервер MySQL. Если он установлен на том же компьютере, где вы запускаете Java-код, вы можете просто использовать localhost. Он также может быть IP-адресом, например 127.0.0.1. Если вы столкнулись с проблемами подключения и с помощью 127.0.0.1 вместо localhost решили это, у вас возникла проблема в конфигурации вашей сети/DNS/хоста.

    • port: порт TCP/IP, в котором слушает сервер MySQL. Это по умолчанию 3306.

    • databasename: имя базы данных, к которой вы хотите подключиться. Это javabase.

    Итак, конечный URL-адрес должен выглядеть так:

    jdbc:mysql://localhost:3306/javabase
  • Проверьте подключение к MySQL с помощью Java. Создайте простой Java-класс с помощью метода main() для проверки соединения.

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

    Если вы получаете SQLException: No suitable driver, то это означает, что либо драйвер JDBC не был полностью загружен, либо неправильный URL JDBC (т.е. он не был распознан ни одним из загруженных драйверов). Как правило, драйвер JDBC 4.0 должен быть автоматически загружен, когда вы просто бросаете его в путь к классам времени выполнения. Чтобы исключить одно и другое, вы всегда можете вручную загрузить его, как показано ниже:

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

    Обратите внимание, что вызов newInstance() не. Это просто исправить старую и багги org.gjt.mm.mysql.Driver. Объяснение здесь. Если эта строка выбрасывает ClassNotFoundException, то JAR файл, содержащий класс драйвера JDBC, просто не помещается в путь к классам.

    Обратите внимание, что вам не нужно загружать драйвер каждый раз перед подключением. Только один раз во время запуска приложения достаточно.

    Если вы получаете SQLException: Connection refused или Connection timed out или специфический для MySQL CommunicationsException: Communications link failure, то это означает, что БД недоступно. Это может иметь одну или несколько следующих причин:

    • Неверный IP-адрес или имя хоста в URL-адрес JDBC.
    • Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.
    • Номер порта отсутствует или неверен в URL-адресе JDBC.
    • Сервер DB не работает.
    • Сервер DB не принимает соединения TCP/IP.
    • У сервера БД закончились соединения.
    • Что-то между Java и DB блокирует соединения, например. брандмауэр или прокси.

    Чтобы решить тот или иной, выполните следующие советы:

    • Проверьте и протестируйте их с помощью ping.
    • Обновите DNS или используйте IP-адрес в URL-адрес JDBC.
    • Проверьте его на основе my.cnf базы данных MySQL.
    • Запустите БД.
    • Убедитесь, что mysqld запущен без --skip-networking option.
    • Перезагрузите базу данных и исправьте свой код соответственно, чтобы он закрывал соединения в finally.
    • Отключите брандмауэр и/или настройте брандмауэр/прокси для разрешения/пересылки порта.

    Обратите внимание, что закрытие Connection имеет значение чрезвычайно. Если вы не закрываете соединения и не получаете их много за короткое время, тогда в базе данных могут отсутствовать соединения, и ваше приложение может сломаться. Всегда приобретайте Connection в try-with-resources statement. Или, если вы еще не на Java 7, явно закройте его в finally блока try-finally. Закрытие в finally заключается в том, чтобы обеспечить закрытие, а также в случае исключения. Это также относится к Statement, PreparedStatement и ResultSet.

Это было так далеко, что касается подключения. Вы можете найти здесь более продвинутое руководство по загрузке и хранению полнофункциональных объектов модели Java в базе данных с помощью базового класса DAO.


Использование шаблона Singleton для соединения с БД является плохим подходом. См. Также другие вопросы: https://stackoverflow.com/questions/9428573/is-it-safe-to-use-a-static-java-sql-connection-instance-in-a-multithreaded-syste. Это ошибка первого запуска.

22

Инициализировать константы базы данных

Создать постоянное имя базы данных, имя пользователя, пароль, URL и драйверы, лимит опроса и т.д.

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

Инициализировать соединение и свойства

Как только соединение будет установлено, его лучше сохранить для повторного использования.

// 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) {
            // Java 7+
            e.printStackTrace();
        }
    }
    return connection;
}

Отключить базу данных

Как только вы закончите работу с базой данных, просто закройте соединение.

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

Все вместе

Используйте этот класс MysqlConnect непосредственно после изменения имени_базы, имени пользователя и пароля и т.д.

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

Как использовать?

Инициализировать класс базы данных.

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

Где-то еще в вашем коде...

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

Это все :) Если что-то улучшить, отредактируйте его! Надеюсь, что это будет полезно.

  • 0
    Марк, каждый класс должен постоянно поддерживать свой отдельный экземпляр MysqlConnect открытым - при условии, что им нужно взаимодействовать с данными? Мне просто интересно, как эта установка работает между классами.
  • 0
    вместо com.mysql.jdbc.Driver этот jdbc:mysql://localhost:3306/stocks должен использоваться, поскольку первый устарел.
18
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
    какая ваша база данных здесь? имя базы данных?
  • 0
    newInstance () не является необходимым. Это?
10

Здесь минимально необходимо получить данные из базы данных 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();

Добавьте обработку исключений, конфигурацию и т.д..

  • 2
    зачем вам Class.forName(...).newInstance() ?
  • 2
    @mmcrae Вы не с 2007 года.
2

Короткие и слабые коды.

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

Для 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();
    }
2

Вы можете увидеть все шаги для подключения базы данных MySQL из приложения Java здесь. Для другой базы данных вам просто нужно изменить драйвер только на первом шаге. Убедитесь, что вы предоставили правильный путь к базе данных и исправли имя пользователя и пароль.

Посетите http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA

1

Соединение с MySQL JDBC с использованиемSSL.

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

Connection Я использовал некоторое время назад, это выглядело как самый простой способ, но также были рекомендации сделать там if statement-exact

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

Или что-то вроде этого:)

Вероятно, есть какой-то случай, а getConnection может возвращать null:)

1

вам нужно иметь jar-соединитель mysql в вашем пути к классам.

в Java JDBC API делает все с базами данных. с помощью JDBC мы можем писать Java-приложения на
1. Отправлять запросы или обновлять SQL до DB (любая реляционная база данных) 2. Получить и обработать результаты из 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");
}
0

Сокращенный код

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

Соединение с MySql JDBC:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню