MyBatis 操作數據庫

目錄

  • 1、MyBatis 是什么
  • 2、配置 MyBatis 開發環境
    • 2.1、添加 MyBatis 框架支持
      • 2.1.1、老項目添加 MyBatis
      • 2.1.2、新項目添加 MyBatis
    • 2.2、配置數據庫連接字符串
    • 2.3、配置 MyBatis 中的 XML 路徑
  • 3、添加業務代碼
    • 3.1、添加實體類
    • 3.2、添加 mapper 接口
    • 3.3、添加 xml 文件
    • 3.4、添加 Service
    • 3.5、添加 Controller
    • 3.6、Postman 測試
  • 4、數據的增刪改
    • 4.1、參數占位符
    • 4.2、增加數據
    • 4.3、刪除數據
    • 4.4、修改數據
  • 5、數據的查詢
    • 5.1、單表查詢
      • 5.1.1、like 查詢
      • 5.1.2、單表查詢
    • 5.2、多表查詢
      • 5.2.1、返回字典映射:resultMap
      • 5.2.2、一對一的表映射
      • 5.2.3、一對多的表映射

1、MyBatis 是什么

MyBatis 是一個操作數據庫的持久層框架,它支持自定義 SQL、存儲過程以及高級映射,是更簡單完成程序和數據庫交互的工具,也就是更簡單的操作和讀取數據庫的工具。

在這里插入圖片描述
MyBatis 是一個 ORM(Object Relational Mapping,即對象關系映射)框架,在面向對象編程語言中,將關系型數據庫中的數據和對象建立起映射關系,進而自動完成數據與對象之間的轉換:

  1. 將輸入數據(即傳入的對象)+ SQL 映射成原生 SQL
  2. 將結果集映射為返回對象,即輸出對象

ORM 將數據庫映射為對象:

  1. 數據庫表(table)-> 類(class)
  2. 記錄(record,即行數據)-> 對象(object)
  3. 字段(field)-> 對象的屬性(attribute)

一般來說,ORM 框架會把數據庫的每張表映射成一個類,也就是說使用 MyBatis 可以像操作對象一樣操作數據庫的表,可以實現對象和數據庫表之間的轉換。

2、配置 MyBatis 開發環境

2.1、添加 MyBatis 框架支持

2.1.1、老項目添加 MyBatis

如果需要在老項目中添加 MyBatis,則可以在 pom.xml 文件中添加相關依賴。

        <!-- 添加 MyBatis 框架--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!-- 添加 MySQL 驅動--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

2.1.2、新項目添加 MyBatis

如果在創建 SpringBoot 項目時添加 MyBatis 框架,則增加下述引用。

在這里插入圖片描述

2.2、配置數據庫連接字符串

添加了 MyBatis 框架,由于 MyBatis 啟動類會讀取相關配置,因此必須配置需要的信息,否則啟動報錯。
如果是 application.properties,則添加下列內容:

# 數據庫連接配置
# 這里的 db 是數據庫名稱,需要改變,其余的不動
spring.datasource.url=jdbc:mysql://localhost:3306/db?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

如果是 application.yml,則添加下列內容:

# 數據庫連接配置 
spring: datasource: url: jdbc:mysql://localhost:3306/db?characterEncoding=utf8&useSSL=falseusername: root password: root driver-class-name: com.mysql.cj.jdbc.Driver

上述兩種寫法只是不同類型的文件格式不同而已,內容是相同的。

2.3、配置 MyBatis 中的 XML 路徑

MyBatis 中的 XML 文件中保存的是數據庫具體操作的SQL語句,配置如下:
如果是 application.properties,則添加下列內容:

# 在 resources/mapper 下創建所有表的 xml文件,文件名以Mapper結尾,類型是xml
mybatis.mapper-locations=classpath:mappers/**Mapper.xml

如果是 application.yml,則添加下列內容:

mybatis: mapper-locations: classpath:mappers/**Mapper.xml

3、添加業務代碼

根據后端開發的工程思路添加業務代碼。
在這里插入圖片描述

3.1、添加實體類

實體類對應數據庫的表,實體類的屬性對應數據庫表的字段名。

在這里插入圖片描述

3.2、添加 mapper 接口

數據持久層的接口定義:

在這里插入圖片描述

3.3、添加 xml 文件

在配置文件中已經配置了 xml 文件的位置:在類加載路徑下的mappers文件夾中創建,即在 src/main/resources/mappers 下創建

在這里插入圖片描述

在這里插入圖片描述
mapper 標簽中的 namespace 表示命名空間,值是 mapper 接口的全限定名,接口文件和 xml 文件通過 namespace 的值相對應。
select 標簽的 id 和接口方法名稱一樣的,表示是對接口方法的具體實現,接口方法和某個 sql 語句通過 id 的值相對應。
resultType 是返回的數據類型,無論返回的是某個類型還是 List<某個類型>,值都是某個類型。

在這里插入圖片描述

3.4、添加 Service

服務層實現代碼如下:

在這里插入圖片描述

3.5、添加 Controller

控制層的實現代碼如下:

在這里插入圖片描述

3.6、Postman 測試

在這里插入圖片描述

4、數據的增刪改

4.1、參數占位符

參數占位符有兩種 #{} 和 ${}。

  • #{}:預編譯處理,MyBatis 在處理 #{} 時,會將 SQL 中的 #{} 替換為 ?號,然后再基于 jdbc 來替換。變量本身如果是字符串,會加上單引號 ’ ’ 來替換。
  • ${}:字符直接替換,整個 sql 作為字符串拼接來替換。變量本身如果是字符串,替換時不加任何符號。因此可以使用 ${sort} 實現排序查詢。

在這里插入圖片描述
如果傳入的參數是 asc,那么上述的 sql 語句會被替換成 select * from userinfo order by id asc
但是如果使用的是 #{sort},傳入的參數是 asc,那么那么上述的 sql 語句會被替換成
select * from userinfo order by id ‘asc’,因此使用 ${sort} 可以實現排序查詢,而#{sort} 不能實現。

  • SQL 注入問題:根據用戶名查詢用戶時用的是 ${} 占位符,但是當傳入的參數是 ’ or ‘1’=‘1,代碼會變成 select * from userinfo where username=’’ or ‘1’=‘1’,而 ‘1’='1’表達式始終為真,因此會返回所有的用戶。由此可得,用于查詢的字段,要盡可能使用 #{} 占位符。

在這里插入圖片描述

在這里插入圖片描述

4.2、增加數據

增加數據用 insert 關鍵字,返回的值是 int 類型,默認情況下返回的是受影響的行數。
如果傳進來的方法參數中沒有某個屬性值,那么插入表中的值為 null。
Mapper 接口中:

在這里插入圖片描述
xml 文件中:

在這里插入圖片描述
測試數據:
在這里插入圖片描述
在這里插入圖片描述

4.3、刪除數據

刪除數據用 delete 關鍵字,返回的值是 int 類型,默認情況下返回的是受影響的行數。
Mapper 接口中:

在這里插入圖片描述
xml 文件中:

在這里插入圖片描述
測試數據:

在這里插入圖片描述
在這里插入圖片描述

4.4、修改數據

修改數據用 update 關鍵字,返回的值是 int 類型,默認情況下返回的是受影響的行數。
Mapper 接口中:

在這里插入圖片描述
xml 文件中:

在這里插入圖片描述
測試數據:
在這里插入圖片描述
在這里插入圖片描述

5、數據的查詢

5.1、單表查詢

5.1.1、like 查詢

MyBatis 可以利用 like 進行模糊查詢。

  • 利用 #{} 進行查詢時,會變成 select * from userinfo where username like ‘%‘username’%’,造成語法錯誤。

在這里插入圖片描述
在這里插入圖片描述

  • 利用 ${} 進行查詢時,會造成注入問題。
  • 可以利用 mysql 的內置函數 concat() 來處理。#{}會給 username 的值加上單引號 ’ ’ 來替換,因此無需再加。

在這里插入圖片描述
在這里插入圖片描述

5.1.2、單表查詢

查詢數據用 select關鍵字,返回的值可以是復雜類型,也可以是簡單類型。
如果是增刪改操作返回受影響的行數時,xml文件中可以不設置返回的類型,但是即使是簡單的查詢語句也要設置返回的類型。
Mapper 接口中:

在這里插入圖片描述
xml 文件中:

在這里插入圖片描述
測試數據:
在這里插入圖片描述

5.2、多表查詢

多表查詢的本質是查詢結果集的字段,超出某個自定義類型的屬性,此時之前的方式就不滿足要求。

5.2.1、返回字典映射:resultMap

resultMap 使用場景:
1.字段名稱和實體類中的屬性名不同的情況,可使用 resultMap 配置映射
2.一對一和一對多關系可以使用 resultMap 映射并查詢數據

在這里插入圖片描述

5.2.2、一對一的表映射

  • 在實體類中增加屬性。

在這里插入圖片描述

  • 在 xml 文件中增加一對一映射。

在這里插入圖片描述
resultMap 屬性:指定關聯的結果集映射,將基于該映射配置來組織用戶數據。
columnPrefix:給 column 統一加上前綴,作為結果集字段,如果 columnPrefix 省略,并且恰好兩個表中有相同的字段,那么就會導致查詢出錯。綁定一對一對象時,通過columnPrefix+association.resultMap.column 來映射結果集字段。

  • 關聯查詢的sql語句。

在這里插入圖片描述
resultMap 屬性:設置當前查詢結果集使用的映射。寫法是 命名空間.resultMap.映射名,如果是同一個命名空間,就可以省略命名空間。

  • 測試數據。

在這里插入圖片描述

查詢字段,如果在 resultMap 映射中沒有配置,就相當于不做映射,值為 null。

5.2.3、一對多的表映射

  • 在實體類中增加屬性。

在這里插入圖片描述

  • 在 xml 文件中增加一對多映射。

在這里插入圖片描述

  • 關聯查詢的sql語句。

.在這里插入圖片描述

  • 測試數據。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72776.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp使用藍牙,usb,局域網,打印機打印

使用流程&#xff08;支持安卓和iOS&#xff09; 引入SDK 引入原生插件包地址如下 https://github.com/oldfive20250214/UniPrinterDemo 連接設備 安卓支持經典藍牙、ble藍牙、usb、局域網&#xff08;參考API&#xff09; iOS支持ble藍牙、局域網&#xff08;參考API&…

Jmeter進行http接口測試詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文主要針對http接口進行測試&#xff0c;使用 jmeter工具實現。 Jmeter工具設計之初是用于做性能測試的&#xff0c;它在實現對各種接口的調用方面已經做的比較…

力扣35.搜索插入位置-二分查找

class Solution:def searchInsert(self, nums: List[int], target: int) -> int:# 初始化左右指針left, right 0, len(nums) - 1# 當左指針小于等于右指針時&#xff0c;繼續循環while left < right:# 計算中間位置mid (left right) // 2# 如果中間元素等于目標值&…

為AI聊天工具添加一個知識系統 之133 詳細設計之74通用編程語言 之4 架構及其核心

本篇繼續討論 通用編程語言。 說明&#xff1a;本階段的所有討論都是圍繞這一主題展開的&#xff0c;但前面的討論分成了三個大部分&#xff08;后面列出了這一段的討論題目的歸屬關系&#xff09;-區別distinguish&#xff08;各別&#xff09;&#xff1a; 文化和習俗。知識…

PPT 技能:巧用 “節” 功能,讓演示文稿更有序

在制作PPT時&#xff0c;你是否遇到過這樣的情況&#xff1a;幻燈片越來越多&#xff0c;內容越來越雜&#xff0c;找某一頁內容時翻得眼花繚亂&#xff1f;尤其是在處理大型PPT文件時&#xff0c;如果沒有合理的結構&#xff0c;編輯和調整都會變得非常麻煩。這時候&#xff0…

劉火良 FreeRTOS內核實現與應用之1——列表學習

重要數據 節點的命名都以_ITEM后綴進行&#xff0c;鏈表取消了后綴&#xff0c;直接LIST 普通的節點數據類型 /* 節點結構體定義 */ struct xLIST_ITEM { TickType_t xItemValue; /* 輔助值&#xff0c;用于幫助節點做順序排列 */ struct xLIST_I…

Uniapp項目運行到微信小程序、H5、APP等多個平臺教程

摘要&#xff1a;Uniapp作為一款基于Vue.js的跨平臺開發框架&#xff0c;支持“一次開發&#xff0c;多端部署”。本文將手把手教你如何將Uniapp項目運行到微信小程序、H5、APP等多個平臺&#xff0c;并解析常見問題。 一、環境準備 在開始前&#xff0c;請確保已安裝以下工具…

100天精通Python(爬蟲篇)——第115天:爬蟲在線小工具_Curl轉python爬蟲代碼工具(快速構建初始爬蟲代碼)

文章目錄 一、curl是什么&#xff1f;二、爬蟲在線小工具&#xff08;牛逼puls&#xff09;三、實戰操作 一、curl是什么&#xff1f; 基本概念&#xff1a;curl 支持多種協議&#xff0c;如 HTTP、HTTPS、FTP、SFTP 等&#xff0c;可用于從服務器獲取數據或向服務器發送數據&a…

[內網安全] Windows 域認證 — Kerberos 協議認證

&#x1f31f;想系統化學習內網滲透&#xff1f;看看這個&#xff1a;[內網安全] 內網滲透 - 學習手冊-CSDN博客 0x01&#xff1a;Kerberos 協議簡介 Kerberos 是一種網絡認證協議&#xff0c;其設計目標是通過密鑰系統為客戶機 / 服務器應用程序提供強大的認證服務。該認證過…

PyTorch中的損失函數:F.nll_loss 與 nn.CrossEntropyLoss

文章目錄 背景介紹F.nll_loss什么是負對數似然損失&#xff1f;應用場景 nn.CrossEntropyLoss簡化工作流程內部機制 區別與聯系 背景介紹 無論是圖像分類、文本分類還是其他類型的分類任務&#xff0c;交叉熵損失&#xff08;Cross Entropy Loss&#xff09;都是最常用的一種損…

案例1_3:流水燈

文章目錄 文章介紹原理圖&#xff08;同案例1_2&#xff09;代碼效果圖 文章介紹 原理圖&#xff08;同案例1_2&#xff09; 代碼 #include <reg51.h> // 包含頭文件void delay(unsigned int time) {unsigned int i, j;for (i 0; i < time; i)for (j 0; j < 1…

基于物聯網技術的電動車防盜系統設計(論文+源碼)

1總體設計 本課題為基于物聯網技術的電動車防盜系統&#xff0c;在此將整個系統架構設計如圖2.1所示&#xff0c;其采用STM32F103單片機為控制器&#xff0c;通過NEO-6M實現GPS定位功能&#xff0c;通過紅外傳感器檢測電瓶是否離開位&#xff0c;通過Air202 NBIOT模塊將當前的數…

學習知識的心理和方法雜記-02

本文簡單記錄下我個人對大腦學習模式的認識。 人腦的基本能力是什么&#xff1f; 接收輸入的能力。語言和聲音 視覺圖像 觸覺 嗅覺 味覺等。 存儲能力。人腦存儲能力背后的物理化學結構我們人類目前還無法完全認知&#xff0c;但是存儲的目標物一定是人可以通過五官獲得的形…

國產化替換案例:CACTER郵件網關為Groupwise系統加固郵件安全防線

電子郵件作為企業信息流轉的命脈&#xff0c;承載著商業機密與客戶數據。然而&#xff0c;網絡攻擊手段日益復雜&#xff0c;釣魚郵件等威脅正快速侵蝕企業安全防線。據《2024年第四季度企業郵箱安全性研究報告》顯示&#xff0c;2024年Q4企業郵箱用戶遭遇的釣魚郵件數量激增至…

3.使用ElementUI搭建側邊欄及頂部欄

1. 安裝ElementUI ElementUI是基于 Vue 2.0 的桌面端組件庫。使用之前&#xff0c;需要在項目文件夾中安裝ElementUI&#xff0c;在終端中輸入以下命令&#xff0c;進行安裝。 npm i element-ui -S并在main.js中引入ElementUI 2. 使用elmentUI組件進行頁面布局 2.1 清空原…

C++并發以及多線程的秘密

1.基礎概念 并發&#xff08;Concurrency&#xff09; 并發是指在同一時間段內&#xff0c;多個任務看起來像是同時執行的。并發并不一定意味著真正的同時執行&#xff0c;它可以是通過時間片輪轉等方式在多個任務之間快速切換&#xff0c;讓用戶感覺多個任務在同時進行。并發…

從零開始實現大語言模型(十四):高階訓練技巧

1. 前言 預訓練大語言模型的流程與訓練普通神經深度網絡模型本質上并沒有任何不同。可以使用深度學習實踐中已經被證明非常有效的高階訓練技巧&#xff0c;優化大語言模型預訓練流程&#xff0c;使大語言模型預訓練效率更高&#xff0c;訓練過程更穩定。 本文介紹深度學習領域…

利用EasyCVR平臺打造化工園區視頻+AI智能化監控管理系統

化工園區作為化工產業的重要聚集地&#xff0c;其安全問題一直是社會關注的焦點。傳統的人工監控方式效率低下且容易出現疏漏&#xff0c;已經難以滿足日益增長的安全管理需求。 基于EasyCVR視頻匯聚平臺構建的化工園區視頻AI智能化應用方案&#xff0c;能夠有效解決這些問題&…

GB28181視頻監控流媒體平臺LiveGBS如何自定義收流端口區間以便減少收流端口數或解決端口沖突問題

LiveGBS GB28181流媒體服務在接收視頻的時候默認是使用30000-30249&#xff0c; webrtc流播放端口區間默認是UDP的30250-30500區間。有些網絡環境不方便開放這么大的端口區間&#xff0c;下面介紹下如何修改配置這個區間。 從頁面上修改這個區間&#xff0c;端口區間盡量設置大…

Qt:事件

目錄 處理事件 鼠標事件 鍵盤事件 定時器事件 窗口事件 雖然 Qt 是跨平臺的 C 開發框架&#xff0c;Qt 的很多能力其實是操作系統提供的 只不過 Qt 封裝了系統的 API 事件 前面學習過信號槽&#xff1a; 用戶進行的各種操作&#xff0c;就可能會產生出信號&#xff0c;可以…