柚子快報激活碼778899分享:MyBatis數(shù)據(jù)庫查詢
柚子快報激活碼778899分享:MyBatis數(shù)據(jù)庫查詢
文章目錄
什么是MyBatisMyBatis程序的創(chuàng)建MyBatis實(shí)現(xiàn)數(shù)據(jù)庫查詢傳參查詢插入實(shí)現(xiàn)添加操作獲取自增ID刪除實(shí)現(xiàn)修改實(shí)現(xiàn)#{}和${}SQL注入
like查詢
resultMap和resultType多表查詢
對于普遍的后端開發(fā)而言,其程序主要包含了后端主程序和數(shù)據(jù)庫兩個部分,用戶訪問前端頁面,前端發(fā)送數(shù)據(jù)給后端程序,后端從數(shù)據(jù)庫中查詢用戶需要的信息返回給前端,如此即完成了一次完整的數(shù)據(jù)查詢。MyBatis就是一種作為后端程序與數(shù)據(jù)庫連接和交互的工具。
什么是MyBatis
MyBatis是一款支持自定義SQL、存儲過程及高級映射的持久層框架。它不同于JDBC操作的繁瑣,是通過簡單的xml和注解來進(jìn)行接口或?qū)ο蟮呐渲煤陀成?,是一種更加簡單地用來完成程序和數(shù)據(jù)庫交互的工具。
MyBatis程序的創(chuàng)建
與SpringMVC項(xiàng)目的創(chuàng)建類似,首先需要額外添加MyBatis的框架依賴:再設(shè)置數(shù)據(jù)庫的連接配置:
在application.properties文件中進(jìn)行數(shù)據(jù)庫的連接信息的配置:
如果使? MySQL 是 5.x 之前的使?的是“com.mysql.jdbc.Driver", 如果是?于 5.x 使?的是“com.mysql.cj.jdbc.Driver”
此時,這個MyBatis 程序就可以成功運(yùn)行了。
再對MyBatis xml文件的存放位置和命名規(guī)則進(jìn)行配置,同樣是在application.properties文件中進(jìn)行 配置:
MyBatis實(shí)現(xiàn)數(shù)據(jù)庫查詢
MyBatis作為程序服務(wù)層和數(shù)據(jù)庫連接的工具,簡單來說由用來給當(dāng)前類作方法聲明的接口和對應(yīng)的xml文件組成;
添加實(shí)體類
實(shí)體類中屬性的名稱與數(shù)據(jù)庫中的字段名稱必須保持一致:
package com.example.demo.model;
import lombok.Data;
import java.util.Date;
@Data
public class UserInfo {
private int id;
private String username;
private String password;
private String photo;
private Date createtime;
private Date updatetime;
private int state;
}
添加mapper接口
package com.example.demo.mapper;
import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
public List
}
@Mapper注解由MyBatis提供,標(biāo)明當(dāng)前類是一個mapper接口,不可以省略;
添加對應(yīng)的xml文件
創(chuàng)建一個xml文件,首先寫入MyBatis固定的xml格式:
具體mapper的命名空間(包名+接口類)需要根據(jù)實(shí)際代碼進(jìn)行修改;
在xml文件中實(shí)現(xiàn)SQL 使用單元測試進(jìn)行驗(yàn)證
數(shù)據(jù)庫查詢結(jié)果:
單元測試:
package com.example.demo.mapper;
import com.example.demo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest //標(biāo)識當(dāng)前測試的上下文環(huán)境為springboot
class UserMapperTest {
@Autowired //注入需要測試的類
private UserMapper userMapper;
@Test
void getAll() {
//實(shí)現(xiàn)測試代碼
List
for (UserInfo user:list){
System.out.println(user.toString());
}
}
}
mybatis查詢數(shù)據(jù)庫結(jié)果:
傳參查詢
添加@Param注解,可以增強(qiáng)代碼的跨平臺性; xml文件中的SQL語句實(shí)現(xiàn),參數(shù)的格式需要特別注意;
使用單元測試進(jìn)行驗(yàn)證:
當(dāng)@Param注解中的參數(shù)與實(shí)體類的屬性名稱不同時,xml文件中SQL語句的參數(shù)與@Param注解中的保持一致;
插入實(shí)現(xiàn)
除查詢外,增刪改默認(rèn)返回的是受影響的行數(shù);
通過數(shù)據(jù)庫查詢驗(yàn)證:
添加操作獲取自增ID
useGeneratedKeys得到數(shù)據(jù)庫內(nèi)部生成的 主鍵; keyColumn設(shè)置生成的鍵在數(shù)據(jù)表中的列名; keyProperty指定唯一識別對象的屬性
單元測試:
刪除實(shí)現(xiàn)
修改實(shí)現(xiàn)
可以進(jìn)一步在數(shù)據(jù)庫中驗(yàn)證:
#{}和${}
在xml文件中實(shí)現(xiàn)SQL語句時,可以使用#{}和${}兩種參數(shù)占位符;
#{}代表預(yù)編譯處理,即MyBatis在處理占位符處的參數(shù)時,是將#{}替換為?符號,后使用 PreparedStatement的set方法來賦值; $ {}代表字符的直接替換,即直接將${}替換成變量的值;
兩種占位符各有優(yōu)缺; #{}預(yù)編譯處理的方式在遇到像上面這種直接替換的字符串時,會給傳遞的值添加單引號,無法完成查詢; $ {}直接替換的方式則是有可能會帶來越權(quán)查詢和操作數(shù)據(jù)的問題,帶來一些安全問題;
SQL注入
SQL注入是一種常見的網(wǎng)絡(luò)攻擊方式,它是利用數(shù)據(jù)庫查詢的bug,通過SQL語句來實(shí)現(xiàn)對數(shù)據(jù)的無差別查詢;
用于查詢的字段,更推薦使用#{}預(yù)編譯的處理方式;
like查詢
如果使用上面兩種占位符的方式進(jìn)行模糊查詢:
預(yù)編譯的方式程序會出現(xiàn)報錯,直接替換的方式可以查詢成功,但不安全。因此可以考慮使用mysql的內(nèi)置函數(shù)concat來查詢;
resultMap和resultType
resultType是對查詢的對象的返回類型進(jìn)行設(shè)置,大多數(shù)場景使用resultType就可以;resultMap則是當(dāng)數(shù)據(jù)庫的字段名與程序的屬性名不一致時,使用該標(biāo)簽就可以進(jìn)行配置;
多表查詢
首先需要在主表添加需要查詢的連接表的屬性:
定義查詢方法和查詢語句: 得到查詢結(jié)果:
柚子快報激活碼778899分享:MyBatis數(shù)據(jù)庫查詢
好文鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。