连接Java到MySQL数据库

如何在Java中连接MySQL数据库?

当我尝试时,我得到

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
724753 次浏览
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();

添加异常处理、配置等。

DriverManager是一种相当古老的做事方式。更好的方法是获取一个DataSource,或者通过查找你的应用服务器容器已经为你配置的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以及如何使用它的一步一步的解释:

  1. 下载并安装MySQL服务器。按平常的方法做就行了。当您更改端口号时,请记住它。默认为3306

  2. 下载 JDBC驱动程序并放入classpath,解压ZIP文件并将包含JAR文件放入类路径中。特定于供应商的JDBC驱动程序是JDBC API (这里的教程)的具体实现。

    如果你使用的是Eclipse或Netbeans这样的IDE,那么你可以通过将JAR文件作为图书馆添加到项目属性中的构建路径中来将它添加到类路径中。

    如果你在命令控制台中“简单地”执行,那么在执行Java应用程序时,你需要在-cp-classpath参数中指定JAR文件的路径。

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

    The . is just there to add the current directory to the classpath as well so that it can locate com.example.YourClass and the ; is the classpath separator as it is in Windows. In Unix and clones : should be used.

  3. Create a database in MySQL. Let's create a database javabase. You of course want World Domination, so let's use UTF-8 as well.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    
  4. Create an user for Java and grant it access. Simply because using root is a bad practice.

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

    是的,java是用户名,password是密码

  5. < p > 确定 JDBC URL。要使用Java连接MySQL数据库,你需要一个JDBC URL,语法如下:

    jdbc:mysql://hostname:port/databasename
    • hostname: The hostname where MySQL server is installed. If it's installed at the same machine where you run the Java code, then you can just use localhost. It can also be an IP address like 127.0.0.1. If you encounter connectivity problems and using 127.0.0.1 instead of localhost solved it, then you've a problem in your network/DNS/hosts config.

    • port: The TCP/IP port where MySQL server listens on. This is by default 3306.

    • databasename: The name of the database you'd like to connect to. That's javabase.

    So the final URL should look like:

    jdbc:mysql://localhost:3306/javabase
  6. Test the connection to MySQL using Java. Create a simple Java class with a main() method to test the connection.

    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驱动程序根本没有自动加载,要么JDBC URL是错误的(即它没有被任何加载的驱动程序识别)。通常,当您将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()调用。它只是修复旧的和有bug的org.gjt.mm.mysql.Driver这里的解释。如果这一行抛出ClassNotFoundException,那么包含JDBC驱动程序类的JAR文件根本没有被放在类路径中。

    注意,你不需要加载驱动程序每次 之前连接。在应用程序启动期间只需一次就足够了。

    如果你得到一个SQLException: Connection refusedConnection timed out或MySQL特定的CommunicationsException: 通信链路故障,则意味着数据库根本不可达。这可能有以下一个或多个原因:

    1. JDBC URL中的IP地址或主机名错误。
    2. 本地DNS服务器无法识别JDBC URL中的主机名。
    3. JDBC URL中端口号缺失或错误。
    4. DB服务器故障。
    5. DB服务器不接受TCP/IP连接。
    6. 数据库服务器连接不足。
    7. Java和DB之间的某些东西阻塞了连接,例如防火墙或代理。
      < br >

    要解决这两个问题,请遵循以下建议:

    1. ping验证并测试它们。
    2. 刷新DNS或在JDBC URL中使用IP地址。
    3. 根据MySQL DB的my.cnf进行验证。
    4. 启动DB。
    5. 验证mysqld是否在没有--skip-networking option的情况下启动。
    6. 重新启动DB并相应地修复代码,使其关闭finally中的连接。
    7. 关闭防火墙和/或配置防火墙/代理允许/转发端口。
      < br >

    注意,关闭Connection很重要。如果您不关闭连接,而是在短时间内不断获得大量连接,那么数据库可能会耗尽连接,应用程序可能会崩溃。总是在Connection0中获取Connection。或者如果你还没有使用Java 7,在try-finally块的finally中显式地关闭它。关闭finally只是为了确保它在异常情况下也被关闭。这也适用于StatementPreparedStatementResultSet

就连通性而言,这就是问题所在。你可以找到在这里一个更高级的教程,如何在基本DAO类的帮助下在数据库中加载和存储完全有价值的Java模型对象。


对DB连接使用单例模式是一种糟糕的方法。参见其他问题:http://stackoverflow.com/q/9428573/。这是第一个错误。

你可以看到从Java应用程序在这里连接MySQL数据库的所有步骤。对于其他数据库,您只需要在第一步更改驱动程序。请确保您提供正确的数据库路径和正确的用户名和密码。

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

你需要在你的类路径中有mysql连接器jar。

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

Connection是我之前使用的,它看起来是最简单的方法,但也有建议使用if语句-完全正确

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

或者类似的方式:)

可能在某些情况下,而getConnection可以返回null:)

初始化数据库常量

创建常量属性数据库用户名,密码,URL和驱动程序,轮询限制等。

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

初始化连接和属性

一旦建立了连接,最好将其存储起来以供重用。

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

一切都在一起

在修改database_name、用户名和密码等之后直接使用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.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();
}
}
}
}

如何使用?

初始化数据库类。

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

这是所有:)如果有任何改进编辑它!希望这对你有帮助。

简短而甜蜜的代码。

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

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

短代码

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;
}
}
如何
  • 设置驱动程序以运行快速示例
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应用程序启动器将尝试加载CLASSPATH中的所有java类。 并且它发现Drive class => BOOM错误已经消失

方法2:

java -cp .:mysql-connector-java-VERSION.jar MyClassFile

注意:forname(“com.mysql.jdbc.Driver”);目前已弃用2019年4月1日。

希望这能帮助到一些人!

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


}


}

enter image description here