目錄
- 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,即對象關系映射)框架,在面向對象編程語言中,將關系型數據庫中的數據和對象建立起映射關系,進而自動完成數據與對象之間的轉換:
- 將輸入數據(即傳入的對象)+ SQL 映射成原生 SQL
- 將結果集映射為返回對象,即輸出對象
ORM 將數據庫映射為對象:
- 數據庫表(table)-> 類(class)
- 記錄(record,即行數據)-> 對象(object)
- 字段(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語句。
.
- 測試數據。