Подключите Java к базе данных MySQL
Как вы подключаетесь к базе данных MySQL на Java?
Когда я пытаюсь, я получаю
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)
Или же
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
Или же
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
12 ответов
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();
Вот пошаговое объяснение, как установить MySQL и JDBC и как их использовать:
Загрузите и установите сервер MySQL. Просто сделай это обычным способом. Помните номер порта всякий раз, когда вы его изменили. Это по умолчанию
3306
,Загрузите драйвер JDBC и поместите в classpath, извлеките ZIP-файл и поместите содержащий JAR-файл в classpath. Драйвер JDBC для конкретного поставщика - это конкретная реализация API JDBC ( руководство здесь).
Если вы используете IDE, например Eclipse или Netbeans, вы можете добавить его в путь к классам, добавив файл JAR в качестве библиотеки в путь сборки в свойствах проекта.
Если вы делаете это "простой ваниль" в командной консоли, то вам нужно указать путь к файлу JAR в
-cp
или же-classpath
аргумент при выполнении вашего Java-приложения.java -cp.; / path / to / mysql-connector.jar com.example.YourClass
.
просто добавить текущий каталог в classpath, чтобы он мог найтиcom.example.YourClass
и;
является разделителем пути к классам, как в Windows. В Unix и клонах:
должен быть использован.Создайте базу данных в MySQL. Давайте создадим базу данных
javabase
, Вы, конечно же, хотите World Domination, поэтому давайте также использовать UTF-8.CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Создайте пользователя для Java и предоставьте ему доступ. Просто потому что используя
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
: Имя хоста, на котором установлен сервер MySQL. Если он установлен на той же машине, где вы запускаете код Java, вы можете просто использоватьlocalhost
, Это также может быть IP-адрес, такой как127.0.0.1
, Если вы столкнулись с проблемами подключения и использования127.0.0.1
вместоlocalhost
решил, значит, у вас проблема в конфигурации вашей сети /DNS/hosts.port
: Порт TCP/IP, на котором сервер MySQL прослушивает. Это по умолчанию3306
,databasename
: Имя базы данных, к которой вы хотите подключиться. Этоjavabase
,
Таким образом, окончательный URL должен выглядеть так:
JDBC: MySQL: // локальный: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
или специфичный для MySQLCommunicationsException: Communications link failure
, то это означает, что БД вообще недоступна. Это может иметь одну или несколько из следующих причин:- IP-адрес или имя хоста в URL JDBC неверны.
- Имя хоста в URL JDBC не распознается локальным DNS-сервером.
- Номер порта отсутствует или неверен в URL JDBC.
- Сервер БД не работает.
- Сервер БД не принимает соединения TCP/IP.
- На сервере БД закончились соединения.
- Что-то среднее между Java и DB блокирует соединения, например, брандмауэр или прокси.
Чтобы решить один или другой, следуйте следующим советам:
- Проверьте и протестируйте их
ping
, - Обновите DNS или используйте IP-адрес в URL JDBC.
- Проверьте это на основе
my.cnf
БД MySQL. - Запустите БД.
- Проверьте, запущен ли mysqld без
--skip-networking option
, - Перезапустите БД и исправьте ваш код соответственно, чтобы он закрывал соединения в
finally
, - Отключите брандмауэр и / или настройте брандмауэр / прокси для разрешения / переадресации порта.
Обратите внимание, что закрытие
Connection
это чрезвычайно важно. Если вы не закрываете соединения и продолжаете получать их в течение короткого времени, то в базе данных могут не хватить соединений, и ваше приложение может разорваться. Всегда приобретайтеConnection
вtry-with-resources
заявление. Или, если вы еще не на Java 7, явно закройте его вfinally
изtry-finally
блок. Приближениеfinally
просто, чтобы гарантировать, что это закрыто также в случае исключения. Это также относится кStatement
,PreparedStatement
а такжеResultSet
,
Это было то, что касается возможности подключения. Вы можете найти здесь более продвинутый учебник, как загружать и хранить полноценные объекты модели Java в базе данных с помощью базового класса DAO.
Использование шаблона Singleton для подключения к БД - плохой подход. Смотрите среди других вопросов: /questions/41523016/bezopasno-li-ispolzovat-staticheskij-ekzemplyar-javasqlconnection-v-mnogopotochnoj-sisteme. Это ошибка № 1 для начинающих.
Инициализируйте константы базы данных
Создать постоянную базу данных свойств, имя пользователя, пароль, 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 `stackru`";
try {
PreparedStatement statement = mysqlConnect.connect().prepareStatement(sql);
... go on ...
... go on ...
... DONE ....
} catch (SQLException e) {
e.printStackTrace();
} finally {
mysqlConnect.disconnect();
}
Это все :) Если что-то улучшить, отредактируйте его! Надеюсь, это полезно.
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);
Вот тот минимум, который вам нужен для получения данных из базы данных 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();
Добавьте обработку исключений, настройку и т.д. по вкусу.
MySQL JDBC Соединение с 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);
}
Короткий и сладкий код.
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();
}
Вы можете увидеть все шаги для подключения базы данных MySQL из приложения Java здесь. Для другой базы данных вам просто нужно изменить драйвер только на первом этапе. Пожалуйста, убедитесь, что вы указали правильный путь к базе данных и правильное имя пользователя и пароль.
Посетите http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA
У вас должен быть jar соединителя mysql в вашем classpath.
в Java JDBC API делает все с базами данных. используя JDBC, мы можем писать приложения на Java
1. Отправлять запросы или обновлять SQL в БД (любую реляционную базу данных). 2. Извлекать и обрабатывать результаты из БД.
ниже трех шагов мы можем получить данные из любой базы данных
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");
}
Connection
Я использовал некоторое время назад, это выглядело как самый простой способ, но также была рекомендация сделать там if
Точно
Connection con = DriverManager.getConnection(
"jdbc:myDriver:DatabaseName",
dBuserName,
dBuserPassword);
if (con != null){
//..handle your code there
}
Или как-то так:)
Вероятно, есть какой-то случай, пока getConnection
может вернуться null
:)
- Чтобы настроить драйвер для запуска быстрого образца
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
- Чтобы настроить CLASSPATH
Метод 1: установите переменную CLASSPATH.
export CLASSPATH=".:mysql-connector-java-VERSION.jar"
java MyClassFile
В приведенной выше команде я установил CLASSPATH для текущей папки и файла mysql-connector-java-VERSION.jar. Итак, когдаjava MyClassFile
команда выполнена, средство запуска Java-приложения попытается загрузить весь класс Java в CLASSPATH. И он нашелDrive
class => Ошибки BOOM исчезли.
Способ 2:
java -cp .:mysql-connector-java-VERSION.jar MyClassFile
Примечание. Class.forName("com.mysql.jdbc.Driver"); На данный момент это не рекомендуется. 2019 апр.
Надеюсь, это кому-то поможет!
Загрузить драйвер JDBC
Ссылка для скачивания (выберите платформу независимо): https://dev.mysql.com/downloads/connector/j/
Переместить драйвер JDBC на диск C
Разархивируйте файлы и перейдите на диск C:\. Ваш путь к драйверу должен быть такимC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19
Запустите 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);
}
}
}
Короткий номер
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;
}
}
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");