1. 程式人生 > >【JAVAWEB學習筆記】09

【JAVAWEB學習筆記】09

like 筆記 關聯關系 server enc put logs 問題 dir

今天晨讀單詞:

order:訂單
constraint:(強制)約束
foreign key:外鍵
references:指向
orderitem:訂單項
join:加入
resourceBundle:資源捆綁
classLoader:類加載器
properties:屬性
inputstream:輸入流

今日學習目標:

1、能夠描述表與表的關系

2、能獨立編寫一對多的表關系SQL語句

3、能獨立編寫多對多的表關系SQL語句

4、能使用SQL進行多表查詢

5、能使用JDBC完成單表增刪改查操作

值得註意的是:除了dirver在mysql.jdbc,其他都在sql的包下,不要導錯包了。

通過MySQL思維導圖進行回顧,再進入今天的筆記內容

技術分享

01_一對多建表原則

技術分享

02_多對多建表原則

技術分享

03_一對一建表原則

技術分享

04_商城的實體抽取和表關系分析

技術分享

05_內連接和外連接區別

技術分享

使用properties配置文件:

技術分享

技術分享

技術分享

方法一:

技術分享

技術分享

方法二:

技術分享技術分享

MySQL多表操作說明:

問題說明:

一、主從表數據更新問題

當兩張表沒有建立任何關系的時候,那麽可以隨意刪除其中任何一張表中的任何記錄,但是一旦把兩張表建立了關系(主外鍵約束)之後,那麽不能刪除主表中的數據(這些數據內容在從表中有關聯關系的數據),只想執行刪除(更新操作),那麽就會出現下圖中的錯誤。

技術分享

要想刪除主表中與從表有關聯關系的數據,可以這麽做:

  1. 解除主從表的約束關系
  2. 先刪除從表中與主表有關系的數據[ThinkPad1] ,再刪除主表中的數據。

另外,從表也不能添加主表中不存在的數據!


[ThinkPad1]先把p003和P004的數據刪除了,再刪除分類表中c002的數據。

技術分享

二、關於子查詢問題

一般子查詢會存在於兩張關聯的表中,那麽我們可以先把帶有條件的那張表與另外一張表的關聯關系字段查出來,並作為另外一張表查詢的條件值,然後再次進行查詢。

例子:查詢“化妝品”分類上架商品詳情。

先查主表的主鍵(根據指定的條件<化妝品,cname[ThinkPad1] >)

select cid from category where panme=’化妝品’

查詢所有商品的詳細信息(根據分類id查詢):

select * from product where category_id=cid[ThinkPad2]

select * from product where category_id=( select cid from category where cname=’化妝品’);

三、分頁查詢問題

分頁查詢使用的是limit關鍵字進行查詢。它後面有兩個參數。第一個參數[ThinkPad3] 是起始的位置,第二個參數是每頁需要顯示的條目數。

舉例:商品表中有10條記錄,現在需要進行分頁顯示,每頁顯示3條數據。現在需要查看第二頁的數據。那麽應該使用的sql語句是:

select * from product limit 3[ThinkPad4] ,3;


[ThinkPad1]屬於主表category表中的內容,那麽先查出主表的主鍵cid.然後將查出的內容作為條件。

[ThinkPad2]需要先從主表category中查詢出來。

[ThinkPad3]取值為:(需要查看第幾頁-1)乘以第二個參數

[ThinkPad4](2-1)*3

技術分享

執行分頁查詢語句後,顯示的結果如下:

技術分享

四、關於mysql編碼問題

1 查看MySQL編碼

SHOW VARIABLES LIKE ‘char%‘;

技術分享

因為當初安裝時指定了字符集為UTF8,所以所有的編碼都是UTF8。

l character_set_client:你發送的數據必須與client指定的編碼一致!!!服務器會使用該編碼來解讀客戶端發送過來的數據;

l character_set_connection:通過該編碼與client一致!該編碼不會導致亂碼!當執行的是查詢語句時,客戶端發送過來的數據會先轉換成connection指定的編碼。但只要客戶端發送過來的數據與client指定的編碼一致,那麽轉換就不會出現問題;

l character_set_database:數據庫默認編碼,在創建數據庫時,如果沒有指定編碼,那麽默認使用database編碼;

l character_set_server:MySQL服務器默認編碼;

l character_set_results:響應的編碼,即查詢結果返回給客戶端的編碼。這說明客戶端必須使用result指定的編碼來解碼;

2 控制臺編碼

修改character_set_client、character_set_results、character_set_connection為GBK,就不會出現亂碼了。但其實只需要修改character_set_client和character_set_results。

控制臺的編碼只能是GBK,而不能修改為UTF8,這就出現一個問題。客戶端發送的數據是GBK,而character_set_client為UTF8,這就說明客戶端數據到了服務器端後一定會出現亂碼。既然不能修改控制臺的編碼,那麽只能修改character_set_client為GBK了。

服務器發送給客戶端的數據編碼為character_set_result,它如果是UTF8,那麽控制臺使用GBK解碼也一定會出現亂碼。因為無法修改控制臺編碼,所以只能把character_set_result修改為GBK。

l 修改character_set_client變量:set character_set_client=gbk;

l 修改character_set_results變量:set character_set_results=gbk;

設置編碼只對當前連接有效,這說明每次登錄MySQL提示符後都要去修改這兩個編碼,但可以通過修改配置文件來處理這一問題:配置文件路徑:D:\Program Files\MySQL\MySQL Server 5.1\ my.ini

技術分享

3 MySQL工具

使用MySQL工具是不會出現亂碼的,因為它們會每次連接時都修改character_set_client、character_set_results、character_set_connection的編碼。這樣對my.ini上的配置覆蓋了,也就不會出現亂碼了。

【JAVAWEB學習筆記】09