MariaDB的學習
<code>關于MariaDB的曆史,不再概述</code>
下面是mariadb的官網:https://mariadb.com/
同樣的,MariaDB一樣有連接配接java的jar包:https://downloads.mariadb.com/Connectors/java/connector-java-2.2.1/ 選.jar結尾但名稱最短那個 mariadb-java-client-2.2.1.jar
好的,我們開始MariaDB的學習:
1.MariaDB介紹
資料庫應用程式 與 主應用程式 分開存在, 并存儲資料集合. 每個資料庫都使用一個或多個API來建立, 通路, 管理, 搜尋和複制其包含的資料.
資料庫還是用非關系資料源, 例如對象或檔案. 然而, 資料庫證明是大資料集的最佳選擇, 這将遭受緩慢的檢索和與其他資料源的寫入.
關系資料庫管理系統(RDBMS)将資料存儲在各種表中. 這些表之間的關系使用主鍵和外鍵建立.
剛看了下webgl,threejs群裡發的QQ騰訊在南極開設了什麼黑科技實驗室啊?
RDBMS提供以下功能:
它們使您能夠使用表, 列和索引來實作資料源.
它們確定多個表行間引用的完整性.
它們自動更新索引.
他們解釋SQL查詢和操作從表操作或源資料.SQL 是用于通路和處理資料庫的标準的計算機語言。SQL學習:http://www.w3school.com.cn/sql/index.asp
RDBMS(關系型資料庫管理系統)術語
在我們開始讨論MariaDB之前, 讓我們來看一下與資料庫相關的一些術語.
Database - 資料庫是由儲存相關資料的表組成的資料源.
Table - 表, 這意味着電子表格, 是包含資料的矩陣.
Column - 表示資料元素的列是儲存一種類型的資料的結構; 例如, 送貨日期.
Row - 行是對相關資料進行分組的結構;例如, 用于客戶的資料. 它也被稱為元組, 條目或記錄.
Redundancy - 此術語指的是存儲資料兩次, 以加速系統.(中文意思:備援)
Primary Key - 這指的是唯一的辨別值. 此值不能在表中出現兩次, 并且隻有一個行與其關聯.
Foreign Key - 外鍵用作兩個表之間的連結.(Foreign:有外國外籍的意思)
Compound Key - 複合鍵, 或混合鍵, 是指多個列的關鍵.
Index - 索引實際上與書的索引意思相同.
Referential Integrity - 此術語指確定所有外鍵值指向現有行.
關系型資料庫講解可以看http://www.icourse163.org/
搜尋資料庫系統,檢視哈工大講解的資料庫系統(上,中,下)
同時,該課程線上上考試後如果成績合格或優秀,可擷取實體證書!(找工作的利器)
還有很多其他課程都發證以及獎學金.
Maria 資料庫
MariaDB是由MySQL的原始開發人員建立的MySQL的流行分支. 它源于與Oracle收購Sun&MySQL有關的問題. 它旨在成為MySQL的替代, MariaDB提供與MySQL等相同的功能.
MariaDB的重要特性
所有的MariaDB都在GPL, LGPL或BSD下.
MariaDB包括各種存儲引擎, 包括高性能存儲引擎, 用于與其他 RDBMS 資料源一起工作.
MariaDB使用标準和流行的SQL語言.
MariaDB在多個作業系統上運作, 并支援各種各樣的程式設計語言.
MariaDB提供Galera叢集技術.
MariaDB還提供了許多在MySQL中不可用的操作和指令, 并消除/取代影響性能的功能.
MariaDB同樣有jar包驅動與java程式的結合.
MariaDB的下載下傳: https://mariadb.com/downloads/mariadb-tx
2.在windows/Linux上使用MariaDB
我原本打算想找一個MariaDB的網上社群進行快速學習,但不料沒有,而且那個MariaDBpub網站首頁居然顯示拒絕.
後來找到這個,https://www.server110.com/mariadb/ 關于MariaDB的内容不算太多,入門感覺足夠了.
其實MariaDB的操作跟MySQL幾乎是一樣的, 隻不過在Linux端可能有些指令不同.
我已經安裝好了. 隻需要輸入xshell指令 :
mysql -uroot -p
然後提示你輸入資料庫的密碼,之後就來到了MariaDB的指令行:
[root@iz2zea0v6yzqrn1lbze76iz ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> <<以下我們稱這個為MariaDB的指令行
雖然說這MariaDB是MySQL作者的分支,而且不屬于被收購的項目,但是從上面可以看出有Oracle的字眼,可能是為了尊重原來與MySQL相容的原因吧.(其中不少代碼或者結構上應該跟MySQL相似甚至相同吧).
但畢竟現在MariaDB是單獨一個産品了.而且是開源且快速更新疊代的.
在MariaDB的官網上https://mariadb.com/,我們到底部的版權資訊: Copyright © 2018 MariaDB. All rights reserved. 而且網站上有說明把MySQL轉移到MariaDB的教程,以及各種路演,而且我驚詫地發現在靠近下面的”成功故事專題”中,分别有3個視訊,,,讓我懷疑MariaDB是不是國人開發的,因為這3個視訊分别來自:阿裡巴巴,華泰證券,以及騰訊…
這裡是MariaDB的官方文檔及問答:https://mariadb.com/kb/en/ 雖然有中文版,,,但是不敢恭維漢化程度,還是看英文版吧!
在下載下傳完windows版的MariaDB後,随安裝的還有工具HeidiSQL.
https://www.heidisql.com/help.php#connecting 官方的本地連接配接遠端伺服器的教程.ssh
在這個教程中,介紹了怎樣建立一個127.0.0.1的連接配接,然後介紹了連接配接遠端伺服器端資料庫的ssh連接配接.
因為都是英文,雖然能看懂一大半,但是還是需要整理一下:
1.[會話管理器界面(以下都是)] 在heidisql界面建立會話,在設定欄目選擇網絡類型為MySQL(SSH tunnel)//ssh隧道secure shell簡稱ssh 簡介: https://baike.baidu.com/item/ssh
2.[扳手設定欄目] 下面輸入遠端伺服器資料庫的 IP,使用者名,密碼和端口 下面可以指定哪個資料庫資訊,可以不指定.注意這裡的密碼可能要更改! 繼續看下面!
3.[藍色鎖頭欄目] 下載下傳putty,這個工具在學習Linux的片段中使用過,它的下載下傳位址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html ,下載下傳好後,将該包解壓到指定本地目錄,并加入環境變量.然後切到heidisql界面的藍色鎖頭選項,把與putty.exe同目錄的plink.exe位置填入進去.
4.[藍色鎖頭欄目] 後面的SSH主機+端口号依舊填寫遠端伺服器IP位址,端口号為預設的22.輸入遠端伺服器的賬戶,密碼.及本地端口,其他先不用管.保持預設.
5.[會話管理器界面] 點選打開,然後會遇到問題說你密碼錯了不用着急!之前第二步驟中,我們說這裡密碼可能要改,如何改呢?
用xshell或者putty連接配接你的遠端伺服器.
登入到MariaDB指令界面.(參照第2章目剛開始的方法)
在MariaDB指令行輸入:
grant all privileges on *.* to 'root'@'你的機器所在的IP' identified by '要更改的密碼' with grant option;
注意這裡你的機器所在IP并非127.0.0.1,可以寫個java類自己擷取當然更簡單的可以直接百度:"本機ip",或:http://www.ip138.com/ ,這裡的要更改的密碼就是上面第2條目中要更改的密碼. 當然如果你的使用者名不是root也要對應更改.
還沒結束,輸入完這條,再輸入flush privileges; 來讓指令立即生效.
之後再在heidisql界面點選打開看看是不是可以登入了!?
輕松一下,利用 HeidiSQL 界面建立一個資料庫.
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsAjMfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cGcq5CNmZGOhVDNlhTNiZWNiRmYhZ2YiFzYkRWO2EjN1QDOz8CX4AzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.jpg)
取名叫做hello_mariadb,之後字元集先預設就可以. (我的是utf8-unicode-ci.)
之後在xshell or putty中調用MariaDB指令: (也就是檢視遠端伺服器時候有這個建立立的資料庫了呢)
MariaDB [(none)]> show databases;
是不是看到光輝時刻了呢?
+--------------------+
| Database |
| information_schema |
| hello_mariadb << 這就是我們在heidisql.exe建立的資料庫!
| mysql |
| performance_schema |
| test |
5 rows in set (0.00 sec)
2018年1月7日 00:09:20
今天最後附上linux檢視資料庫的基礎指令及該部落格作者的座右銘…
3.SQL語句與MariaDB的結合使用實測與練習
因為在界面heidisql中建立資料庫和表比較簡單,是以我們先略過.
本節主要将使用指令行式的SQL語句.
關于什麼是SQL語句,不再深入概述
來到xshell的指令行,調出MariaDB的指令輸入狀态.
建立一個資料庫
CREATEDATABASE mydb1234;
這時建立成功,傳回語句: Query OK, 1 row affected (0.00 sec)
接着我們在 mydb1234 中建立一個表.
首先要先使用這個資料庫:
USE mydb1234;
這時使用了我們剛建立的資料庫,并且指令行中的none變為了資料庫的名稱:
MariaDB [(none)]> USE mydb1234;
Database changed
MariaDB [mydb1234]>
接着我們繼續輸入建立表的指令:
MariaDB [mydb1234]> CREATE TABLE Persons //建立一個表示'人'的表.
-> ( //左圓括号
-> PersonID int, //序号
-> Name varchar(255), //姓名
-> Gender varchar(255), //性别
-> Address varchar(255) //位址 最後一項沒有逗号
-> ); //右圓括号 分号 ;
Query OK, 0 rows affected (0.01 sec)
有了最後的這個 ; 号我們再按回車就會執行指令.(有的可能不需要加 ; )
PersonID 列的資料類型是 int ,包含整數.
其他三項因為要用文字表述, 資料類型都是 varchar ,包含字元, 且這些字段最大長度為 255 個字元.
有了這個 Persons 空表, 我們向其中添加資料.
MariaDB [mydb1234]> INSERTINTO Persons VALUES
-> ( // (
-> 1, //對應int類型的PersonID
-> '趙本山', //對應varchar字元類型的Name
-> '男', //對應varchar的 性别 Gender
-> '鳳凰山莊' //對應varchar的 位址
-> ); // );
Query OK, 1 row affected (0.00 sec)
之後傳回的 Query OK 證明SQL語句執行成功了,但我們還是想看一看資料庫表中”趙本山”的樣子.
MariaDB [mydb1234]> SELECT * FROM Persons;
+----------+-----------+--------+--------------+
| PersonID | Name | Gender | Address |
| 1 | 趙本山 | 男 | 鳳凰山莊 |
1 row in set (0.01 sec)
上面使用了SELECT * FROM 表名稱; 去查詢并傳回給你看. * 代表着全部的在 Persons表裡的資料.
但如果我們隻向Name中添加一個資料,其他不添加呢?
同樣使用INSERT INTO語句插入,不過我們指定列名稱在表名後面:
MariaDB [mydb1234]> INSERT INTO Persons( Name )VALUES ( '郭冬臨' );
| NULL | 郭冬臨 | NULL | NULL |
2 rows in set (0.00 sec)
注意:像上面這種其他列的值為NULL時是種很不好的資料結構!
當我們想删除這行不完整的資料時,可以使用DELETE :
MariaDB [mydb1234]> DELETE FROM Persons WHERE Name='郭冬臨';
1 row in set (0.00 sec)
注意上面如果在DELETE語句使用…..WHERE PersonID=NULL 或者=’NULL’都是删除不了的.
MariaDB [mydb1234]> DELETE FROM Persons WHERE PersonID='NULL';
Query OK, 0 rows affected, 1 warning (0.00 sec) <-提示警告! 1 warning
MariaDB [mydb1234]> DELETE FROM Persons WHERE PersonID=NULL; <-同樣不可以
Query OK, 0 rows affected (0.00 sec) <-沒有行受到影響
接下來我們發現這個表隻有3個屬性,收集的資料特别少,我們想加一列年收入情況:
annual income 是年收入的英文,我們為了精簡,使用 YearIncome來作為年收入的列名;
後來我發現,這沒有必要啊,因為我們可以直接指定表中列名為中文”年收入(元)“啊!
MariaDB [mydb1234]> ALTER TABLE Persons ADD `年收入(元)` BIGINT;
結果:
MariaDB [mydb1234]> select * from Persons;
+----------+-----------+--------+--------------+----------------+
| PersonID | Name | Gender | Address | 年收入(元) |
| 1 | 趙本山 | 男 | 鳳凰山莊 | NULL |
| NULL | 郭冬臨 | NULL | NULL | NULL |
讓我們更改 它的資料類型!:
MariaDB [mydb1234]> ALTER TABLE Persons MODIFY COLUMN `年收入(元)` DECIMAL(99,2);
ERROR 1426 (42000): Too big precision 99 specified for '年收入(元)'. Maximum is 65.
MariaDB [mydb1234]> ALTER TABLE Persons MODIFY COLUMN `年收入(元)` DECIMAL(65,2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
本山大叔錢很多我們使用 DECIMAL(99,2) 類型來表示他的年收入,99代表最大位數,而2代表小數點後有幾位. 然後彈出 ERROR 1426, 是說我們指定的這個屬性的精度99太高啦,并說明了最大的應該是65位.
之後改為65位, OK.
可以改一個屬性的類型,那麼改這個屬性的名稱呢?
我們發覺Gender來表示性别不是那麼很明确,我們改為Sex好了,通俗易懂:
MariaDB [mydb1234]> ALTER TABLE Persons CHANGE COLUMN Gender Sex CHAR(5);
Query OK, 2 rows affected (0.03 sec)
+----------+-----------+------+--------------+----------------+
| PersonID | Name | Sex | Address | 年收入(元) |
在上面,我們同時更改了Sex的資料類型變為了 char 并且大小更改為了 5. 因為相對來說, char 是固定長度,處理速度比可變長度的 varchar 要快, 但我們性别這一欄目,就隻要設定一個漢字, 是以設定為5, (在普遍的系統下,UTF-8的一個漢字占3個字元,GBK占2個字元),我們設定5為了寬裕一下. 極端主義請設定為3!
接下來我們把現有這個資料表填充起來
MariaDB [mydb1234]> UPDATE Persons
-> SET PersonID=2,Sex='男',Address='四合院'
-> WHERE Name='郭冬臨';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
| 2 | 郭冬臨 | 男 | 四合院 | NULL |
MariaDB [mydb1234]> UPDATE Persons SET `年收入(元)`=23002300.23 WHERE Name='趙本山';
Query OK, 1 row affected (0.01 sec)
MariaDB [mydb1234]> UPDATE Persons SET `年收入(元)`=888000.80 WHERE Name='郭冬臨';
| 1 | 趙本山 | 男 | 鳳凰山莊 | 23002300.23 |
| 2 | 郭冬臨 | 男 | 四合院 | 888000.80 |
上面暫時沒找到同時插入兩行中同一屬性的方法.
4.
下面我們開始設定主鍵和主鍵的自增. 因為我們每次添加新行如果都要輸入PersonID去排序太麻煩了,
設定自增可解決這個問題.
https://www.w3cschool.cn/sql/2phntfpq.html <自增
休息好後,開始設定主鍵的自增. 并開始着手制作動态頁面注冊登入與資料庫連接配接.
2018年1月7日 20:39:04
5.JDBC連接配接遠端MariaDB資料庫
先看一段代碼: (文章中關于IP和密碼等not real)
//MariaDB連接配接java的驅動名
String driver = "org.mariadb.jdbc.Driver";
//從配置參數中擷取資料庫URL
String url = "jdbc:mariadb://60.203.124.227:3306/mydb1234";
//從配置參數中擷取使用者名
String user = "root";
//從配置參數中擷取密碼
String password = "jjiojiowwuu";
//注冊驅動
Class.forName(driver);
//擷取資料庫連接配接
Connection conn = DriverManager.getConnection(url,user,password);
//連接配接如果成功輸出
System.out.println("連接配接成功.");
上面的這些在一個新類中,其作用是連接配接我們的資料庫mydb1234,
看起來稍微比heidisql.exe麻煩,但是這是浏覽器端連接配接資料庫顯示資料庫内容的基本的java的思路.
String 聲明的 driver, url, user, password 都将用于其下冊的功能使用.
Class.forName(org.mariadb.jdbc.Driver); 是聲明注冊這個驅動.
利用Connection類和DriverManager擷取資料庫的連接配接,括号中是url, 資料庫使用者名, 密碼
url是 jdbc:mariadb://IP位址:3306/資料庫名
MariaDB一樣有連接配接java的jar包:https://downloads.mariadb.com/Connectors/java/connector-java-2.2.1/ 選.jar結尾但名稱最短那個 mariadb-java-client-2.2.1.jar .
用原來的Class.forName(“com.mysql.jdbc.Driver”);其實也是可以的,因為MariaDB大部分相容MySQL.
花費了9牛2虎之力,可算把java中的select * from tablename; 指令完整傳回出資料了.
package 連接配接遠端Linux的MariaDB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
/**
*
* 建立時間:2017年12月4日 上午12:37:45
* 項目名稱:網絡程式設計
* @author ukyozq
* @version 1.0
* @since JDK 9.0
*/
publicclassMariaDBConnect02
{
publicstaticvoidmain(String[] args)throws ClassNotFoundException, SQLException
Class.forName("org.mariadb.jdbc.Driver");
//測試連接配接時間
long start = System.currentTimeMillis();
/*
* DriverManager 接口是JDBC的管理層,作用于使用者和驅動程式之間,
* DriverManager 跟蹤可用的驅動程式,并在資料庫和相應的驅動程式之間建立連接配接.
//建立連接配接(連接配接對象内部其實包含了Socket對象,是一個遠端的連接配接,比較耗時!這是Connection對象管理的一個要點!)
Connection conn = DriverManager.getConnection("jdbc:mariadb://60.203.124.227:3306/mydb1234","root","jjiojiowwuu");
long end = System.currentTimeMillis();
long useTime = end-start;
System.out.println("建立連接配接,耗時:"+useTime+"毫秒.");
System.out.println("------");
//建立一個會話
//使用PreparedStatement (效率更高,預處理機制.防止SQL注入)
String sql = "SELECT * FROM Persons";
PreparedStatement ps = conn.prepareStatement(sql);
//執行 用結果集擷取
ResultSet rs = ps.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData() ;
int columnCount = rsmd.getColumnCount();
//取得列數(字段數)
ResultSet rset = ps.executeQuery("select count(*) totalCount from Persons");
int rowCount = 0;
if(rset.next())
rowCount = rset.getInt("totalCount");
}
System.out.println(rsmd.getCatalogName(rowCount)+"資料庫中的"
+rsmd.getTableName(rowCount)+"表,有"
+rowCount+"行" +columnCount+"列.");
while(rs.next())
for(int i=1;i<=columnCount;i++)
System.out.print(rsmd.getColumnName(i)+":\t");
System.out.println(rs.getObject(i)+"\t");
System.out.println("(資料類型:"+rsmd.getColumnTypeName(i)+","+rsmd.getColumnDisplaySize(i)+"位元組)");
//所有連接配接在擷取後必須關閉. 後開的先關
//關閉順序:ResultSet-->Statement(PreparedStatement)-->Connection
if(rs!=null)
rs.close();
if(ps!=null)
ps.close();
if(conn!=null)
conn.close();
//
~~~輸出:
建立連接配接,耗時:284毫秒.
------
mydb1234資料庫中的Persons表,有2行5列.
PersonID: 1
(資料類型:INTEGER,11位元組)
Name: 趙本山
(資料類型:VARCHAR,255位元組)
Sex: 男
(資料類型:CHAR,5位元組)
Address: 鳳凰山莊
年收入(元): 23002300.23
(資料類型:DECIMAL,67位元組)
PersonID: 2
Name: 郭冬臨
Address: 四合院
年收入(元): 888000.80
很明顯輸出沒有很好的排列地像在HeidiSQL或是xshell中那樣.
沒有關系,我們就做一個Excel表格樣式的東西去格式化一下傳回的資料.