今天打算用JAVA來連接一下MySQL數據庫,這個過程呢真的折騰人啊
先看我寫的代碼:
import java.sql.*; //導入java.sql包 public class Conn { // 創建類Conn Connection con; // 聲明Connection對象 public Connection getConnection() { // 建立返回值為Connection的方法 try { // 加載數據庫驅動類 Class.forName("com.mysql.jdbc.Driver"); System.out.println("數據庫驅動加載成功"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { // 通過訪問數據庫的URL獲取數據庫連接對象 con = DriverManager.getConnection("jdbc:mysql:"+ "//192.168.43.188:3306/test", "root", "root"); System.out.println("數據庫連接成功"); } catch (SQLException e) { e.printStackTrace(); } return con; // 按方法要求返回一個Connection對象 } public static void main(String[] args) { // 主方法 Conn c = new Conn(); // 創建本類對象 c.getConnection(); // 調用連接數據庫的方法 } }
代碼看上去非常簡單,先加載mysql驅動包,加載成功輸出提示,然后連接數據庫,第一個參數是數據庫的URL,第二個參數是數據庫用戶名,第三個毫無疑問是密碼了,好了,一運行bug來了:
彈出的錯誤是:我的電腦不被允許連接到這個數據庫,我就懵了,數據庫就在我的電腦上,為什么就不給連接呢?后來一查發現是Mysql不允許遠程連接,但問題是我的是本地連接??!又懵了。后來發現是權限問題,就是數據庫沒有開放相應的權限。
①解決方法:
打開終端,進入mysql
1、先選中mysql中的 ·mysql· 表 use mysql; 2、更新權限,修改為允許全部連接 update user set host = '%' where user = 'root'; 3、查看是否修改成功 select host, user from user; 4、刷新表的權限(或者重啟一次mysql) flush privileges;
以上的方法是允許所有的用戶都可以連接到mysql,這個太危險了,只要有了你的數據庫URL,誰都可以連接。我呢就接收不了這樣的結果,所以這個方法就不適合我。后面我一直找解決方法,沒找到,我就先安裝Mysql數據庫吧!安裝數據庫的過程還算挺順利的,也挺快的。當我建完庫,建完表后,插入第一條數據,然后噩夢就來了:
insert into db1(id,name)values(1,'小屁孩');
bug又出現了:
它說字符串的值不正確,我學了一個學期的SQL server,就算我再笨也不止于連一條插入數據的sql語句都寫錯吧,我反復檢查,肯定不是我的鍋,不出我所料,代碼沒有問題,又是數據庫搞得鬼,其實不輸入漢字的話,是可以用的,但是我有強迫癥,我必須要它可以輸入漢字,最后又踏上了修bug的道路。首先,MySQL安裝好以后默認的編碼顯示是這樣的:
其中value那一列是有兩個值時latin1,后來一查問題就出在這里,很多時候我們寫代碼或者寫文檔的時候出現亂碼就是因為編碼不是UTF-8的,毫無疑問,我要把這兩個值改為UTF-8的,
網上的方法很多,也很雜,還有一些忽悠人的,比如:
①
set character_set_database=utf8;
這句代碼確實可以改,但是只是改表面的,當你關閉數據庫,再次輸入show variables like ‘character%’;去查詢還是跟上圖是一樣,根本就沒有改到配置。
②
1.用管理員身份打開cmd:輸入net stop mysql,把MySQL服務停止,打開MySQL安裝目錄,找到my.ini,如果沒有的話,應該有my-default.ini,是一樣的。如果是my-default.ini,建議在當前目錄下復制粘貼一個新文件,重命名為my.ini,然后在文件內添加以下設置,保存即可,然后將其復制到MySQL的bin目錄下
[client]
#設置客戶端字符集
default-character-set=utf8
[mysqld]
#設置服務器字符集為utf8
character_set_server=utf8
2.然后,在回到cmd,輸入net start mysql,啟動服務器,順利的話,就可以啟動成功。然后新開一個cmd窗口,連接mysql,再次查看編碼方式即都變為utf-8。
以上的兩個方法我都試過了,然并卵,這兩個方法都是不行的,你們不用試了。網上幾乎所有的方法都是改my.ini配置文件,但是沒多少個是可以,我差不多要絕望了,java那邊還沒弄好,數據庫這邊又出問題。這個問題我折騰了好久,內心還是很想解決,但是這個時候我已經錯過了飯點了,從下午4點開始到8點鐘,我沒吃過東西也沒有喝過水,我內心其實很想繼續找bug的,但是我的身體不允許,我就先去吃點東西。
轉機
在去的路上,我還是惦記著那個bug,我打開了csdn,搜到了這樣的一句代碼:
alter table 'tablename' convert to character set utf8;
這句代碼就是修改一張表的所有字段的編碼格式,我當時想,既然能修改,那創建表的時候應該可以選擇編碼格式啊。當時心里想還有最后一絲希望,趕緊吃完回去試一下,不出我所料,果然成功了。如下圖:
在創建數據庫的時候,collation那個位置是可以選擇編碼格式的,一開始是latin1格式的,我選了一個utf8的試了一下,如下圖:
插入的名字是小屁孩,性別男。查看一下,成功了。
現在才稍微開心了一點,終于解決了這個大bug了,這個問題解決之后,我又開始征戰java了,發現前面遇到的權限問題還有一個解決方法,就是在數據庫中給用戶授權,這樣既安全又可以連上,代碼如下:
2.解決方法:
1、指定賬戶連接(mysql默認賬戶名是 root):
假如:賬戶名是:account 密碼是:accountPassword
GRANT ALL PRIVILEGES ON *.* TO 'account'@'%' IDENTIFIED BY 'accountPassword' WITH GRANT OPTION;
2、指定IP地址連接
假如本地IP地址為:192.168.3.67 使用密碼:ipPassword登錄
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.3.67' IDENTIFIED BY 'ipPassword' WITH GRANT OPTION;
以上方式執行完后,都需要刷新一次mysql的權限表,或者重啟一次mysql
flush privileges;
3.解決方法:
后面我還發現了一種解決方法,就是把數據庫連接路徑中的ip改為localhost,它會自動獲取你主機的地址,又不需要權限,局域網和廣域網都能用,代碼如下:
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
總結一下:連接數據庫有3種方法,可以直接開最高權限,可以單獨授權,可以用localhost關鍵字。
找完bug的時候,已經晚上11點了,連續看了7個小時的電腦,眼睛已經撐不住了??赡苡腥藭f我鉆牛角尖、固執,我覺得吧,學編程就是不斷的折騰自己,越狠越好,永不放棄那就是對的,就算在吃飯的路上也不要浪費那一點時間,因為靈感和運氣就在這個時候會來的,哈哈哈!
請關注我公眾號??!