将Java连接到MySQL数据库
你如何连接到Java中的MySQL数据库?
DriverManager
是一个相当古老的做事方式。 更好的方法是获得一个DataSource
,通过查看一个你的应用服务器容器已经为你configuration:
Context context = new InitialContext(); DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");
或直接从数据库驱动程序实例化和configuration一个:
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();
以下是一步一步解释如何安装MySQL和JDBC以及如何使用它:
-
下载并安装MySQL服务器 。 只要按照惯常的方式去做 记住端口号,每当你改变它。 这是默认的
3306
。 -
下载 JDBC驱动程序并放入类path中 ,解压缩ZIP文件并将包含的JAR文件放入类path中。 供应商特定的JDBC驱动程序是JDBC API的具体实现( 教程在这里 )。
如果您使用的是像Eclipse或Netbeans这样的IDE,那么可以通过将JAR文件作为库添加到项目属性中的“ 生成path”中,将其添加到类path中。
如果您在命令控制台中使用“plain vanilla”,则需要在执行Java应用程序时在
-cp
或-classpath
参数中指定JAR文件的path。java -cp。; / path / to / mysql-connector.jar com.example.YourClass
的
.
只是在那里添加当前目录到类path,以便它可以findcom.example.YourClass
和;
是Windows中的类path分隔符。 在Unix和克隆:
应该使用。 -
在MySQL中创build一个数据库 。 我们来创build一个数据库
javabase
。 你当然想要World Domination,所以我们也使用UTF-8。CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
为Java 创build一个用户并授予其访问权限 。 只是因为使用
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
。 它也可以是一个像127.0.0.1
这样的IP地址。 如果您遇到连接问题,并使用127.0.0.1
而不是localhost
解决它,那么你的networking/ DNS /主机configuration有问题。 -
port
:MySQL服务器侦听的TCP / IP端口。 这是默认的3306
。 -
databasename
:你想连接的数据库的名称。 这是javabase
。
所以最终的url应该如下所示:
JDBC:MySQL的://本地主机:3306 / javabase
-
-
使用Java testing与 MySQL 的连接 。 使用
main()
方法创build一个简单的Java类来testing连接。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驱动程序应当在运行时类path中放置时自动加载。 要排除一个和其他,你可以随时手动加载它如下: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文件根本就不在类path中。请注意, 在连接之前 ,您无需每次加载驱动程序。 在应用程序启动时只有一次就足够了。
如果您遇到
SQLException: Connection refused
或Connection timed out
或MySQL特定的CommunicationsException: Communications link failure
,则意味着数据库根本无法访问。 这可能有一个或多个以下原因:- JDBC URL中的IP地址或主机名是错误的。
- 本地DNS服务器无法识别JDBC URL中的主机名。
- JDBC URL中缺less端口号或错误。
- 数据库服务器已closures。
- 数据库服务器不接受TCP / IP连接。
- 数据库服务器已经用完了连接。
- Java和DB之间的东西阻塞连接,例如防火墙或代理。
要解决这个或那个问题,请遵循以下build议:
- 使用
ping
validation并testing它们。 - 刷新DNS或使用JDBC URL中的IP地址。
- 根据
my.cnf
validation。 - 启动数据库。
- validationmysqld是否在没有
--skip-networking option
情况下启动。 - 重新启动数据库,并相应地修复你的代码,最终closures连接。
- 禁用防火墙和/或configuration防火墙/代理以允许/转发端口。
请注意,closures
Connection
非常重要。 如果您不closures连接并在短时间内保持连接状态,那么数据库可能会耗尽连接,并且您的应用程序可能会中断。 始终在“try-with-resources
语句中获取“Connection
。 或者如果你还没有使用Java 7,那么finally
在try-finally
块中明确地closures它。finally
closures只是为了确保它closures,以及在发生exception的情况下。 这也适用于Statement
,PreparedStatement
和ResultSet
。
这就是连通性问题。 你可以在这里find一个更高级的教程,在基本的DAO类的帮助下,如何在数据库中加载和存储完整的Java模型对象。
使用单例模式进行数据库连接是一个不好的方法。 请参阅其他问题: http : //stackoverflow.com/q/9428573/ 。 这是一个首发的错误。
初始化数据库常量
创build常量属性数据库用户名,密码,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
初始化连接和属性
一旦build立连接,最好存储为重用目的。
// init connection object private Connection connection; // init properties object private Properties properties;
创build属性
属性对象保存连接信息,检查是否已经设置。
// 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; }
断开数据库
一旦完成数据库操作,只需closures连接即可。
// 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.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();
添加exception处理,configuration等。
简短和甜蜜的代码。
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 Server 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(); }
你可以在这里看到从Java应用程序连接MySQL数据库的所有步骤。 对于其他数据库,只需要在第一步中更改驱动程序。 请确保您提供正确的数据库path和正确的用户名和密码。
访问http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA
你需要在你的classpath中有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"); }
我之前使用的Connection
,它看起来像最简单的方法,但也有build议, if
声明 – 确切地说
Connection con = DriverManager.getConnection( "jdbc:myDriver:DatabaseName", dBuserName, dBuserPassword); if (con != null){ //..handle your code there }
或者像这样的东西:)
可能有一些情况,而getConnection
可以返回null
🙂
与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); }
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; } }