目錄
?
基礎操作
準備:
刪除:
新增:
更新:
查詢:
條件查詢:
XML映射文件
動態SQL
if
foreach
sql&include
?
基礎操作
準備:
準備數據庫表
創建一個新的springboot工程,選擇引入對應的起步依賴(mybatis、mysql驅動、lombok)
application.properties中引入數據庫連接信息
創建對應的實體類(實體類屬性采用駝峰命名)
準備Mapper接口
刪除:
@Delete("delete from teachnewstudent where id=#{id}")public void delete(Long id);
特別指出占位符 #{id}
刪除是由返回值的,數據的返回值改為int即可刪除數據
注意事項:如果mapper接口方法形參只有一個普通類型的參數,#{...}里面的屬性名可以隨便寫,如:#{id}、#{value}。
日志輸出:
可以在application.properties中,打開mybatis的日志,并指定輸出到控制臺。
#指定mybatis輸出日志的位置,輸出控制臺mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
預編譯SQL
優勢:性能更高
更安全(防止SQL注入)
SQL注入:
SQL注入是通過操作輸入的數據來修改事先定義好的SQL語句,以達到執行代碼對服務器進行攻擊的方法。
使用#{}即為預編譯
新增:
@Insert("insert into user(name,intro,state) values(#{name},#{intro},#{state}")public void insert(User user);
?如果有多個參數可使用實體類來封裝多個參數
主鍵返回:
描述:在數據添加成功后,需要獲取插入數據庫的主鍵。如:添加套餐數據時,還需要維護套餐菜品關系表數據。
實現:加上注解@Options(框架會自動將生成的主鍵值,賦值給user對象的id屬性)
@Options(keyProperty="id", useGeneratedKeys = true)@Insert("insert into user(name,intro,state)+values(#{name},#{intro},#{state}")public void insert(User user);
更新:
一般是根據主鍵來修改(因為主鍵是不改變的)
@Update("update user set name=#{name},intro=#{intro},state=#{state} where id=#{id}")public void update(User user);
查詢:
根據id查詢
@Select("select * from user where id=#{id}")public User getById(Long id);
數據封裝:
實體類屬性名 和 數據庫表查詢返回的字段名一致,mybatis會自動封裝。
如果實體類屬性名 和 數據庫表查詢返回的字段名不一致,不能自動封裝。
解決方案:
方案一:給字段起別名,讓別名與實體類屬性一致
@Select("select id,name,create_time createTime,update_time updateTime from user where id=#{id}")public User getById(Long id);
方案二:通過@Results,@Result 注解手動映射封裝
@Results({@Result(column="",property="")})@Select("select * from user where id=#{id}")public User getById(Long id);
?column為需要封裝的字段,property為封裝到的屬性
方案三:開啟mybatis的駝峰命名自動映射開關 即:a_?column------>aColumn
在application.properties配置mybatis.configuration.map-underscore-to-camel-case=true
需要嚴格遵守數據庫名為下劃線,類型名為駝峰命名
?
條件查詢:
@Select("select * from user where name like '%${name}%' and state=#{state}")public List<User> list1(String name,Short state);
因為#{}是預編譯符不能出現在""之內所以需要用$符號來代替(所以存在問題性能低、不安全、存在SQL注入問題)
解決方法:concat? 字符串拼接函數
@Select("select * from user where name like concat('%',#{name},'%') and state=#{state}")public List<User> list1(String name,Short state);
?在springboot的2.x版本,參數名與注解中引用部分相同,否則需要單獨加入注解
?
XML映射文件
規范:
XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名)。
XML映射文件的namespace屬性為Mapper接口全限定名一致。
XML映射文件中sql語句的id與Mapper接口中的方法名一致,并保持返回類型一致。
目錄使用/來分隔
約束:
官方文檔:入門_MyBatis中文網
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper"></mapper>
namespace的屬性值和接口全類名保持一致
<mapper namespace="com.example.demo.mapper.UserMapper"><select id="list" resultType="com.example.pojo.User">select * from user where name like'%${name}%' and state=#{state}</select>
</mapper>
?
?插件:MyBatisX(提高MyBatis效率)能夠快速定位
?
動態SQL
動態SQL
隨著用戶的輸入或外部條件的變化而變化的SQL語句,我們稱之為 動態SQL
?
if
<if>:用于判斷條件是否成立。使用test屬性進行條件判斷,如果條件為true,則拼接SQL。
<mapper namespace="com.example.mapper.Usermapper"><select id="list" resultType="com.example.pojo.User">select * from user<where><if test="name != null">name like'%${name}%'</if><if test="state!= null">and state=#{state}</if></where></select>
</mapper>
where標簽會自動去除多余的and關鍵字,而且會判斷條件成不成立,當條件不成立時不會生成where關鍵字 而且會自動去除子句開頭的AND或者OR
需求:動態更新員工信息,如果更新時傳遞有值,則更新;如果更新時沒有傳遞值,則不更新。
在 if 中添加 test屬性即可
<set>標簽替換set關鍵字,能夠去除掉多余的逗號
foreach
進行循環遍歷的標簽,通常用在批量刪除中
屬性:
collection:遍歷的集合(與參數名保持一致)
item:遍歷出來的元素
separator:分隔符
open:遍歷開始前拼接的SQL片段
close:遍歷結束后拼接的SQL片段
<delete id="deleteByIds">delete from user where id in<foreach collection="ids" item="id" separetor="," open="(" close=")">#{id}</foreach>
</delete>
?
sql&include
sql負責抽取一個片段,而include引用一個片段進行復用
<sql id="commonSelect">select id,name
</sql>
include 的 refid屬性負責指定你要引用哪個片段值,該值為select的id值
?查詢一個表的全部字段時不建議使用select*,而是要羅列所有字段(select*性能較低)
<include refid="commonSelect"/>
?
?