gin中執行多個服務
Mybatis學習筆記
什麼是框架?
它是我們軟體開發中的一套解決方案,不同的框架解決的是不同的問題。
使用框架的好處:框架封裝了很多的細節,使開發者可以使用極簡的方式實現功能,大大提高開發效率。
三層架構
- 表現層:用於展示資料
- 業務層:處理業務需求
- 持久層:和資料庫互動的
持久層技術解決方案
-
JDBC技術:Connection
PreparedStatement
ResultSet
-
Spring的JdbcTemplate:Spring中對jdbc的簡單封裝
-
Apache的DBUtils:它和Spring的JdbcTemplate很像,也是對jdbc的簡單封裝
以上這些都不是框架,JDBC是規範,Spring的JdbcTemplate和Apache的DBUtils都只是工具類
Mybatis框架概述
mybatis 是一個優秀的基於java的持久層框架,它內部封裝了jdbc,使開發者只需要關注sql語句本身,而不需要花費精力去處理載入驅動、建立連線、建立statement等繁雜的過程。
mybatis通過xml或註解的方式將要執行的各種statement 配置起來,並通過java物件和statement中 sql的動態引數進行對映生成最終執行的sql語句,最後由 mybatis框架執行sql並將結果對映為java物件並返回。
採用ORM思想解決了實體和資料庫對映的問題,對 jdbc進行了封裝,遮蔽了jdbc api底層訪問細節,使我們不用與 jdbc api打交道,就可以完成對資料庫的持久化操作。
ORM:Object Relational Mappging物件關係對映簡單的說就是把資料庫表和實體類及實體類的屬性對應起來讓我們可以操作實體類就實現操作資料庫表。
Mybatis的入門
Mybatis的環境搭建:第一步:建立maven工程並匯入座標(匯入架包)
第二步:建立實體類和dao的介面
第三步:建立Mybatis的主配置檔案(SqlMapConfig.xml)
第四步:建立對映配置檔案(IUserDao.xml)
環境搭建的注意事項:第一個:建立IUserDao.xml和IUserDao.java時名稱是為了和我們之前的知識保持
-致。在Mybatis中它把持久層的操作介面名稱和對映檔案也叫做: Mapper所以:IUserDao和IUserMapper是一樣的 第二個:在idea中建立目錄的時候,它和包是不一樣的包在建立時: com.itheima.dao它是三級結構目錄在建立時: com.itheima.dao是一級目錄
第三個:mybatis的對映配置檔案位置必須和dao介面的包結構相同
第四個:對映配置檔案的mapper標籤namespace屬性的取值必須是dao介面的全限定類名
第五個:對映配置檔案的操作配置(select),id屬性的取值必須是dao介面的方法名
當我們遵從了第三,四,五點之後,我們在開發中就無須再寫dao的實現類。
Mybatis的人門案例
第一步:讀取配置檔案
第二步:建立SqlSessionFactory工廠第三步:建立SqlSession
第四步:建立Dao介面的代理物件第五步:執行dao中的方法
第六步:釋放資源
注意事項:不要忘記在對映配置中告知mybatis要封裝到哪個實體類中配置的方式:指定實體類的全限定類名
mybatis基於註解的入門案例:把IUserDao.xml移除,在dao介面的方法上使用@Select註解,並且指定SQL語句
同時需要在sqlMapConfig.xml中的mapper配置時,使用class屬性指定dao介面的全限定類名。l
自定義Mybatis的分析
執行查詢所有的分析
mybatis在使用代理dao的方式實現增刪改查時做什麼事呢?
-
第一:建立代理物件
-
第二:在代理物件中呼叫selectList
建立代理物件的分析
Mybatis的CRUD操作
基本操作
resultType屬性值表示,執行SQL語句後,從資料庫獲取資料,封裝的物件型別。
parameterType屬性值表示,執行SQL語句前,需要獲取資料的物件型別(當只有一個數據時,#{name}中name的值可以是任意,否則需要根據封裝物件的屬性名稱確定)。
模糊查詢的兩種實現方法中第一種比較常用,第一種的執行的SQL語句中是採用佔位符的方式進行值的獲取,而第二種是直接拼接成完整的SQL語句去執行的。
OGNL
OGNL表示式:
Object Graphic Navigation Language
物件 圖 導航 語言
它是通過物件的取值方法來獲取資料,在寫法上把get省略了。
比如:我們獲取使用者的名稱
類中的寫法:user.getUsername();
OGNL表示式寫法:user.username
mybatis中為什麼能直接寫username,而不用user呢?
因為在parameterType中已經提供了屬性所屬的類,所以此時不需要寫物件名。
解決實體類屬性和資料庫列名不對應的兩種方式
- 起別名的方式
- 配置查詢結果的列名和實體類的屬性名對應關係的方式
注意:resultType屬性不再需要,改成resultMap屬性。
properties標籤的使用及細節
可以在標籤內部配置連線資料庫的資訊。也可以通過屬性引用外部配置檔案資訊。
resource屬性:用於指定配置檔案的位置,是按照類路徑的寫法來寫,並且必須存在於類路徑下。
url屬性:是要求按照url的寫法來寫地址
URL:Uniform Resource Locator 統一資源定位符。它是可以唯一標識一個資源的位置。
它的寫法:
http:// localhost:8080/mybatisserver/demo1Servlet
協議 主機 埠 URI
URI:Uniform Resource Identifier 統一資源識別符號。它是在應用中可以唯一定位一個資源的。
typeAliases標籤和package標籤
使用typeAliases配置別名,它只能配置domain中類的別名。
package標籤用於指定要配置別名的包,當指定之後,該包下的實體類都會註冊別名,並且類名就是別名,不再區分大小寫
注意:mappers標籤下的package標籤作用與上面的不一樣
package標籤是用於指定dao介面所在的包,當指定了之後就不需要再寫mapper以及resource或者class
連線池
在實際開發中使用連線池,可以減少我們獲取連線所消耗的時間。
Mybatis連線池
Mybatis連線池提供了3種方式的配置:
配置的位置:主配置檔案SqlMapConfig.xml中的dataSource標籤,type屬性就是表示採用何種連線池方式。
type屬性的取值:POOLED 採用傳統的javax.sql.DataSource規範中的連線池,mybatis中有針對規範的實現。
UNPOOLED 採用傳統的獲取連線的方式,雖然也實現javax.sql.DataSource介面,但是並沒有使用連線池的思想。
JNDI 採用伺服器提供的JNDI技術實現,來獲取DataSource物件,不同的伺服器所能拿到的DataSource是不一樣。
注意:如果不是web或者maven的war工程,是不能使用的。我們課程中使用的是tomcat伺服器,採用連線池就是dbcp連線池。
Mybatis中的事務
什麼是事務
事務的四大特徵ACID
不考慮隔離性會產生的三個問題
解決辦法:四種隔離級別
它是通過sqlsession物件的commit方法和rollback方法實現事務的提交和回滾
Mybatis中動態SQL語句
if標籤
當我們不確定查詢條件時(查詢條件是一個,多個,或者沒有),可以使用if標籤的格式進行條件查詢
where標籤
where標籤的使用,使得我們不用再在SQL語句後面寫“where 1=1”使語句永遠為真
foreach標籤
根據queryvo中的id集合實現查詢使用者列表
sql標籤
抽取重複的sql語句
注意:如果引用抽取語句後,程式碼後面還要其他語句要用“;”隔開,如果沒有其他語句不要加“;”
Mybatis中多表查詢
表之間的關係有幾種:一對多、多對多、一對一、多對多
舉例:
使用者和訂單就是一對多
訂單和使用者就是多對一
一個使用者可以下多個訂單
多個訂單屬於同一個使用者
人和身份證號就是一對一
一個人只能有一個身份證號
一個身份證號只能屬於一個人
老師和學生之間就是多對多
一個學生可以被多個老師教過
一個老師可以交多個學生
特例:
如果拿出每一個訂單,他都只能屬於一個使用者
屬於Mybatis就把多對一看成了一對一
mybatis中的多表查詢示例:使用者和賬戶
一個使用者可以有多個賬戶
一個賬戶只能屬於一個使用者(多個賬戶也可以屬於同一個使用者)
步驟:1、建立兩張表:使用者表,賬戶表
讓使用者表和賬戶表之間具備一對多的關係:需要使用外來鍵在賬戶表中新增
2、建立兩個實體類:使用者實體類和賬戶實體類
讓使用者和賬戶的實體類能體現出來一對多的關係
3、建立兩個配置檔案
使用者的配置檔案
賬戶的配置檔案
4、實現配置
當我們查詢使用者時,可以同時得到使用者下所包含的賬戶資訊
當我們查詢賬戶時,可以同時得到賬戶的所屬使用者資訊
示例:使用者和角色
一個使用者可以有多個角色
一個角色可以賦予多個使用者
步驟:1、建立兩張表:使用者表,角色表
讓使用者表和角色表具有多對多的關係:需要使用中間表,中間表中包含各自的主鍵,在中間表中時外來鍵
2、建立兩個實體類:使用者實體類和角色實體類
讓使用者和角色的實體類能體現出來一對多的關係
各自包含對方一個集合引用
3、建立兩個配置檔案
使用者的配置檔案
角色的配置檔案
4、實現配置
當我們查詢使用者時,可以同時得到使用者下所包含的角色資訊
當我們查詢角色時,可以同時得到角色的所賦予的使用者資訊
Mybatis中的延遲和立即載入
問題:在一對多中,當我們有一個使用者,它有100個賬戶
在查詢使用者的時候,要不要把關聯的賬戶查出來?
在查詢賬戶的時候,要不要把關聯的使用者查出來?
在查詢使用者時,使用者下的賬戶資訊應該是,什麼時候使用,什麼時候查詢的?
在查詢賬戶時,賬戶的所屬使用者資訊應該是隨著賬戶查詢時一起查詢出來?
什麼是延遲載入?
在真正使用資料時才發起查詢,不用的時候不查詢。按需載入(懶載入)
什麼是立即載入
不管用不用,只要一呼叫方法,馬上發起查詢
在對應的四種表關係中:一對多,多對一,一對一,多對多
一對多,多對多:通常情況下我們都採用延遲載入。
多對一,一對一:通常情況下我們都採用立即載入。
Mybatis中的快取
什麼是快取:存在於記憶體中的臨時資料
為什麼使用快取:減少和資料庫的互動次數,提高執行效率
什麼樣的資料能用快取,什麼樣的資料不能使用
適用於快取:經常查詢並且不經常改變的
資料的正確與否對最終結果影響不大的
不適用於快取:經常改變的資料
資料的正確與否對最終結果影響很大的
例如:商品的庫存,銀行的匯率,股市的牌價
Mybatis中的一級快取
它指的是Mybatis中SqlSession物件的快取
當我們執行查詢之後,查詢的結果會同時存入到SqlSession為我們提供一塊區域中
該區域的結構是一個Map。當我們再次查詢同樣的資料,mybatis會失去sqlsession中查詢是否有,有的話直接拿來用
當SqlSession物件消失時,mybatis的一級快取也就消失了
Mybatis中的二級快取
它指的是Mybatis中SqlSessionFactory物件的快取,由同一個SqlSessionFactory物件建立的SqlSession共享其快取
二級快取的使用步驟:第一步:讓Mybatis框架支援二級快取(在SqlMapConfig.xml中配置)
第二步:讓當前的對映檔案支援二級快取(在IUserDao.xml中配置)
第三步:讓當前的操作支援二級快取(在select標籤中配置)
Mybatis註解開發
mybatis註解開發時,不能和xml配置一起使用:要麼全是註解,要麼全是xml配置檔案