从Linux上的NetBeans(Mageia)中的Java应用程序连接到MariaDB

我试图通过一个简单的Java应用程序连接到Mariadb中的数据库,但连接被告知不成功并抛出exception。 我使用mysql做了类似的连接,它工作正常。 问题可能出在这里的司机。

try{ Class.forName("org.mariadb.jdbc.Driver"); Connection connection = DriverManager.getConnection( "jdbc:mariadb://localhost:3306/project", "root", ""); Statement statement = connection.createStatement(); String uname="xyz",pass="abc"; statement.executeUpdate("insert into user values('"+uname+"','"+pass+"')");}//end of try block 

我查找了互联网寻求帮助,并且由MariaDB Client Library for Java Applications提供的驱动程序类不是com.mysql.jdbc.Driver而是org.mariadb.jdbc.Driver! 我相应地改变了它,但似乎问题在于try块内的第一行。 驱动程序根本没有加载。 另外,我已经将mysql jar文件添加到我的java应用程序的库中,如下面的屏幕截图所示。 请帮我解决这个问题。 在此处输入图像描述

您似乎正在尝试使用jdbc:mariadb://...使用MySQL JDBC驱动程序建立与MariaDB服务器实例的连接。 这可能不起作用,因为MySQL JDBC驱动程序将使用jdbc:mysql://... ,无论它是连接到MySQL服务器还是MariaDB服务器。 也就是说,连接字符串必须与正在使用的驱动程序 (而不是正在访问的数据库服务器)匹配。

MySQL和MariaDB驱动程序应该是可以互换的,但在访问MariaDB服务器时使用MariaDB连接器似乎是谨慎的。 对于它的价值, mariadb-java-client-1.1.7.jar

projectProperties.png

 Connection con = DriverManager.getConnection( "jdbc:mariadb://localhost/project", "root", "whatever"); 

为我工作。 我从这里下载了MariaDB Client Library for Java:

https://downloads.mariadb.org/client-java/1.1.7/

我通过它到达

https://downloads.mariadb.org/

补充笔记:

  1. Java代码中不需要Class.forName()语句。

  2. Mageia下的MariaDB的默认配置可能包括/etc/my.cnfskip-networking指令。 如果要通过JDBC连接到数据库,则需要删除(或注释掉)该指令,因为JDBC连接始终看起来像是与MySQL / MariaDB的“网络”连接,即使它们是来自localhost连接。 (您可能需要将bind-address值调整为0.0.0.0类的值。)

另外需要注意:探索MariaDB JDBC驱动程序,我在url解析文件中找到了这个:

 Project: https://github.com/MariaDB/mariadb-connector-j.git File: src/main/java/org/mariadb/jdbc/UrlParser.java public static UrlParser parse(final String url, Properties prop) throws SQLException { .... if (url.startsWith("jdbc:mysql:")) { UrlParser urlParser = new UrlParser(); parseInternal(urlParser, url, prop); return urlParser; } else { if (url.startsWith("jdbc:mariadb:")) { UrlParser urlParser = new UrlParser(); parseInternal(urlParser, "jdbc:mysql:" + url.substring(13), prop); return urlParser; } } 

如您所见,字符串"jdbc:mariadb:"在内部始终替换为"jdbc:mysql:" 。 所以当谈到MariaDB驱动程序时,无论是:mariadb:还是:mysql:它总是被解析为"jdbc:mysql:"

没有不同。

 if (url.startsWith("jdbc:mariadb:")) { .... parseInternal(urlParser, "jdbc:mysql:" + url.substring(13), prop); ....