Mybatis基礎操作
占位符:#{變量名}
注意事項:如果Mapper接口方法只有一個普通類型參數,屬性名可以隨便寫
==> Preparing: delete from emp where id=?
==> Parameters: 1(Integer)
預編譯SQL
不會將值直接放在SQL語句中,而是用占位符?代替
之后執行這條SQL語句,如果除了?其他相同,就可以直接拼接值執行
普通SQL語句執行流程
SQL語法解析檢查->優化SQL->編譯SQL->執行SQL
提供緩存:如果執行的語句在緩存中,可以跳過前三步
SQL注入:通過操作輸入的數據來修改事先定義好的SQL語句
預編譯SQL優點:
性能高(跳過前三步)
更安全(防止SQL注入)(傳入的只會被理解為值不會認為是SQL語句的一部分)
在mybatis中#{}和${}都可以表示占位符
但是效果不同
#{}:將#{}替換為?生成預編譯SQL,會自動設置參數值
傳參數時使用
${}:拼接SQL,將參數直接拼接在SQL中,存在SQL注入問題
對表名,列表進行動態設置時使用
#{}會自動類型轉換,因此不需要加引號
主鍵返回:
在數據添加成功后,需要獲取插入數據庫數據的主鍵。
實現:
添加注解@Options(keyProperty=“id”,useGeneratedKeys=true)
數據封裝
實體類屬性名和數據庫查詢返回的字段名一致,Mybatis自動封裝
如果實體類屬性名和數據庫表查詢返回的字段名不一致,不能自動封裝
解決方案一:
起別名:讓別名與實體屬性一致
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id deptId, create_time createTime, update_time updateTime from emp where id=#{id}")
public Emp select(Integer id);
方案二:
通過@Results,@Result注解手動映射封裝
@Results({@Result(column="dept_id",property = "deptId"),@Result(column="create_time",property = "createTime"),@Result(column="update_time",property = "updateTime")})@Select("select * from emp where id=#{id}")public Emp select(Integer id);
方案三:
開啟mybatis駝峰命名自動映射開關
在properties中配置
@Select("select * from emp where id=#{id}")public Emp select(Integer id);
mybatis.configuration.map-underscore-to-camel-case=true
MySQL 用下劃線命名是因為系統兼容性 + 數據庫傳統風格的雙重原因,不是不能用駝峰,而是駝峰容易出錯、不推薦。
所以命名并不是沒用,嚴格按照數據庫下劃線,java駝峰
小點:#{}不能出現在’‘之內,因為會被?替代,在’'內會被認為是字符
可以使用${}直接拼接
XML映射文件
將SQL語句與java代碼分別編寫
規范:
XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下
XML映射文件的namespace屬性為Mapper接口全限定名一致
XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致
? 為什么把配置文件放在 resources 下?
Spring Boot 啟動時默認會在 classpath 下找配置文件。
src/main/resources 會自動被打包到編譯后的 target/classes/ 目錄中,與 .class 文件在一起。
也就是說,它不是因為 Java 編譯放進來了,而是因為資源目錄本身就會被打包進 classpath。
使用注解還是XML:
注解:完成簡單的增刪改查
XML:實現復雜的SQL功能
mybatis動態SQL
通過標簽實現
<if>:用于判斷條件是否成立,使用test屬性進行條件判斷,如果條件為true,則拼接
<if test="name!=null">SQL語句
<if><where>:用于動態生成where(條件不為空生成),自動去除條件前面多余的and、or
<set>:自動去除語句后多余的, 用于更新語句<foreach>:
屬性:
collection:遍歷的集合
item:遍歷的元素
separator:分隔符
open:遍歷開始前拼接的SQL片段
close:遍歷結束后拼接的SQL片段<sql>、<include>:提高代碼復用<sql id="名字">SQL語句<sql>
<include refid="名字">