将Java连接到MySQL数据库

abs*_*son 309 java mysql jdbc

你如何用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)
Run Code Online (Sandbox Code Playgroud)

要么

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
Run Code Online (Sandbox Code Playgroud)

要么

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 461

这是一步一步解释如何安装MySQL和JDBC以及如何使用它:

  1. 下载并安装MySQL服务器.按照通常的方式做到这一点.无论何时更改端口号,请记住端口号.这是默认情况3306.

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

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

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

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

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

  3. 在MySQL中创建一个数据库.我们来创建一个数据库javabase.你当然想要世界统治,所以让我们也使用UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 为Java 创建用户授予其访问权限.仅仅因为使用root是一种不好的做法.

    CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    jdbc:mysql://hostname:port/databasename
    • hostname:安装MySQL服务器的主机名.如果它安装在您运行Java代码的同一台机器上,那么您可以使用它localhost.它也可以是一个IP地址127.0.0.1.如果您遇到连接问题并使用127.0.0.1而不是localhost解决它,那么您的网络/ DNS /主机配置中存在问题.

    • 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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果你得到了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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    需要注意的是,newInstance()在呼叫在这里需要.它只是修复旧的和马车org.gjt.mm.mysql.Driver.这里解释.如果此行抛出ClassNotFoundException,则包含JDBC驱动程序类的JAR文件根本没有放在类路径中.

    请注意,您不需要连接之前每次都 加载驱动程序.在应用程序启动期间只需一次即可.

    如果您获得SQLException: Connection refusedConnection timed out特定于MySQL CommunicationsException: Communications link failure,则意味着DB根本无法访问.这可能有以下一个或多个原因:

    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. 根据my.cnfMySQL DB 验证它.
    4. 启动数据库.
    5. 验证mysqld是否在没有启动的情况下启动--skip-networking option.
    6. 重新启动数据库并相应地修改代码以关闭连接finally.
    7. 禁用防火墙和/或配置防火墙/代理以允许/转发端口.

    请注意,关闭Connection非常重要.如果您没有关闭连接并在短时间内继续获取大量连接,那么数据库可能会用完连接而您的应用程序可能会中断.始终Connectiontry-with-resources声明中获得.或者,如果你对Java 7的是没有,明确地关闭它在finally一个的try-finally块.关闭finally只是为了确保它在异常的情况下也会关闭.这也适用于Statement,PreparedStatementResultSet.

就连接问题而言,这就是它.您可以在这里找到一个更高级的教程,如何借助基本的DAO类在数据库中加载和存储完整的Java模型对象.


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


Sea*_*wen 200

DriverManager是一种相当古老的做事方式.更好的方法是DataSource通过查找已经为您配置的app服务器容器来获取a :

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

或直接从数据库驱动程序实例化和配置一个:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");
Run Code Online (Sandbox Code Playgroud)

然后从上面获取连接,如上所述:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是旧式的Driver类,它与旧式驱动程序机制一起使用.`MysqlDataSource`实现了`javax.sql.DataSource`这是更新的机制. (7认同)
  • 也许你应该添加dataSource.setDatabaseName("database"). (3认同)
  • 显式地 close() 是一个很好的做法,尽管它需要更多的代码。任何好的实现都必须在连接关闭时关闭资源,是的。考虑您想要重用语句或连接的其他上下文。在 Java 7 的 try-with-resources 中,您无论如何都可以免费获得此行为: (2认同)

Mad*_*ota 38

初始化数据库常量

创建常量属性数据库用户名,密码,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
Run Code Online (Sandbox Code Playgroud)

初始化连接和属性

建立连接后,最好存储以便重复使用.

// init connection object
private Connection connection;
// init properties object
private Properties properties;
Run Code Online (Sandbox Code Playgroud)

创建属性

属性对象保存连接信息,检查它是否已设置.

// 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;
}
Run Code Online (Sandbox Code Playgroud)

连接数据库

现在使用初始化的常量和属性连接到数据库.

// 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;
}
Run Code Online (Sandbox Code Playgroud)

断开数据库连接

完成数据库操作后,只需关闭连接即可.

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

一切都在一起

MysqlConnect更改database_name,用户名和密码等后直接使用此类.

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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用?

初始化数据库类.

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

你代码中的其他地方......

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();
}
Run Code Online (Sandbox Code Playgroud)

这都是:)如果有什么需要改进编辑它!希望这是有帮助的.


hef*_*ump 24

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);
Run Code Online (Sandbox Code Playgroud)


Kil*_*oth 13

这是从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();
Run Code Online (Sandbox Code Playgroud)

添加异常处理,配置等.

  • 为什么你需要`Class.forName(...).newInstance()`? (3认同)
  • @mmcrae自2007年以来,你没有. (3认同)

归档时间:

查看次数:

552413 次

最近记录:

6 年,4 月 前