php小编香蕉为您带来关于将Java连接到MySQL数据库的专题问答。本文将为您解答如何在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
数据源
drivermanager
是一种相当古老的做事方式。更好的方法是获取 DataSource
对象。可以使用 JNDI 查找已为您配置的应用服务器容器:
context context = new initialcontext(); datasource datasource = (datasource) context.lookup("java:comp/env/jdbc/mydb");
…或者直接从数据库驱动程序实例化和配置一个,例如 com.mysql.cj.jdbc.mysqldatasource
(see documentation):
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();
在现代 java 中,使用 try-with-resources 语法自动关闭 jdbc 资源(现在为 AutoCloseable
)。
try ( connection conn = datasource.getconnection(); statement stmt = conn.createstatement(); resultset rs = stmt.executequery("select id from users"); ) { … }
以下是如何安装 mysql 和 jdbc 以及如何使用它的分步说明:
Download并安装mysql服务器。按照通常的方式做就可以了。每当您更改端口号时,请记住它。默认为 3306
。
Download jdbc 驱动程序并放入类路径,解压 zip 文件并将包含的 jar 文件放入类路径中。特定于供应商的 jdbc 驱动程序是 JDBC API (tutorial here) 的具体实现。
如果您使用的是 eclipse 或 netbeans 等 ide,则可以通过将 jar 文件作为库添加到项目中的构建路径,将其添加到类路径中属性。
如果您在命令控制台中以“普通”方式执行此操作,则需要在执行 java 应用程序时在 -cp
或 -classpath
参数中指定 jar 文件的路径。
java -cp .;/path/to/mysql-connector.jar com.example.yourclass
.
只是将当前目录添加到类路径中,以便它可以找到 com.example.yourclass
和 ;
是类路径分隔符,因为它在视窗。在 unix 和克隆中,应使用 :
。
如果您正在开发基于 servlet 的 war 应用程序,并希望手动管理连接(实际上,这种做法很糟糕),那么您需要确保 jar 最终位于构建的 /web-inf/lib
中。另请参见 How to add JAR libraries to WAR project without facing java.lang.ClassNotFoundException? Classpath vs Build Path vs /WEB-INF/lib。更好的做法是在服务器本身中安装物理 jdbc 驱动程序 jar 文件,并配置服务器以创建 jdbc 连接池。以下是 tomcat 的示例:How should I connect to JDBC database / datasource in a servlet based application?
在 mysql 中创建 database。让我们创建一个数据库javabase
。您当然想要统治世界,所以我们也使用 utf-8。
create database javabase default character set utf8 collate utf8_unicode_ci;
java 访问 Create a user,它访问 grant。仅仅是因为使用 root
是一种不好的做法。
create user 'java'@'localhost' identified by 'password'; grant all on javabase.* to 'java'@'localhost' identified by 'password';
是的,这里 java
是用户名,password
是密码。
Determine 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
Test the connection 使用 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合适的驱动程序
,则意味着 jdbc 驱动程序根本没有自动加载,或者 jdbc url 错误(即,任何加载的驱动程序都无法识别它)。另请参见 The infamous java.sql.SQLException: No suitable driver found。通常,当您将 jdbc 4.0 驱动程序放入运行时类路径中时,应该会自动加载它。要排除其中一个或另一个,您可以随时手动加载它,如下所示:
System.out.println("Loading driver ..."); try { Class.forName("com.mysql.cj.jdbc.Driver"); // Use com.mysql.jdbc.Driver if you're not on MySQL 8+ yet. System.out.println("Driver loaded!"); } catch (ClassNotFoundException e) { throw new IllegalStateException("Cannot find the driver in the classpath!", e); }
请注意,此处不需要调用 newinstance()
。对于mysql,只是为了修复旧的且有缺陷的org.gjt.mm.mysql.driver
。 Explanation here。如果此行抛出 classnotfoundexception
,则说明包含 jdbc 驱动程序类的 jar 文件根本没有放置在类路径中。另请注意,抛出异常非常重要,以便立即阻止代码执行,而不是仅仅打印堆栈跟踪然后继续执行其余代码来抑制它。
另请注意,您不需要每次在连接之前加载驱动程序。只需在应用程序启动期间一次就足够了。
如果您收到 sqlexception: 连接被拒绝
或 connection timed out
或 mysql 特定的 communicationsexception: 通信链路故障
,则意味着数据库根本无法访问。这可能由以下一个或多个原因造成:
要解决其中一个问题,请遵循以下建议:
ping
验证并测试它们。my.cnf
进行验证。--skip-networking 选项
的情况下启动。finally
中的连接。请注意,关闭 connection
极其非常重要。如果您不关闭连接并在短时间内不断获取大量连接,那么数据库可能会耗尽连接,并且您的应用程序可能会崩溃。始终获取 try-with-resources
statement 中的 connection
。这也适用于 statement
、preparedstatement
和 resultset
。另见How often should Connection, Statement and ResultSet be closed in JDBC?
这就是连接问题。您可以在 here 找到更高级的教程,了解如何借助基本 dao 类在数据库中加载和存储完整的 java 模型对象。
对数据库 connection
使用单例模式和/或 static
变量是一种不好的做法。参见其他 Is it safe to use a static java.sql.Connection instance in a multithreaded system? 这是第一个初学者错误。确保您不会落入这个陷阱。
以上是将 Java 连接到 MySQL 数据库的详细内容。更多信息请关注PHP中文网其他相关文章!