最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

教程揭秘 | 動力節(jié)點內(nèi)部Java零基礎教學文檔第九篇:Mybatis

2023-11-13 09:39 作者:動力節(jié)點  | 我要投稿

接上期后續(xù)

本期分享第九章節(jié)

Mybatis

已經(jīng)分享過半了,你們都跟上了嗎?

每天都在學習嘛?

有什么不會的嘛?

今日教學文檔分享來了?

今日新篇章

【Mybatis】

1.?JDBC不足?

?JDBC作為Java操作數(shù)據(jù)庫的模板,如果想要對數(shù)據(jù)庫進行操作,必須使用JDBC,但是在使用JDBC進行數(shù)據(jù)庫操作時,重復代碼多,動態(tài)SQL構(gòu)建繁瑣,將查詢結(jié)果轉(zhuǎn)化為對象,相當麻煩,開發(fā)效率低。

?基于JDBC開發(fā)效率相對低的情況,市面上各個組織,對JDBC進行封裝,產(chǎn)生各種數(shù)據(jù)庫操作層解決方案:

Hibernate 重量級的ORM框架

ibatis 輕量級ORM框架 與2010-06-16 改名 mybatis

Spring JPA

Mybatis plus

Spring JDBCTemplate

以上框架都是對JDBC的封裝,處理Java操作數(shù)據(jù)庫數(shù)據(jù)的問題。

2.?為什么要學習框架

2.1.1?提高開發(fā)效率

在Java中,框架在一定程度就是對某些功能的封裝,對外暴露統(tǒng)一操作API,可以簡化開發(fā)難度,提高開發(fā)效率。

2.1.2?提高代碼的可維護性

由于框架在一定程度上說,就是模板,所有基于某個框架進行開發(fā)的項目,肯定要遵循模板規(guī)則,那么在維護時,只需要了解模板規(guī)則即可。

2.1.3?可以提高代碼的健壯性

市面上相對比較流行的框架,被大多人使用,出現(xiàn)的問題能夠及時暴露,問題也能得到較快的修復。

3.?Mybatis概述 ?

3.1?簡介

? MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。

? Mybtais是一個ORM框架,輕量級的ORM框架。相對于重量級的ORM框架Hibernate而言,mybatis是一個半自動框架,而Hibernate是一個全自動框架。并且,Hibernate提出跨"平臺",Hinernate的跨平臺是指Hinernate可以在多種數(shù)據(jù)庫下進行操作,同一套代碼支持多種數(shù)據(jù)庫,HQL語句,Hibernate方言,對數(shù)據(jù)庫操作進行翻譯,根據(jù)不同的數(shù)據(jù),將API翻譯成不同的SQL,對數(shù)據(jù)進行操作,依賴ORM思想。

?Mybatis是一個半自動的框架,早期Hibernate在流行時,開發(fā)者發(fā)現(xiàn)Hibernate雖然功能強大,但是由于如果想使用全自動功能,將Hibernate和數(shù)據(jù)庫關(guān)心進行配置,配置很繁瑣,其二,Hibernate對功能進行全方面的封裝,將用戶的操作,轉(zhuǎn)化為SQL語句,然后進行數(shù)據(jù)庫操作,整個轉(zhuǎn)換過程是Hibernate,開發(fā)無法控制,如果要進行SQL語句優(yōu)化是沒法實現(xiàn)的。所以,在數(shù)據(jù)庫壓力逐漸增大的情況下,Hibernate框架性能問題就出現(xiàn)了?;谶@樣的情況,Mybatis框架應運而生,mybatis將SQL語句的定義控制權(quán),完全交給了開發(fā)者,并且暴露一套API,對JDBC中:事務,參數(shù),查詢結(jié)果等進行配置處理。Mybatis也是基于ORM思想.??

Mybatis(半自動化):還是需要書寫sql

Hibernate(全自動化):不需要寫sql就能操作數(shù)據(jù)庫--->HQL

3.2?ORM

ORM : Object relation mapping

對象關(guān)系映射

將數(shù)據(jù)庫信息和Java中實體類進行映射

users: ?1 ?張三 ?20 ?????????????User: id、uName、age

4.?Mybatis入門使用


4.1?創(chuàng)建數(shù)據(jù)庫和表


?


4.2?創(chuàng)建空項目


4.3?創(chuàng)建Maven的java項目



4.4?引入Mybatis相關(guān)jar包依賴

1、導入依賴

2、書寫mybatis的主配置文:連接信息 ?mybatis.xml ?

3、書寫存放sql語句的局部配置文件 ??xxx.xml(與dao層類的類名保持一致)

4、關(guān)聯(lián)主配置與局部配置

5、啟動mybatis,調(diào)用核心類測試

4.5?編寫實體類User

4.6?編寫映射文件UserMapper接口

4.7?編寫映射文件UserMapper.xml

4.8?編寫mybatis.xml核心配置文件

4.9?編寫測試類

?

4.10?執(zhí)行過程簡單分析

1.解析了xml 配置文件 ?---> configuration

2. 將映射文件信息 解析 ?mappedStatements ??map結(jié)構(gòu) ?每個 mapper文件中的指令 被封裝為MappedStatement

3. SqlSession 根據(jù)傳入 statement 的key 從mappedStatements 中獲取到對應 MappedStatement

4. MappedStatement 中已經(jīng)定義了好了參數(shù)類型 ?返回結(jié)果的類型 ?還有原生sql

5. 獲取原生sql 參數(shù)類型 返回結(jié)果的類型 ,根據(jù)參數(shù)類型 ?原生sql 可以內(nèi)部預處理 sql 將sql 發(fā)送給數(shù)據(jù)庫

6. 接收sql 執(zhí)行的結(jié)果 ,將其封裝為對應的返回類型


5.?Mybatis進行CRUD

5.1?方式 一:指令ID方式

根據(jù)mybatis將映射信息封裝為:MappedStatement對象,存在Map中,將namespace和指令ID當做key

根據(jù)key獲取對應MappedStatement對象,進行數(shù)據(jù)庫操作

5.1.1?創(chuàng)建項目修改pom.xml引入相關(guān)依賴

5.1.2?復制上個項目里面的所有類和配置

?


5.1.3?SqlSessionUtils工具類

5.1.4?數(shù)據(jù)庫數(shù)據(jù)操作類UserDao

5.1.5?數(shù)據(jù)庫數(shù)據(jù)操作映射配置UserMapper.xml

5.1.6?測試類

?

5.2?方式二:接口代理方式

使用Mapper接口的代理方式,根據(jù)方法名和映射文件中指令ID進行綁定,動態(tài)調(diào)用相關(guān)指令信息

5.2.1?創(chuàng)建項目修改pom.xml引入相關(guān)依賴

?

5.2.2?復制上個項目里面的所有類和配置文件

?


刪除 dao

5.2.3?創(chuàng)建UserMapper接口

5.2.4?UserMapper.xml

5.2.5?測試類

6.?Mybatis核心配置文件詳解

6.1?數(shù)據(jù)源配置詳解

6.2?引入db.properties配置文件詳解

6.2.1?創(chuàng)建db.properties文件


6.2.2?修改mybatis.xml文件

?

6.3?別名優(yōu)化詳解

【注意】:別外配置必須是在enviroments之前

6.4?日志配置詳解:有可能會報找不到日志類的異常

日志,就是將程序運行時,一些關(guān)鍵信息進行保存文件中的操作.當問題發(fā)生時,是無法觀察控制臺,將關(guān)鍵的信息保存在文件,便于后期檢查。

日志主要分為以下級別:

debug調(diào)試模式時進行記錄的調(diào)試信息

info具體信息

error 發(fā)生異常時可以進行記錄的方法

debug級別最低

info級別高于DEBUG

error級別最高

6.4.1?引入日志相關(guān)jar包

6.4.2?創(chuàng)建log4j.properties的日志配置文件

?

6.4.3?修改mybatis.xml配置文件

?

6.4.4?測試并查看E盤的logs目錄

?


7.?Mybatis映射配置文件詳解

7.1?結(jié)果映射

在mybatis中,默認將查詢的結(jié)果返回一個實體類對象,查詢結(jié)果和實體類根據(jù)結(jié)果列別名和類中屬性名一一對應。當查詢結(jié)果列別名和類屬性名不一致。解決方案有兩種:

l?將別名修改為一致

l?使用mybatis內(nèi)置結(jié)果映射處理器

7.1.1?在映射文件中新增映射關(guān)系

?

?

7.1.2?注意

l?映射關(guān)系中,column查詢結(jié)果的列別名,不是原始列名

l?在查詢指令中,resultMap屬性,指向定義的映射關(guān)系的ID

7.2?#和$(重點)

在mybatis中,會將開發(fā)者定義的sql進行解析,解析分為了2類sql:

靜態(tài)sql ,在解析時,直接將參數(shù)拼接到sql中,這種就是靜態(tài)sql??conn.createStatement()

動態(tài)sql,在解析時,會使用?這個占位符,替代參數(shù)

????conn.prepareStatement()

這兩種解析方式,mybatis是根據(jù)${}和#{}進行區(qū)分的

${}的sql是靜態(tài)sql??${uName} ?

#{}的sql是動態(tài)sql??#{uName} ??#{arg0} ?#{param1} ?#{0}

不論是靜態(tài)sql,還是動態(tài)sql都能獲取傳遞參數(shù),但是${}是使用的字符拼接,#{}使用PreparedStatement進行參數(shù)的預處理。

在一定程度上說,${}能實現(xiàn)的功能,#{}都能實現(xiàn),并且由于#{}PreparedStatement進行SQL的預處理,一定程度上可以防止SQL注入攻擊。所以在開發(fā)中,能使用#{}盡量使用#{}。
PreparedStatement預處理的本質(zhì)是將參數(shù)進行轉(zhuǎn)換為字符串,當做參數(shù)字符串處理。所以,如果參數(shù)信息是一個特殊的關(guān)鍵字,例如: 數(shù)據(jù)庫名,表名,函數(shù)名,內(nèi)置關(guān)鍵字,使用預處理,則關(guān)鍵字轉(zhuǎn)為了字符串,無效了,此時必須使用字符串拼接。

7.2.1?$示例


7.2.2?#示例

?

7.3?SQL片段

在開發(fā)中,需要書寫大量的SQL語句,并且這些SQL數(shù)據(jù)很大部分內(nèi)容是重復內(nèi)容,基于這樣的情況,mybatis提供模板,可以在模板中定義需要使用sql語句的部分內(nèi)容,然后在需要使用到這個部分內(nèi)容的地方直接引入。

使用sql標簽,定義SQL片段,使用include引入,sql片段

注意:

l?在sql片段中 id,是這個sql片段的唯一標識

l?在引入時,include標簽中,refid關(guān)聯(lián)sql片段的id

7.4?模糊查詢(重點)

在mybatis中,模糊查詢主要有3種方式:

l?like ?concat('%',#{關(guān)鍵字},'%') ??推薦

l?like '%${關(guān)鍵字}%'

l?mybatis推薦的bind標簽

7.4.1?方案一[推薦]

7.4.2?方案二[拼接]

使用$存在sql注入攻擊安全問題

7.4.3?方案三[bind]


7.5?多個參數(shù)問題(重點)

當mybatis傳遞參數(shù)存在多個時,mybatis支持三種方案:

argx 形式:arg 表示參數(shù),x表示參數(shù)索引

paramX形式: param表示參數(shù),x表示第幾個參數(shù)

使用注解為參數(shù)取別名 @Param

方案三

7.6?分頁查詢(重點)

在mybatis中,分頁查詢解決方案最本質(zhì)上回歸原生SQL進行處理。

l?查詢總頁數(shù),使用limit函數(shù)進行查詢相應的數(shù)據(jù)

l?mybatis中,提供了一個RowBounds這個類,用于進行分頁查詢數(shù)據(jù)

l?使用分頁插件:PageHelper(推薦)

7.6.1?方案[rowBounds] ?

使用RowBounds這種分頁查詢方式,在實際開發(fā)中是遠遠不夠使用的,這種方式只是返回的相應的數(shù)據(jù),總數(shù)據(jù)條數(shù),頁數(shù),分頁起始頁都需要開發(fā)者自己處理。

7.6.2?方案[分頁插件]

市面主流分頁插件: PageHelper

導入PageHelper的相關(guān)jar包

?或者

在mybatis核心配置文件中開啟插件

在代碼顯示聲明后面緊鄰(一次)查詢語句需要使用分頁

在PageHelper,每次開啟分頁,只對最近的一次查詢有效。如果要多次分頁查詢,需要多次開啟。

PageHelper是利用,攔截器原理,攔截最近的一次查詢,然后在其基礎拼接分頁信息。PageHelper只對最近一次查詢有效,這種模式,對本身的程序沒有侵入,所以,本身程序該怎么寫還是怎么寫。

7.7?新增自增長(重點)

在mybatis中,支持數(shù)據(jù)庫的自增長功能,因為在某些特殊的業(yè)務場景中,當前數(shù)據(jù)的ID,可能是另外某些數(shù)據(jù)的業(yè)務ID。

例如:

訂單:總訂單和子訂單

每個子訂單會有總訂單ID

先插入總訂單,并且要獲取總訂單ID

插入子訂單

Mybatis在insert指令中,提供了2個屬性:useGeneratedKeys、keyProperty、keyColumn

useGeneratedKeys:表示使用數(shù)據(jù)庫自增長

keyProperty:自增長的列對應的類中的屬性

keyColumn:自增長的列

Mybatis會自動將增長的值,封裝到傳入?yún)?shù)的屬性中。

注意:

?自增長值,會被自動封裝在對象參數(shù)中

7.8?動態(tài)SQL(重點)

動態(tài)SQL是指根據(jù)不同的參數(shù),產(chǎn)生不同的SQL語句。這樣的SQL就是動態(tài)SQL。

Mybatis提供了一下標簽,用于動態(tài)SQL的生成:

if

foreach

choose

where: 可以去除前置多余的and、or等掛關(guān)鍵字;不能去除后置

set

trim

7.8.1?if標簽

在if標簽中,test屬性是必須有,test屬性值是一個表達式,如果表達式值為true,則if標簽包裹的內(nèi)容會拼接在當前sql上。

and 并且

or 或者

== 等于

!= 不等于

示例:

?

7.8.2?foreach

循環(huán)標簽,循環(huán)標簽多用于批量操作。

例如:批量新增,批量刪除等等

collection?待循環(huán)的容器

item?指代 每次循環(huán)容器中的元素

open?開始循環(huán)是拼接字符串

close?循環(huán)結(jié)束拼接字符串

separator?每次循環(huán)之間拼接的字符串

index 循環(huán)索引

?choose

多條件分支標簽:choose.

在choose標簽,自上而下執(zhí)行when中表達式,如果表達式為true,則將相應的字符串拼接在sql后面,且終止判斷。如果所有的表達式都為false,則將otherwise中字符串,拼接在sql后面

?


7.8.3?where

在mybatis中,存在sql條件,當有多個sql條件時,需要處理and關(guān)鍵字問題,因為where后面的第一個條件不需要and,解決方案:

l?在where后面 拼接 1=1 類似的條件,這樣其他條件都不是第一個條件,都需要拼接and

l?mybatis 提供了where標簽,取代where關(guān)鍵字,默認去掉第一個條件 and

注意:

建議,只在查詢語句中使用where標簽,因為當where標簽中的條件都不成立時,會沒有where關(guān)鍵字。

?

7.8.4?set標簽

set標簽是取代sql語句中的set關(guān)鍵字。set表示后面數(shù)據(jù)的更新。各個字段,需要使用逗號分隔。

set標簽可以去掉最后一個逗號。

8.?緩存

mybatis為了提高查詢效率、性能。提供了緩存,緩存分為2類:

l?一級緩存

l?二級緩存

一級緩存:是指SqlSession級別的緩存,在同一個SqlSession,同樣的SQL語句只會執(zhí)行一次,不是第一次執(zhí)行的SQL會從緩存中獲取數(shù)據(jù)。

二級緩存: 是指SqlSessionFactory級別的緩存,在同一個SqlSessionFactory中,同樣的SQL語句,只會執(zhí)行一次,不是第一次執(zhí)行的SQL會從緩存中獲取數(shù)據(jù)。

注意:

不論一級緩存還是二級緩存,否是JVM中緩存。當服務器有多臺時,緩存容易發(fā)生無效,數(shù)據(jù)發(fā)生了更新。緩存沒有更新。在實際使用,如果數(shù)據(jù)可能發(fā)生比較頻繁的更新不建議使用mybatis。

8.1?一級緩存

8.2?二級緩存

二級緩存需要在映射文件中,開啟緩存:

<cache />??

并且被緩存的數(shù)據(jù)需要支持,序列化

9.?Mybatis注解

mybatis配置雖然相對簡單,但是還是麻煩。所以,mybatis為了簡化配置,也提供了注解。

常用注解:

l?@Select

l?@Insert

l?@Delete

l?@Update

?

10.?逆向工程

1、?快速幫我們生成實體類

2、生成單表的crud

11.?聯(lián)表查詢(難點)

11.1?多表查詢解決方案???

1.寫實體類,通過定義實體類,將多表的所有字段都涵蓋,解決多表查詢問題,但是,這種方案只能解決多對一,但是無法解決一對多問題。

例如:寫實體類可以解決,一個學生類中班級信息問題,但是無法解決班級類中學生信息問題。

學生信息是一個數(shù)組。

2.多次查詢。將需要結(jié)果拆分成多個簡單的單表查詢,連續(xù)查詢多次。使用Java代碼處理查詢結(jié)果。

例如:學生班級信息。

查詢某個學生學生信息及其班級信息。

根據(jù)ID查詢學生信息

從學生信息中獲取班級ID

根據(jù)班級ID查詢班級信息

查詢所有學生的信息及其班級信息

查詢所有學生(100)(注意學生數(shù)據(jù)量)

查詢所有班級(Map 使用ID 作為key 對象就是value)

循環(huán)學生,獲取班級ID,從班級數(shù)據(jù)中,獲取班級信息

注意:

?mybatis解決聯(lián)表查詢的方法就是基于以上方案

11.2?多對一

11.2.1?將查詢結(jié)果進行封裝

11.2.2?進行多次查詢

11.3?一對多

11.3.1?將查詢結(jié)果封裝

11.3.2?多次查詢

更多干貨我們下期再說!

下期會分享

第十章節(jié)

Spring

相關(guān)知識~

下期見!


教程揭秘 | 動力節(jié)點內(nèi)部Java零基礎教學文檔第九篇:Mybatis的評論 (共 條)

分享到微博請遵守國家法律
沂南县| 马山县| 汶川县| 淄博市| 唐河县| 项城市| 宣武区| 文水县| 安丘市| 溆浦县| 三亚市| 绥德县| 安多县| 城固县| 连南| 黔南| 贵阳市| 濉溪县| 金湖县| 朝阳县| 东乌珠穆沁旗| 绩溪县| 上犹县| 东至县| 葫芦岛市| 临猗县| 深水埗区| 丰台区| 武威市| 剑川县| 儋州市| 扎兰屯市| 顺平县| 西乡县| 桐城市| 铜梁县| 太湖县| 和田县| 广东省| 武安市| 大新县|