目錄
1. 問題背景
在學習Linux的過程中爲了鍛鍊英文水平, 我看了JDBC(Java DataBase Connectivity)的文檔, 發現一個很有意思的現象裏面的連接方式有一種我沒有用過也沒有見過, 但是用起來感覺很方便. 因爲很直白
jdbc:mysql://address=(host=localhost)(port=3306)(user=username)(password=yourpassword)/databse
# Or you can use 127.0.0.1 replace localhost
jdbc:mysql://address=(host=127.0.0.1)(port=3306)(user=username)(password=yourpassword)/databse
# And it is
jdbc:mysql://address=(key0=value0)(key1=value1)...(keyn=valuen)
# and there are more method to connect
# you can also use the following
jdbc:mysql://(host=127.0.0.1, port=3306, user=root, password=1324012)/database
jdbc:mysql://(key0=value0, key1=value1,...,keyN=valueN)/database
我感到非常有意思, 而且這種很方便, 通俗易懂, 於是我趕緊試了試
2. 測試鏈接
-
首先下載了mysql-connector-java-8.0.17
-
將jar加入到項目路徑Build Path中
-
依然是使用類加載創建對象
-
進行了測試, 都成功了
-
測試代碼如下
public static void main(String[] args) {
List<Stock> listStocks = new ArrayList<Stock>();
try {
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
// both of this two method can connect mysql successfully
// Connection conn = DriverManager.getConnection("jdbc:mysql://address=(host=127.0.0.1)(port=3306)(user=root)(password=123456)/practiceonly");
Connection conn = DriverManager.getConnection("jdbc:mysql://(host=127.0.0.1, port=3306, user=root, password=123456)/practiceonly");
System.out.println(conn);
PreparedStatement statement = conn.prepareStatement("SELECT * FROM stock");
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
String code = resultSet.getString(1);
String year = resultSet.getString(2);
String province = resultSet.getString(3);
String social = resultSet.getString(4);
String trust = resultSet.getString(5);
listStocks.add(new Stock(code, year, province, social, trust));
}
for (Stock stock : listStocks) {
System.out.println(stock);
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException e) {
e.printStackTrace();
}
}
## 其中Stock是我的測試數據庫對象類
測試完成之後教java的婁老師讓我試一下之前的版本(mysql5.x, 和JDBC5.x)可不可以
3. 切換mysql與MySQL-connector
3.1 mysql5 和 JDBC8
將我的MySQL換成了MySQL5版本, 然後使用剛剛的方式進行測試, 完全沒有問題,成功的進行了
3.2 MySQL5 和 JDBC5
將JDBC8換成JDBC5之後代碼在加載類的時候略有改動
ClassForname("com.mysql.jdbc.Driver").newInstance();
測試之後就出現了下面的錯誤
當我使用Connection conn = DriverManager.getConnection(“jdbc:mysql://address=(host=127.0.0.1)(port=3306)(user=root)(password=1324012)/pricticeonly”); 時, 錯誤是下面這種
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2266)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:323)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at practice.test.mysql.TestMysqlJDBC.main(TestMysqlJDBC.java:18)
Caused by: java.lang.NullPointerException
at com.mysql.jdbc.NonRegisteringDriver.parseHostPortPair(NonRegisteringDriver.java:199)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2167)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2220)
... 13 more
當我使用Connection conn = DriverManager.getConnection(“jdbc:mysql://(host=127.0.0.1, port=3306, user=root, password=1324012)/pricticeonly”); 這種方式時, 錯誤則是
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.GeneratedConstructorAccessor5.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:335)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2187)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2220)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2015)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:768)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
at com.mysql.jdbc.MultiHostConnectionProxy.createConnectionForHost(MultiHostConnectionProxy.java:345)
at com.mysql.jdbc.FailoverConnectionProxy.createConnectionForHostIndex(FailoverConnectionProxy.java:215)
at com.mysql.jdbc.FailoverConnectionProxy.connectTo(FailoverConnectionProxy.java:226)
at com.mysql.jdbc.FailoverConnectionProxy.failOver(FailoverConnectionProxy.java:292)
at com.mysql.jdbc.FailoverConnectionProxy.pickNewConnection(FailoverConnectionProxy.java:199)
at com.mysql.jdbc.FailoverConnectionProxy.<init>(FailoverConnectionProxy.java:133)
at com.mysql.jdbc.FailoverConnectionProxy.createProxyInstance(FailoverConnectionProxy.java:107)
at com.mysql.jdbc.NonRegisteringDriver.connectFailover(NonRegisteringDriver.java:384)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:319)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at practice.test.mysql.TestMysqlJDBC.main(TestMysqlJDBC.java:18)
Caused by: java.net.UnknownHostException: (host=127.0.0.1
at java.net.InetAddress.getAllByName0(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:188)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:299)
... 22 more
## 咦, 兩個錯誤不一樣, 先佔坑, 有時間再解決.....
4. MySQL的解壓版安裝
我作爲一名Windows使用人員, 我以前喜歡安裝版, 因爲省事, 不想寫很多配置文件. 然而現在我變了, 我變得喜歡zip解壓版的所有軟件. 因爲這下命運全部掌握在自己手中, 下面就寫一下MySQL的解壓版安裝.
4.1 下載MySQL壓縮包
-
首先下載好我們要使用的MySQL壓縮版, 建議去官方下載, 安全
- 只需要打開瀏覽器, 鍵入mysql.com回車就來到mysql官方網站
- 點擊Download, 往下拉, 點擊下載社區版
- 然後下載社區版服務器
- 然後下載zip
- 下載完成之後解壓, 放在你喜歡的位置, 打開後如下圖
- 只需要打開瀏覽器, 鍵入mysql.com回車就來到mysql官方網站
4.2 編寫配置文件
此時這個mysql並沒有初始化, 也就沒有數據存放位置所以我們需要寫一個mysql的配置文件來使得mysql瞭解我們設置的需要的參數
-
新建一個文件my.ini然後用文本編輯軟件打開鍵入以下內容
[mysqld] # set port number port=3306 # set basedir for your installation path basedir=F:/mysql8 # set datadir for mysql data directory datadir=F:/mysql8/data # set the character for our server character_set_server=UTF8MB4 # set sql mode sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # set the max connections max_connections=200 # set the storage engine = innodb default-storage-engine=INNODB [client] # set client character default-character-set=UTF8MB4 [mysql] # set mysql character default-character-set=UTF8MB4
## 注意: basedir後面跟的是你的mysql安裝目錄 ## datadir 後面是你的數據存放的目錄, 爲了方便將這個目錄放在安裝目錄下
4.3 使用命令進行安裝
-
配置完了之後我們使用管理員命令來到這個bin目錄下, 比如我的就是F:/mysql8/bin,(爲了方便將解壓後的文件命名爲mysql8)
-
然後執行mysqld --install命令安裝mysql8
-
然後執行mysql --initialize 以初始化mysql8(需要等待一段時間)
然後我們就會發現安裝的文件夾下出現了一個data文件夾, 裏面有一些文件
-
啓動mysql 服務使用net start mysql命令
-
此時我們mysql就已經安裝完成了, 但是還沒有完全安裝好
4.4 命令登陸MySQL
安裝完成之後我們進行測試連接
那麼問題來了? 密碼呢?
密碼就在剛剛的data文件中有一個後綴名爲err的文件中, 是一個臨時密碼
使用文本編輯工具打開後我們可以看到
將這個密碼輸入進去就登陸成功了
連接成功
4.5 重置用戶密碼
然後試一試show databases命令
然後我們可以看到提示我們使用ALTER USER 命令進行重置密碼
於是我們可以使用這樣的命令來進行重置
alter user 'root'@'localhost' identified by '123456';
那麼我們的mysql到此就正式安裝完成了
4.6 配置環境變量
此時我們的MySQL只能在bin目錄下進行連接, 爲了是我們的所有位置均可以進行連接, 我們配置環境變量, 將bin目錄加入到我們的path路徑中(配置路徑略)
5. 總結
學編程是一個需要動手和動腦的過程, 我們必須將理論知識結合到實踐中去.