繁体   English   中英

将 Java 连接到 MySQL 数据库

[英]Connect Java to a MySQL database

你如何连接到 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

以下是如何安装 MySQL 和 JDBC 以及如何使用它的分步说明:

  1. 下载并安装 MySQL 服务器 只需按照通常的方式进行即可。 更改端口号时请记住它。 默认为3306

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

    如果您使用的是 Eclipse 或 Netbeans 之类的 IDE,则可以通过将 JAR 文件作为添加到项目属性中的构建路径来将其添加到类路径中。

    如果您在命令控制台中执行“plain vanilla”,则需要在执行 Java 应用程序时在-cp-classpath参数中指定 JAR 文件的路径。

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

    . 只是在那里将当前目录添加到类路径中,以便它可以找到com.example.YourClass; 是 Windows 中的类路径分隔符。 在 Unix 和克隆:中应该使用。

  3. 在 MySQL 中创建一个数据库 让我们创建一个数据库javabase 你当然想要 World Domination,所以让我们也使用 UTF-8。

     CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. 为 Java创建一个用户授予它访问权限 仅仅因为使用root是一种不好的做法。

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

    是的, java是用户名, password是这里的密码。

  5. 确定JDBC URL 要使用 Java 连接 MySQL 数据库,您需要使用以下语法的 JDBC URL:

      jdbc:mysql://主机名:端口/数据库名
    • hostname :安装 MySQL 服务器的主机名。 如果它安装在您运行 Java 代码的同一台机器上,那么您可以只使用localhost 它也可以是 IP 地址,例如127.0.0.1 如果您遇到连接问题并且使用127.0.0.1而不是localhost解决了它,那么您的 network/DNS/hosts 配置中存在问题。

    • port : MySQL 服务器监听的 TCP/IP 端口。 这是默认的3306

    • databasename :您要连接的数据库的名称。 那是javabase

    所以最终的 URL 应该是这样的:

      jdbc:mysql://localhost:3306/javabase
  6. 使用 Java 测试与 MySQL 的连接 使用main()方法创建一个简单的 Java 类来测试连接。

     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()调用。 这只是为了修复旧的和错误的org.gjt.mm.mysql.Driver 在这里解释 如果该行抛出ClassNotFoundException ,则包含 JDBC 驱动程序类的 JAR 文件根本没有放在类路径中。

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

    如果您收到SQLException: Connection refusedConnection timed out或 MySQL 特定CommunicationsException: Communications link failure ,则表示根本无法访问数据库。 这可能有以下一种或多种原因:

    1. JDBC URL 中的 IP 地址或主机名错误。
    2. 本地 DNS 服务器无法识别 JDBC URL 中的主机名。
    3. JDBC URL 中的端口号缺失或错误。
    4. 数据库服务器已关闭。
    5. 数据库服务器不接受 TCP/IP 连接。
    6. 数据库服务器已用完连接。
    7. Java 和 DB 之间的某些东西正在阻止连接,例如防火墙或代理。

    要解决其中一个问题,请遵循以下建议:

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

    请注意,关闭Connection非常重要。 如果您不关闭连接并在短时间内保持大量连接,那么数据库可能会耗尽连接并且您的应用程序可能会中断。 始终在try-with-resources语句中获取Connection 或者,如果您还没有使用 Java 7,请在try-finally块的finally中显式关闭它。 finally关闭只是为了确保它在出现异常时也被关闭。 这也适用于StatementPreparedStatementResultSet

这就是连接问题。 您可以在此处找到更高级的教程,如何借助基本 DAO 类在数据库中加载和存储完全有价值的 Java 模型对象。


对数据库连接使用单例模式是一种不好的方法。 请参阅其他问题: http ://stackoverflow.com/q/9428573/。 这是#1首发错误。

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

初始化数据库常量

创建常量属性数据库用户名、密码、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();
}

这就是全部:)如果有什么要改进的编辑它! 希望这会有所帮助。

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 连接器 jar。

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

简短而甜蜜的代码。

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

使用 useSSL 的 MySQL JDBC 连接。

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

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

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

我前段时间使用的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

方法一:设置CLASSPATH变量。

 export CLASSPATH=".:mysql-connector-java-VERSION.jar" java MyClassFile

在上面的命令中,我将 CLASSPATH 设置为当前文件夹和 mysql-connector-java-VERSION.jar 文件。 因此当java MyClassFile命令执行时,java 应用程序启动器将尝试加载 CLASSPATH 中的所有 Java 类。 它发现Drive类 => BOOM 错误消失了。

方法二:

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

注:Class.forName("com.mysql.jdbc.Driver"); 2019 年 4 月此时已弃用此功能。

希望这可以帮助某人!

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

短代码

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

下载 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

测试MySQL.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);
        }

    }  

}

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM