主頁 > 後端開發 > Mybatis知識點整理

Mybatis知識點整理

2021-08-16 10:40:51 後端開發

目錄

1、Mybatis概述

1.1 JDBC編程

1.3 Mybatis解決的問題

2、Mybatis入門案例

2.1 創建資料庫和表

2.2 創建maven專案,添加Mybatis的jar依賴

2.3 撰寫Mybatis的組態檔

2.4 撰寫物體類

2.5 撰寫ORM映射檔案

2.5.1 XML映射檔案必須與物體類在同一個包下面

2.5.2 XML映射檔案名稱必須是物體類名稱一致

2.6 將映射檔案注冊到mybatis的組態檔中

2.7 配置映射檔案的掃描位置

2.8 使用Mybatis框架的核心介面測驗

2.9. 配置日志檔案

2.9.1.添加jar依賴

2.9.2.添加日志組態檔

2.9.3.在mybatis組態檔中添加日志的配置

2.10.入門案例的增刪改查

2.10.0.注意:手動提交事務

2.10.0.在測驗類中使用測驗注解@Before @After減少重復代碼

2.10.1 根據ID查詢單個物件

2.10.2 增刪改

2.10.3.查詢所有

3、Mybatis物件分析

3.1 Resources

3.2 SqlSessionFactoryBuilder

3.3 SqlSessionFactory

3.4 SqlSession

3.5 Mybatis架構/作業流程

4、原有的Dao方式開發

4.1 創建sqlSession工具類

4.2 創建TeamDao介面和實作類

5.使用ThreadLocal優化sqlSession工具類

5.0.ThreadLocal的理解

5.1.SqlSession執行緒不安全處理方案

6、使用Mapper的介面撰寫Mybatis專案

6.1 什么是Mapper介面

6.2 使用Mapper動態代理

6.2.1 撰寫介面TeamMapper.java

6.2.2 getMapper方法獲取代理物件

6.3 實作原理

7、增刪改查中的細節

7.1 插入資料的時候回傳自增的id值

7.1.1.回傳Integer型別的自增id值

7.1.2.回傳字串型別的自增id值

7.2 輸入映射(傳參到sql)

7.2.1.使用下標方式#{arg0}或#{param1}

7.2.2.通過@Param注解傳遞多個傳參

?7.2.4. 通過pojo類傳遞多個引數

7.3 #{} 和 ${}的區別--面試中喜歡出的考題

7.3.2 ${}

7.4 輸出映射resultType

7.4.0.輸出pojo型別

7.4.1.輸出簡單型別(單行單列)可省

7.4.2.輸出map集合型別(單行多列)

7.4.3.輸出List集合型別(多行多列)

7.5. 輸出映射resultMap

7.6. 資料庫表中列與物體類屬性不一致的處理方式

7.6.1.使用列別名和resultType

7.6.2.使用resultMap

8、Mybatis的全域組態檔

8.1 全域組態檔配置的內容

8.2 屬性(properties)

8.3 設定 settings

8.4 型別別名 typeAliases

8.4.1 Mybatis中已經支持/內置的別名

8.4.1 Mybatis中已經支持的別名

8.4.2 自定義別名

8.5 映射器 Mappers(將映射檔案映射到mybatis組態檔)

8.5.1、 類路徑參考映射檔案

8.5.2、使用的mapper介面的完全限定名

8.5.3、將包內的映射器介面實作全部注冊為映射器--推薦

8.6 dataSource標簽

8.7 Mybatis如何管理事務

8.7.1、默認是需要手動提交事務的

8.7.2、自動提交事務

9、Mybatis中的關系映射

9.1 對一關系映射的處理方式(三種方式)

9.1.0.需求:查詢球員資訊包含所在球隊資訊

9.1.1 物體類

9.1.2 mapper介面

9.1.3 對一映射方式1:通過關聯物件打點呼叫屬性的方式

9.1.4 對一映射方式2:直接參考關聯物件的Mapper映射

9.1.5 對一映射方式3:直接參考關聯物件的單獨查詢的方法

9.1.6 測驗

9.2 對多關系的結果映射的兩種處理方式

9.2.0.查詢球隊資訊以及擁有的球員資訊

9.2.1 方式1:連接查詢+參考關聯物件的結果映射

9.2.2 方式2:不使用連接查詢+參考關聯物件的單獨查詢的方法

10、Mybatis動態SQL

10.1 where標簽構建動態SQL多條件查詢

10.1.1.原有寫法:根據不同條件拼接 SQL 陳述句

10.1.2.where標簽構建動態SQL多條件查詢

10.2 set標簽構建動態sql的更新update

10.2.1 原有的更新存在的弊端

10.3 forEach標簽構建動態sql的批量添加/洗掉

10.3.1 批量添加

10.3.2 批量洗掉

11 、分頁插件

11.1 jar依賴

11.2 在Mybatis全域組態檔中添加插件配置

11.3 使用插件

12、Mybatis快取

12.1 快取作用

12.2 一級快取:SqlSession級別的快取,自動開啟

12.2.1 一級快取作業原理

12.2.2 清空快取的方式

12.3 二級快取:Mapper級別的快取

12.3.1 使用二級快取步驟

12.3.2 二級快取的禁用

12.3.3 快取的屬性配置

13、反向生成插件

13.1 插件的配置

13.2 使用反向生成中的多條件查詢方法


1Mybatis概述

1.1 JDBC編程

1.2.說說你對Mybatis的了解

1.Mybatis 基于java的持久層框架,它的內部封裝了JDBC,讓開發人員只需要關注SQL陳述句本身,不需要花費精力在驅動的加載、連接的創建、Statement的創建等復雜的程序,

2.Mybatis 通過 XML 或注解的方式將要執行的各種的 statement 配置起來,并通過 java 物件和 statement 中的 sql 的動態引數進行映射生成最終執行的SQL 陳述句,最后 由mybatis框架執行SQL,并將結果直接映射為java物件
3.采用了 ORM思想 解決了物體類和資料庫表映射的問題,對 JDBC進行了封裝 ,屏蔽了 JDBCAPI 底層的訪問細節,避免我們與 jdbc api 打交道,就能完成對資料的持久化操作,

1.3 Mybatis解決的問題

1、資料庫連接的創建、釋放連接的頻繁操作造成資源的浪費從而影響系統的性能,

2SQL陳述句撰寫在代碼中,硬編碼造成代碼不容易維護,實際應用中SQL陳述句變化的可能性比較大,一旦變動就需要改變java類,

3、使用preparedStatement的時候傳遞引數使用占位符,也存在硬編碼,因為SQL陳述句變化,必須修改原始碼,

4、對結果集的決議中也存在硬編碼,

2Mybatis入門案例

2.1 創建資料庫和表

CREATE TABLE `team` (
     `teamId` int NOT NULL AUTO_INCREMENT COMMENT '球隊ID',
     `teamName` varchar(50) DEFAULT NULL COMMENT '球隊名稱', 
     `location` varchar(50) DEFAULT NULL COMMENT '球隊位置', 
     `createTime` date DEFAULT NULL COMMENT '球隊建立時間', 
      PRIMARY KEY (`teamId`) 
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2.2 創建maven專案,添加Mybatisjar依賴

創建個java的maven專案

2.3 撰寫Mybatis的組態檔

一般情況下:組態檔的名稱可以自定義,使用mybatis.xml,組態檔放置在java/resources中,

頭檔案去官網中復制粘貼,提供一個中文的網站,Mybatis網址

組態檔中配置mybatis的環境(資料源、事務型別)

2.4 撰寫物體類

物體類中的屬性必須與表中的列名保持一致,默認構造+set+get(不能少)

2.5 撰寫ORM映射檔案

我們是針對物體類Team.java和表Team進行ORM映射.

Mybatis 框架中, ORM 映射是針對 SQL 陳述句進行, Mybatis 框架將 SQL 陳述句抽取到了 XML 中,所以我們需要針對每個物體類撰寫 XML 映射檔案,

2.5.1 XML映射檔案必須與物體類在同一個包下面

2.5.2 XML映射檔案名稱必須是物體類名稱一致

頭檔案在網站復制即可,Mybatis網址

注意namespace、id、resultType分別表示什么,

2.6 將映射檔案注冊到mybatis的組態檔中

2.7 配置映射檔案的掃描位置

pom.xml 檔案配置映射檔案的掃描路徑
因為src/main/java目錄下的配置完檔案(.xml/.properties)是無法讀取到,需要在pom.xml中去指定組態檔的掃描路徑

2.8 使用Mybatis框架的核心介面測驗

2.9. 配置日志檔案

2.9.1.添加jar依賴

2.9.2.添加日志組態檔

resource 下添加 log4j.properties 組態檔

# Global logging configuration info warning error 
log4j.rootLogger=DEBUG,stdout 
# Console output... 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

2.9.3.在mybatis組態檔中添加日志的配置

2.10.入門案例的增刪改查

2.10.0.注意:手動提交事務

增刪改操作,必須手動提交事務,否則不生效

因為上面在mybatis配置中,指定了JDBC方式(Connection)管理事務,默認自動提交是false,

解決1.每執行一次增刪改sql,我們手動提交sqlSession.commit()

解決2.在獲取sqlSession會話時,開啟自動事務,引數true,即factory.openSession(true)

這只是在dao層操作事務,不推薦,將來事務都是在service層通過宣告式事務管理

物體類

2.10.0.在測驗類中使用測驗注解@Before @After減少重復代碼

2.10.1 根據ID查詢單個物件

parameterType:引數型別,sql中占位符型別,該屬性基本型別時可省略,物體型別則不可省略

resultType:回傳型別,執行這條sql后回傳什么型別的結果,基本型別可省略不寫,若集合則其元素型別-->

報錯原因:物體類沒有加默認構造方法

Team.xml的映射檔案中添加:

測驗類中添加如下內容:

2.10.2 增刪改

Team.xml 的映射檔案中添加:
測驗類中添加如下方法:

2.10.3.查詢所有

映射檔案添加

測驗類添加

3Mybatis物件分析

3.1 Resources

Resources 類,顧名思義就是資源,用于讀取資源檔案,其有很多方法通過加載并決議資源檔案,回傳不同型別的 IO 流物件,

3.2 SqlSessionFactoryBuilder

SqlSessionFactory 的 創 建 , 需 要 使 用 SqlSessionFactoryBuilder 對 象 的 build() 方 法 , 事實上使用 SqlSessionFactoryBuilder 的原因是將SqlSessionFactory 這個復雜物件的創建交由 Builder 來執行,也就是使用了 建造者設計模式

建造者模式 : 又稱生成器模式 , 是一種 物件的創建模式 , 可以將一個產品的內部表象與產品的生成程序分割開來 , 從而可以使一個建造程序生成具有不同的內部表象的產品( 將一個復雜物件的構建與它的表示分離, 使得同樣的構建程序可以創建不同的表示 ). 這樣用戶只需指定需要建造的型別就可以得到具體產品, 而不需要了解具體的建造程序和細節 .
在建造者模式中, 角色分指導者 (Director) 與建造者 (Builder): 用戶聯系指導者 , 指導者指揮建造者 , 最后得到產品 . 建造者模式可以強制實行一種分步驟進行的建造程序.

SqlSessionFactoryBuilder 充當的就是建造者角色 ,sqlSession就是我們最后得到的產品,

3.3 SqlSessionFactory

SqlSessionFactory 介面物件是一個重量級物件(系統開銷大的物件),是 執行緒安全 的,所以一個應用只需要一個該物件,創建SqlSession 需 SqlSessionFactory 介面的 openSession() 方法,

默認的 openSession()方法沒有引數,它會創建有如下特性的 SqlSession
1 、會開啟一個手動提交的事務(也就是不自動提交),
2 、將從由當前環境配置的 DataSource 實體中獲取 Connection 物件,事務隔離級別將會使用驅動或資料源的默認設定,
3 、預處理陳述句不會被復用,也不會批量處理更新,

openSession(true) :創建一個有自動提交功能的 SqlSession
openSession(false) :創建一個非自動提交功能的 SqlSession ,需手動提交
openSession() :同 openSession(false)

3.4 SqlSession

SqlSession 介面物件用于執行持久化操作(記憶體資料寫入資料庫),一個 SqlSession 對應著一次資料庫會話,一次會話以 SqlSession 物件的創建開始,以SqlSession 物件的關閉結束,

SqlSession 介面物件是 執行緒不安全 的,所以每次資料庫會話結束前,需要馬上呼叫其 close() 方法,將其關閉,再次需要會話,再次創建, SqlSession 在方法內部創建,使用完畢后關閉,

SqlSession 類中有超過 20 個方法,我們常用的幾乎都是執行語法相關的方法,

這些方法被用來執行定義在 SQL 映射的 XML 檔案中的 SELECT INSERT UPDATE DELETE 陳述句,它們都會自行解釋,每一句都使用陳述句的 ID 屬性和引數物件,引數可以是原生型別(自動裝箱或包裝類)、 JavaBean POJO Map

selectOne 和 selectList 的不同僅僅是 selectOne 必須回傳一個物件或 null 值,如果回傳值多于一個,那么就會拋出例外,

selectMap 稍微特殊一點,因為它會將回傳的物件的其中一個屬性作為 key 值,將物件作為 value 值,從而將多結果集轉為 Map 型別值,

3.5 Mybatis架構/作業流程

1 Mybatis.xml 檔案是 mybatis 框架的全域組態檔,配置了 mybatis 框架運行的環境等資訊,
Mapper1.xml..... SQL 的映射檔案,檔案中配置了所有的操作資料庫的 sql 陳述句, 在mybatis全域組態檔中去加載這些sql映射檔案
2 通過mybatis環境等配置資訊構建SqlSessionFactroy , 相當于是產生連接池
3 由會話工廠創建SqlSession即會話 (連接),操作資料庫需要通過 SqlSession 進行的,
4 Mybatis 底層自定義了 Executor執行器 的介面操作資料庫, Executor 介面有兩個實作,一個基本的執行器,一個是快取的執行器,
5 Mapped statement 也是 mybatis 框架一個底層的封裝物件,他包裝了 mybatis 配置資訊以及 sql 映射資訊, Mapper.xml檔案中的一個SQL陳述句對應一個Mapped statement物件 sql id 就是 Mapped statement id
6 Mapped statement SQL 執行輸入引數的定義,輸入引數包括 HashMap 、基本型別、 pojo, Executor通過Mapped statemen在執行SQL陳述句前進行輸入映射即將輸入java物件映射到sql陳述句中,執行完畢SQL之后,輸出映射就是JDBC編碼中的對preparedStatement 執行結果的定義,

4、原有的Dao方式開發

4.1 創建sqlSession工具類

4.2 創建TeamDao介面和實作類

測驗:

sql映射檔案Team.xml

結果

5.使用ThreadLocal優化sqlSession工具類

5.0.ThreadLocal的理解

ThreadLocal 并非是一個執行緒的本地實作版本,它并不是一個 Thread ,而是 threadlocalvariable( 執行緒區域變數 ) ,也許把它命名為 ThreadLocalVar更加合適, 執行緒區域變數 (ThreadLocal) 其實的功用非常簡單,就是這個變數 為每一個使用該變數的執行緒都提供一個變數值的副本 , 是Java 中一種較為特殊的 執行緒系結機制 ,是 每一個執行緒都可以獨立地改變自己的副本,而不會和其它執行緒的副本沖突 A執行緒改變,不會影響B執行緒
實體:

5.1.SqlSession執行緒不安全處理方案

保證多個執行緒使用的sqlSession是相互獨立的,沒有關聯,若A、B使用同一個sqlSession,若A使用完close關閉sqlSession,那么B就無法執行了,可以給每一個執行緒系結一個副本的sqlSession,這就需要使用ThreadLocal,

優化后的工具類

6、使用Mapper的介面撰寫Mybatis專案

6.1 什么是Mapper介面

在前面例子中自定義 Dao 介面實作類時發現一個問題: Dao 的實作類其實并沒有干什么實質性的作業,它僅僅就是通過 SqlSession 的相關API 定位到映射檔案 mapper 中相應 id SQL 陳述句,真正對 DB 進行操作的作業其實是由框架通過 mapper 中的 SQL 完成的,
所以, MyBatis 框架就拋開了 Dao 的實作類,直接定位到映射檔案 mapper 中的相應 SQL 陳述句,對DB 進行操作,這種對 Dao 的實作方式稱為 Mapper介面 的動態代理方式,
就是我們不再需要撰寫dao介面的實作類,直接由mapper介面的動態代理,在程式運行的時候代理我們實作介面實作類,最終由mybatis操作db,
Mapper 動態代理方式無需程式員實作 Dao 介面, 介面是由 MyBatis 結合映射檔案自動生成的動態代理實作的,

6.2 使用Mapper動態代理

注意,通過Mapper介面 的動態代理幫我們生成了介面實作類,介面的方法要與映射檔案中的對應的id名稱一致,否則無法定位到指定的sql,

6.2.1 撰寫介面TeamMapper.java

創建TeamMapper.xml檔案 , Team.xml 內容幾乎一樣,只有 namespace="com.chen.mapper.TeamMapper" 修改為介面的完全限定名

mybatis.xml組態檔中注冊映射檔案

6.2.2 getMapper方法獲取代理物件

只需呼叫 SqlSession getMapper()方法,即可獲取指定介面的實作類物件,

6.3 實作原理

Mapper介面的動態代理是如何在程式運行期間幫我們創建介面的實作類物件的?

我們是通過SqlSession 的 getMapper()方法獲取到了介面的實作類物件,該方法是基于jdk的動態代理在程式運行的時候代理我們創建介面物件,就是通過Proxy.newProxyInstance()方法進行的動態代理,第一引數傳遞類加載,第二個引數傳遞介面類集合,第三個引數回呼程式撰寫代理規則,在這里代理生成介面實作類,

7、增刪改查中的細節

7.1 插入資料的時候回傳自增的id值

即我們將一個物件插入資料庫中時,是不提供主鍵id的值得,id自增自動賦值,那么現在希望插入資料后回傳這條資料的id值?

7.1.1.回傳Integer型別的自增id值

Team物體類

TeamMapper介面(只是用add)

TeamMapper.xml映射檔案(只看add)

注冊TeamMapper.xml映射檔案到mybatis組態檔

測驗

7.1.2.回傳字串型別的自增id值

添加一張新表:球隊記錄表

CREATE TABLE `gamerecord` (
  `recordId` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `homeTeamId` int DEFAULT NULL COMMENT '主隊ID',
  `gameDate` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '比賽日期',
  `score` int DEFAULT NULL COMMENT '得分',
  `visitingTeamId` int DEFAULT NULL COMMENT '客隊ID',
  PRIMARY KEY (`recordId`) USING BTREE,
  KEY `homeTeamId` (`homeTeamId`) USING BTREE,
  KEY `visitingTeamId` (`visitingTeamId`) USING BTREE,
  CONSTRAINT `gamerecord_ibfk_1` FOREIGN KEY (`homeTeamId`) REFERENCES `team` (`teamId`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `gamerecord_ibfk_2` FOREIGN KEY (`visitingTeamId`) REFERENCES `team` (`teamId`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;

物體類:球隊記錄物體類

mapper介面GameRecordMapper

映射檔案GameRecordMapper.xml,添加selectKey節點

測驗

7.2 輸入映射(傳參到sql)

7.2.0.parameterType只能接收一個引數

接收的是基本型別(Integer/String..)的話是可以省略parameterType該屬性、若是物體類物件,那么sql中占位符位置必須是物體類中屬性,

7.2.1.使用下標方式#{arg0}或#{param1}

物體類還是Team

mapper介面還是TeamMapper,新添加方法

TeamMapper.xml組態檔中添加如下:

測驗類添加方法:

7.2.2.通過@Param注解傳遞多個傳參

在方法形參前加 @Param(" 自定義引數名稱 ") mapper 檔案中使用 #{ 自定義引數名稱 } 方式傳參,
TeamMapper 介面添加如下內容:
TeamMapper.xml映射檔案添加

測驗

7.2.3.通過 map 來傳遞多個引數
Map 集合可以存盤多個值,使用 Map mapper 檔案一次傳入多個引數, Map 集合使用 String key Object 型別的值存盤引數, mapper 檔案使用 # { key } 參考引數值

TeamMapper 介面添加如下內容:

TeamMapper.xml組態檔中添加如下

測驗類添加方法:

7.2.4. 通過pojo類傳遞多個引數

map傳遞多個引數類似,要求映射檔案中的引數占位符必須和pojo類中的屬性完全一致,

自己封裝的查詢條件的類

TeamMapper介面添加如下內容:

TeamMapper.xml 組態檔中添加如下:

測驗

總結:

7.3 #{} ${}的區別--面試中喜歡出的考題

7.3.1 #{}
#{} 表示一個占位符,通知Mybatis 使用實際的引數值代替,
并使用 PrepareStatement 物件執行 sql 陳述句 , #{…} 代替 sql 陳述句的 “?” ,這個是 Mybatis 中的首選做法,安全迅速

7.3.2 ${}

${} 表示字串原樣替換 ,通知 Mybatis 使用 $ 包含的 字串 替換所在位置,
使用 Statement 或者 PreparedStatement sql 陳述句和 ${} 的內容連接起來, 一般用在替換表名,
列名,不同列排序等操作
例如:根據球隊名稱,球隊位置查詢球隊串列
方式 1 :sql中直接給出列名
teamMapper介面

teamMapper.xml

測驗

方拾二:sql中使用${}代替列名,使用不同列作為查詢條件

teamMapper介面

teamMapper.xml測驗

7.4 輸出映射resultType

resultType: 執行 sql 得到 ResultSet 轉換的型別,使用型別的完全限定名或別名,如果回傳的是集合,設定的是集合元素的型別,而不是集合本身, resultType 和 resultMap, 不能同時使用

7.4.0.輸出pojo型別

7.4.1.輸出簡單型別(單行單列)可省

如果查詢sql回傳的是簡單型別且是單行單列(只要一個值),resultType寫值得型別或可以省略

案例:回傳球隊的總記錄數
teamMapper介面

teamMapper.xml映射檔案

測驗

7.4.2.輸出map集合型別(單行多列)

teamMapper介面

teamMapper.xml映射檔案

測驗

7.4.3.輸出List集合型別(多行多列)

輸出list集合型別--當回傳多行多列時使用,list中元素是map,每個map描述一條記錄

teamMapper介面

teamMapper.xml

測驗

當我們只需要查詢表中幾列資料的時候可以將 sql 的查詢結果作為 Map key value ,一般使用的是 Map<Object,Object>.,Map 作為介面回傳值, sql 陳述句的查詢結果最多只能有一條記錄,大于一條記錄會拋出 TooManyResultsException 例外,
如果有多行,使用 List<Map<Object,Object>>.

7.5. 輸出映射resultMap

當使用resultType="com.chen.pojo.Team"回傳Team物件時,mybatis會把sql查詢結果自動映射到Team物件中,前提是Team屬性與表的列名是一致的,那么當不一致時,這樣寫就會報錯,這時就需要使用resultMap去自定義表和物體類的映射關系

我們可以使用resultMap 去撰寫表中的列與物體類中屬性的映射,更靈活把列值賦值給指定屬性,
常用在列名和 java 物件屬性名不一樣的情況,
使用方式:
1.先定義resultMap,指定列名和屬性的對應關系
2.在<select>中把resultType替換為resultMap

teamMapper介面

teamMapper.xml映射檔案

測驗

7.6. 資料庫表中列與物體類屬性不一致的處理方式

準備作業:創建表:
CREATE TABLE `users` (
  `user_id` int NOT NULL AUTO_INCREMENT COMMENT '用戶id',
  `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '用戶姓名',
  `user_age` int DEFAULT NULL COMMENT '用戶年齡',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;

7.6.1.使用列別名和resultType

資料庫表中列與物體類屬性不一致,且物體類屬性不能修改情況下, 可以給列起別名,讓列的別名和物體類屬性一致,這樣去映射
物體類 Users.java
介面 UsersMapper.java
映射檔案 UsersMapper.xml
映射檔案注冊到mybatis組態檔
測驗類 TestUsersMapper.java

7.6.2.使用resultMap

見上面7.6.1

8Mybatis的全域組態檔

使用的 mybatis.xml 就是 Mybatis 的全域組態檔,
全域組態檔需要在頭部使用約束檔案
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

8.1 全域組態檔配置的內容

MyBatis 組態檔包含了會影響 MyBatis 行為的設定和屬性資訊, 配置檔案的頂層結構如下:
configuration (配置)
properties--屬性:加載外部的組態檔,例如加載資料庫的連接資訊
Settings--全域配置引數:例如日志配置
typeAliases--型別別名
typeHandlers----型別處理器
objectFactory-----物件工廠
Plugins------插件:例如分頁插件
Environments----環境集合屬性物件
environment(環境變數)
transactionManager(事務管理器)
dataSource(資料源)
Mappers---映射器:注冊映射檔案用

8.2 屬性(properties

屬性可以在外部進行配置,并可以進行動態替換 ,我們既可以在 properties 元素的子元素中設定(例如 DataSource 節點中的 properties 節點),也可以在 Java 屬性檔案中配置這些屬性,
資料源中有連接資料庫的四個引數資料,我們一般都是放在專門的屬性檔案中, mybatis 的全域組態檔直接從屬性檔案中讀取資料即可,
1 、在 resources 目錄創建 jdbc.properties 檔案,檔案名稱可以自定義,
jdbc.driver=com.mysql.cj.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3306/team?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT 
jdbc.username=root 
jdbc.password=root
2 mybatis 的全域組態檔引入屬性檔案
<properties resource = "jdbc.properties" />
3 、使用屬性檔案中的值
properties 元素的子元素中設定,這種寫法注意url中&需要轉義,

8.3 設定 settings

MyBatis 中極為重要的調整設定,它們會改變 MyBatis 的運行時行為 . 例如我們配置的日志就是應用之一,其余內容參考 設定檔案
一個配置完整的 settings 元素的示例如下:

8.4 型別別名 typeAliases

型別別名可為 Java 型別設定縮寫名字, 僅用于 XML 配置,意在降低冗余的全限定類名書寫,
就是給xml中這些類的完全限定名起給簡單的別名, 注意不要給namespace起別名

8.4.1 Mybatis中已經支持/內置的別名

下面是一些為常見的 Java 型別內建的型別別名,它們都是不區分大小寫的,注意,為了應對原始型別的命名重復,采取了特殊的命名風格,

8.4.1 Mybatis中已經支持的別名

下面是一些為常見的 Java 型別內建的型別別名,它們都是不區分大小寫的,注意,為了應對原始型別的命名重復,采取了特殊的命名風格,

8.4.2 自定義別名

對于自定義的類,我們可以給其起個別名

在組態檔配置別名,注意查看<typeAliases>該放在哪個位置,通過

<configuration>進入查看配置順序

可以直接使用別名替代全類名

8.5 映射器 Mappers(將映射檔案映射到mybatis組態檔)

將映射檔案映射到mybatis組態檔中,
配置有多種方式:

8.5.1、 類路徑參考映射檔案

語法: <mapper resource=""/>
使用相對于類路徑的資源 , classpath 路徑查找檔案
例如: <mapper resource="com/chen/mapper/TeamMapper.xml" />

8.5.2、使用的mapper介面的完全限定名

語法 :<mapper class=""/>
使用的 mapper 介面的完全限定名
要求:介面和映射檔案同包同名
例如 <mapper class="com.kkb.mapper.GameRecordMapper"/>

8.5.3、將包內的映射器介面實作全部注冊為映射器--推薦

語法 :<package name=""/>

指定包下的所有Mapper介面

如: <package name="com.chen.mapper"/>
注意:此種方法要求 Mapper 介面名稱和 mapper 映射檔案名稱相同,且在同一個目錄中,

8.6 dataSource標簽

Mybatis 中訪問資料庫支持連接池技術,而且是采用的自己的連接池技術,在 Mybatis mybatis.xml 組態檔中,通過來實作 Mybatis 中連接池的配置, MyBatis 在初始化時,根據的 type 屬性來創建相應型別的的資料源 DataSource
Mybatis 的資料源分為三類
UNPOOLED: 不使用連接池的資料源
POOLED: 使用連接池的資料源
JNDI :使用 JNDI 實作的資料源
前兩個資料源都實作 javax.sql.DataSource 介面

8.7 Mybatis如何管理事務

8.7.1、默認是需要手動提交事務的

Mybatis 框架是對 JDBC 的封裝,所以 Mybatis 框架的事務控制方式,本身也是用 JDBC Connection 物件的 commit(), rollback() .Connection 物件的 setAutoCommit() 方法來設定事務提交方式的,自動提交和手工提交,
<transactionManager type="JDBC"/>
在mybatis配置中使用該標簽指定 MyBatis 所使用的事務管理器,
MyBatis 支持兩種事務管理器型別 :jdbc 與 managed

JDBC :使用 JDBC 的事務管理機制,通過 Connection 物件的 commit() 方法提交,通過 rollback() 方法 回滾,默認情況下, mybatis 將自動提交功能關閉了,改為了手動提交,觀察 日志可以看出,所以我們在程式中都需要自己提交事務或者回滾事務,

managed:由容器來管理事務的整個生命周期(如Spring容器),

8.7.2、自動提交事務

SqlSessionFactory openSession 方法多載,可以設定自動提交的方式,
如果 sqlSession = SqlSessionFactory.openSession(true); 引數設定為 true,再次執行增刪改的時候就不需要執行sqlSession.commit()方法,事務會自動提交

9Mybatis中的關系映射

就是如何給一個物體類中基本屬性以及關聯屬性(物件/list集合)去映射查詢的結果,通常是一對多關系的兩表連接查詢中遇到,

或者說對一/對多關系的結果映射的處理方式有哪些

表結構如圖
附表的外鍵指向主表的主鍵

球隊與球員關系:一對多關系

一個球隊有多個球員

一個球員屬于一個球隊

在java中球員如何實作多對一的關系的系結,在mybatis中又是如何進行對一關系的映射?

在java中球隊如何實作一對多的關系的系結,在mybatis中又是如何進行對多關系的映射?

連接查詢的結果集(查詢球員資訊包含所在球隊資訊)在mybatis中是如何映射到物體類的?

9.1 對一關系映射的處理方式(三種方式)

9.1.0.需求:查詢球員資訊包含所在球隊資訊

9.1.1 物體類

添加關聯欄位Team球隊物件

9.1.2 mapper介面

9.1.3 對一映射方式1:通過關聯物件打點呼叫屬性的方式

方式1:對一關系的映射:兩表的連接查詢+通過關聯物件打點呼叫屬性的方式

 
 

PlayerMapper介面

PlayerMapper.xml


baseResultMap映射

測驗

9.1.4 對一映射方式2:直接參考關聯物件的Mapper映射

要求: 1 、兩表的連接查詢
2、關聯物件中已經存在被參考的resultMap
 
 

PlayerMapper.xml 映射檔案

resultMap所繼承當前映射檔案中的baseResultMap

resultMap所參考的TeamMapper映射檔案中的baseResultMap

測驗

9.1.5 對一映射方式3:直接參考關聯物件的單獨查詢的方法

要求:1、不需要兩表的連接查詢 ,拆開查詢

2、關聯物件中已經存在被參考的查詢方法

 
 

同上,這里只展示映射檔案添加的內容:

9.1.6 測驗

9.2 對多關系的結果映射的兩種處理方式

9.2.0.查詢球隊資訊以及擁有的球員資訊

Team球隊物體類 添加關聯欄位List集合存盤球隊的球員

9.2.1 方式1:連接查詢+參考關聯物件的結果映射

 
 

TeamMapper介面添加方法

TeamMapper.xml映射檔案

測驗

9.2.2 方式2:不使用連接查詢+參考關聯物件的單獨查詢的方法

 
 

先在PlayerMapper介面中定義根據teamId查詢球員的方法

PlayerMapper.xml映射檔案中

TeamMapper介面定義方法

TeamMapper.xml映射檔案

測驗

10、Mybatis動態SQL

Mybatis使用標簽構建動態SQL陳述句

動態 SQL MyBatis 的強大特性之一,如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 陳述句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉串列最后一個列名的逗號,利用動態 SQL ,可以徹底擺脫這種痛苦,
使用動態 SQL 并非一件易事,但借助可用于任何 SQL 映射陳述句中的強大的動態 SQL 語言, MyBatis 顯著地提升了這一特性的易用性,
咱們之前學習過 JSTL ,所以動態 SQL 元素會讓你感覺似曾相識,在 MyBatis 之前的版本中,需要花時間了解大量的元素,借助功能強大的基于 OGNL 的運算式, MyBatis 3 替換了之前的大部分元素,大大精簡了元素種類,現在要學習的元素種類比原來的一半還要少,

10.1 where標簽構建動態SQL多條件查詢

案例:球隊的多條件查詢

10.1.1.原有寫法:根據不同條件拼接 SQL 陳述句

10.1.2.where標簽構建動態SQL多條件查詢

自己封裝的查詢條件類 QueryTeamVO.java

TeamMapper.java 介面添加:

TeamMapper.xml映射檔案添加:

測驗

10.2 set標簽構建動態sql的更新update

10.2.1 原有的更新存在的弊端

當前臺只是更新team中幾個屬性,會導致team其它屬性資料丟失

TeamMapper介面

TeamMapper.xml映射檔案

測驗

10.2.2 使用 set 標簽構建動態的 SQL 陳述句

TeamMapper介面

TeamMapper.xml映射檔案

測驗

10.3 forEach標簽構建動態sql的批量添加/洗掉

10.3.1 批量添加

TeamMapper介面

TeamMapper.xml映射檔案

測驗

10.3.2 批量洗掉

TeamMapper介面

TeamMapper.xml映射檔案

測驗

11 、分頁插件

11.1 jar依賴

11.2 Mybatis全域組態檔中添加插件配置

mybatis中的配置都是有順序要求的

11.3 使用插件

12Mybatis快取

12.1 快取作用

快取是一般的 ORM 框架都會提供的功能,目的就是 提升查詢的效率和減少資料庫的壓力 ,將經常查詢的資料存在快取(記憶體)中,用戶查詢該資料的時候不需要從磁盤(關系型資料庫檔案)上查詢,而是 直接從快取中查詢,提高查詢效率,解決高并發問題

MyBatis 也有一級快取和二級快取,并且預留了集成第三方快取的介面/中間件,如果專案比較小,對快取要求不高,可以使用一級二級快取就足夠了,對并發非常高的大型專案,一般選擇第三方的快取中間件
只有在查詢的時候才會去快取查找,增刪改操作的還是資料庫,并清空快取,

12.2 一級快取:SqlSession級別的快取,自動開啟

12.2.1 一級快取作業原理

在操作資料庫時需要構造 sqlSession 物件,在物件中有一個 ( 記憶體區域 ) 資料結構( HashMap )用于存盤快取資料,不同的 sqlSession 之間的快取資料區域( HashMap )是互相不影響的,
一級快取的 作用域 是同一個 SqlSession ,在同一個 sqlSession 中兩次執行相同的 sql 陳述句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率
當一個 sqlSession 結束后該 sqlSession 中的一級快取也就不存在了,
Mybatis 默認開啟一級快取,存在記憶體中 ( 本地快取 ) 不能被關閉,可以呼叫 clearCache() 來清空本地快取,或者改變快取的作用域,

當用戶發起第一次查詢 team=1001 的時候,先去快取中查找是否有 team=1001 的物件;如果沒有,繼續向資料庫中發送查詢陳述句,查詢成功之后會將 teamId=1001 的結果存入快取中;
當用戶發起第 2 次查詢 team=1001 的時候,先去快取中查找是否有 team=1001 的物件,因為第一次查詢成功之后已經存盤到快取中,此時可以直接從快取中獲取到該資料,意味著不需要再去向資料庫發送查詢陳述句,
如果 SqlSession 執行了 commit( 有增刪改的操作 ) ,此時該 SqlSession 對應的快取區域被整個清空,目的避免臟讀,
前提: SqlSession 未關閉,

12.2.2 清空快取的方式

手動清空/執行增刪改并提交后自動清空/關倍訓話/xml中重繪快取/提交回滾都會清空快取

1、 session.clearCache( ) ;
2 execute update(增刪改) ;
3 session.close( );
4 xml 配置 flushCache="true"
5 rollback
6 commit

12.3 二級快取:Mapper級別的快取

12.3.0.二級快取作業原理

當多個SqlSession 去查詢同一個 Mapper 的同一條 sql 陳述句(引數相同), 得到資料會存在二級快取區域,多個 SqlSession 可以共用二級快取,二級快取是跨 SqlSession的,同樣的當增刪改并提交后快取也會被清空,

二級快取是多個 SqlSession 共享的,其 作用域 mapper 的同一個 namespace

不同的 sqlSession 兩次執行相同 namespace 下的 sql 陳述句引數相同即最終執行相同的 sql 陳述句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率,

Mybatis 默認沒有開啟二級快取,需要在 setting 全域引數中配置開啟二級快取,
如果快取中有資料就不用從資料庫中獲取,大大提高系統性能,
如果兩個session不是從同一個Factory獲取,那么二級快取將不起作用,
二級快取原理圖:

12.3.1 使用二級快取步驟

1.在mybatis組態檔中開啟二級快取

2.在需要二級快取的Mapper中添加快取標記

3.物體類必須實作Serializable介面

因為快取是需要寫入資料的

4.測驗二級快取
如果兩個session不是從同一個Factory獲取,那么二級快取將不起作用,

12.3.2 二級快取的禁用

當在Mapper映射檔案中使用了二級快取,那么該映射檔案中所有的select陳述句都會啟用快取,我們可以去禁用某個sql查詢,

對于變化比較頻繁的 SQL ,可以禁用二級快取,
在開始了二級快取的 XML 中對應的 statement 中設定 useCache=false 禁用當前 Select 陳述句的二級快取,意味著該 SQL 陳述句每次只需都去查詢資料庫,不會查詢快取,
useCache 默認值是 true ,對于一些很重要的資料盡不放在二級快取中,

12.3.3 快取的屬性配置

快取中有哪些屬性

1.映射陳述句檔案中的所有select陳述句將會被快取;
2.映射陳述句檔案中的所有CUD操作將會重繪快取;
3.快取會默認使用LRU(Least Recently Used)演算法來識訓;
3.1、LRU – 最近最少使用的:移除最長時間不被使用的物件,
3.2、FIFO – 先進先出:按物件進入快取的順序來移除它們,
3.3、SOFT – 軟參考:移除基于垃圾回收器狀態和軟參考規則的物件,
3.4、WEAK – 弱參考:更積極地移除基于垃圾收集器狀態和弱參考規則的物件,
4.快取會根據指定的時間間隔來重繪(默認情況下沒有重繪間隔,快取僅僅呼叫陳述句時重繪);
5.快取會存盤串列集合或物件(無論查詢方法回傳什么),默認存盤1024個物件,
6.快取會被視為是read/write(可讀/可寫)的快取,意味著檢索物件不是共享的,而且可以安全地被呼叫者修改,而不干擾其他呼叫者或執行緒所做的潛在修改,

如果想在命名空間中共享相同的快取配置和實體,可以使用cache-ref 元素來參考另外一個快取

<cache-ref namespace="com.kkb.mapper.TeamMapper" />

// 參考 TeamMapper 命名空間中的 cache

13、反向生成插件

13.0.反向生成幾個注意點

根據單表反向生成這些內容,包括單表的最基本的增刪改查、還有介面、映射檔案,包括動態查詢,動態的插入更新,多條件查詢都寫好了,只要是單表操作,都給我們生成了,我們只需要參考方法就可以了,sql陳述句都寫好的,

同一張表只能一次反向生成,除非洗掉掉之前生成的內容,不然再一次反向生成的內容會追加的,比如出現兩個BaseResultMap,

如果其它資料庫有相同的表,也會被反向生成的

13.1 插件的配置

pom.xml 檔案中的中中添加如下插件配置

generatorConfig.xml 內容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置生成器 -->
<!--注意:
    1.同一張表只能一次反向生成,除非洗掉掉之前生成的內容,不然再一次反向生成的內容會追加的,比如出現兩個BaseResultMap
    2..如果其它資料庫有相同的表,也會被反向生成的-->
<generatorConfiguration>
    <!--1、資料庫驅動jar:添加自己的jar路徑 -->
    <classPathEntry location="E:\mysql8.0驅動程式\mysql-connector-java-8.0.16.jar" />
    <context id="MyBatis" targetRuntime="MyBatis3">
        <!--去除注釋 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--2、資料庫連接 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/team?useUnicode=true&amp;characterEncoding=utf-8&amp;
                        useSSL=false&amp;serverTimezone=GMT" userId="root" password="64531515z">
        </jdbcConnection>
        <!-- 默認false,把JDBC decimal 和 numeric 型別決議為 Integer;
            為 true時把JDBC decimal和numericC型別決議為java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!--3、生成物體類 指定包名 以及生成的地址 (可以自定義地址,但是路徑不存在不會自動創建 使用Maven生成在target目錄下,會自動創建)-->
        <javaModelGenerator targetPackage="org.bowei.pojo" targetProject="src\main\java">
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!--4、生成SQLmapper.xml映射檔案 -->
        <sqlMapGenerator targetPackage="org.bowei.mapper" targetProject="src\main\resources"> </sqlMapGenerator>
        <!--5、生成Dao(Mapper)介面檔案,-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="org.bowei.mapper" targetProject="src\main\java"> </javaClientGenerator>
        <!--6、要生成哪些表(更改tableName和domainObjectName就可以) -->
        <!-- tableName:要生成的表名
        enableCountByExample:Count陳述句中加入where條件查詢,默認為true開啟
        enableUpdateByExample:Update陳述句中加入where條件查詢,默認為true開啟
        enableDeleteByExample:Delete陳述句中加入where條件查詢,默認為true開啟
        enableSelectByExample:Select多條陳述句中加入where條件查詢,默認為true開啟
        selectByExampleQueryId:Select單個物件陳述句中加入where條件查詢,默認為true開啟 -->
        <!--
            <table tableName="Team"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableUpdateByPrimaryKey="false"
               enableDeleteByExample="false"
               enableDeleteByPrimaryKey="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
            <property name="useActualColumnNames" value="true"/>
        </table>
        -->
        <!--根據表反向生成這些內容,包括
        單表的最基本的增刪改查、還有介面、映射檔案,包括動態查詢,多條件查詢都寫好了,只要是單表操作,我們就不需要動,只需要選擇要用的-->
        <table tableName="Users">
            <!--表不區分大小,比如表欄位teamId,由表生成的物體類屬性是teamid,下面設定就是針對這個問題-->
            <property name="useActualColumnNames" value="true"/>
        </table>
    </context>
</generatorConfiguration>

我們只需要提供資料表,以及反向生成插件和配置即可,

生成后檢查映射檔案中只有一個ResultMap就表示生成正常,沒有同名的表被生成,可以看到生成的映射檔案中你能想到的所有單表查詢的sql都寫好了,包括動態的更新、插入(即物件中屬性不全都有值),多條件查詢等,我們只需要參考id名即可,

13.2 使用反向生成中的多條件查詢方法

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/293950.html

標籤:java

上一篇:學弟吐槽:太卷了!現在Android面試“質量”都這么高嗎?

下一篇:Android的java的報錯提示:Could not find com.android.tools.build:gradle:4.2.2.

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more