[英]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 以及如何使用它的分步说明:
下载并安装 MySQL 服务器。 只需按照通常的方式进行即可。 更改端口号时请记住它。 默认为3306
。
下载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 和克隆:
中应该使用。
在 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
是这里的密码。
确定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
使用 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 refused
或Connection timed out
或 MySQL 特定CommunicationsException: Communications link failure
,则表示根本无法访问数据库。 这可能有以下一种或多种原因:
要解决其中一个问题,请遵循以下建议:
ping
验证和测试它们。my.cnf
进行验证。--skip-networking option
的情况下启动。finally
中关闭连接。 请注意,关闭Connection
非常重要。 如果您不关闭连接并在短时间内保持大量连接,那么数据库可能会耗尽连接并且您的应用程序可能会中断。 始终在try-with-resources
语句中获取Connection
。 或者,如果您还没有使用 Java 7,请在try-finally
块的finally
中显式关闭它。 finally
关闭只是为了确保它在出现异常时也被关闭。 这也适用于Statement
、 PreparedStatement
和ResultSet
。
这就是连接问题。 您可以在此处找到更高级的教程,如何借助基本 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变量。
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.