MyBatis查詢(xún)?、修改?、刪除操作示例代碼
前言:
在現(xiàn)代應(yīng)用開(kāi)發(fā)中,數(shù)據(jù)庫(kù)操作是核心環(huán)節(jié)。MyBatis 作為一款靈活的持久層框架,提供了直接編寫(xiě) SQL 語(yǔ)句的能力,避免了其他 ORM 框架可能帶來(lái)的性能和功能限制。MyBatis 的查詢(xún)、修改和刪除操作是開(kāi)發(fā)者必須掌握的基本技能。這些操作不僅影響數(shù)據(jù)的獲取、更新和刪除,還直接關(guān)系到應(yīng)用的性能與安全性。接下來(lái),我們將簡(jiǎn)要介紹 MyBatis 中如何高效執(zhí)行這三種操作,并通過(guò)代碼示例展示最佳實(shí)踐
MyBatis搭建與配置
- 創(chuàng)建一個(gè)maven對(duì)象
- 導(dǎo)入MyBatis.jar包
- 創(chuàng)建一個(gè)全局的MyBatis配置文件
- 創(chuàng)建數(shù)據(jù)庫(kù)
- 定義Dao接口,定義方法
- 創(chuàng)建sql映射文件,編寫(xiě)sql
- 測(cè)試MyBatis
Sql配置代碼解讀
<insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into admin (account,password,gender) values (#{account},#{password},#{gender})
</insert>
<select id="findAdminById" parameterType="int" resultType="Admin">
select * from admin where id = #{id}
</select>id —>唯一標(biāo)識(shí)(接口中方法名)
parameterType=“參數(shù)類(lèi)型"
useGeneratedKeys ="true" 返回自增主鍵
keyProperty="id" 定義接收屬性
keyColumn="id" 定義主鍵列
以上三個(gè)設(shè)置,數(shù)據(jù)庫(kù)添加數(shù)據(jù)等,會(huì)向后端返回該數(shù)據(jù)行的主鍵值
resultType="返回結(jié)果集類(lèi)型"

參數(shù)傳遞
單參數(shù)傳遞
Admin selectAdmins(int id);
多參數(shù)傳遞
多個(gè)參數(shù)使用@Param(“id”)綁定
//多個(gè)參數(shù)的傳遞
Admin login(@Param("acc") String account, @Param("pass") String password);復(fù)雜參數(shù)傳遞
如果傳入一個(gè)復(fù)雜的對(duì)象,就需要使用 parameterType 參數(shù)進(jìn)行類(lèi)型定義,例如: void insertAdmin(Admin admin)
Admin login1(Admin admin);
單表增刪改查
<!-- 修改-->
<update id="updateAdmin" parameterType="admin">
update admin set account = #{account},password = #{password},gender = #{gender} where id = #{id}
</update>
<!-- 添加-->
<insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into admin (account,password,gender) values (#{account},#{password},#{gender})
</insert>
<!-- 查詢(xún)-->
<select id="findAdminById" parameterType="int" resultType="Admin">
select * from admin where id = #{id}
</select>
<!-- 刪除-->
<delete id="deleteAdmin" parameterType="int">
delete from admin where id = #{id}
</delete>#{}和${}的區(qū)別
#{} 占位符,采用預(yù)編譯的方式向sql中傳值,可以防止sql注入,如果我們往SQL傳值,使用#{}
${} 是將內(nèi)容直接拼接到sql語(yǔ)句中,一般不用與向sql中傳值,一般用于向SQL中動(dòng)態(tài)的傳遞列名
區(qū)別:
- 底層實(shí)現(xiàn)不同
- #{} 采用預(yù)編譯方式,防止sql注入更加的安全
- ${} 采用字符串拼接,直接將值拼接在sql中
- 使用場(chǎng)景不同
- #{} 一般用于向sql中的列傳值
- ${} 一般用于向sql中動(dòng)態(tài)的傳遞列明 例如:排序時(shí) order by 后面的列名是可以改變的.select后面的列名也可以自由選擇
resultMap
定義resultMap
<resultMap id="majorMap" type="major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
</resultMap>
- resutlMap 的 id 屬性是 resutlMap 的唯一標(biāo)識(shí),本例中定義為 “majorMap”
- resutlMap 的 type 屬性是映射的 POJO 類(lèi)型
- id 標(biāo)簽映射主鍵,result 標(biāo)簽映射非主鍵
- property 設(shè)置對(duì)象屬性名稱(chēng),column 映射查詢(xún)結(jié)果的列名稱(chēng)
駝峰命名與下劃線映射關(guān)系
為什么要解決駝峰命名與下劃線映射關(guān)系?
因?yàn)閿?shù)據(jù)庫(kù)中命名一般為Student_Id Java中命名一般為StudentId所以為了我們方便操作,我們通過(guò)設(shè)置來(lái)解決問(wèn)題
解決:在mybatis配置文件中設(shè)置如下代碼
<!-- MyBatis配置文件-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 打印日志 -->
<setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 解決駝峰問(wèn)題 -->
</settings>多表操作 association 關(guān)聯(lián)數(shù)據(jù)表 關(guān)聯(lián)查詢(xún)
方法一:在數(shù)據(jù)庫(kù)中一次查出所有數(shù)據(jù)
<!--對(duì)關(guān)聯(lián)查詢(xún)到的學(xué)生信息進(jìn)行自定義映射關(guān)系-->
<resultMap id="studentMap" type="student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<!--映射關(guān)聯(lián)數(shù)據(jù) 專(zhuān)業(yè)名稱(chēng)-->
<association property="major" javaType="major">
<result column="mname" property="name"></result>
</association>
</resultMap>
<!--關(guān)聯(lián)查詢(xún)第一種-->
<select id="findStudent" resultMap="studentMap">
select s.id,
s.num,
s.name,
s.gender,
m.name mname
from student s inner join major m on s.majorid = m.id where s.id = #{id}
</select>注:association 關(guān)聯(lián)數(shù)據(jù)表
property="major" ---->student對(duì)象中的major成員變量
javaType="major"----->major對(duì)象
解釋:我們?cè)赟tudent類(lèi)中創(chuàng)建Major變量,從而將Major類(lèi)和Student類(lèi)連接.我們從后端查詢(xún)出來(lái)的Major類(lèi)中數(shù)據(jù),我們可直接封裝在Major對(duì)象中(簡(jiǎn)單理解:其實(shí)也就是給Major變量賦值)
嵌套查詢(xún)
方法二:數(shù)據(jù)庫(kù)分次查詢(xún)
<!-- 關(guān)聯(lián)查詢(xún)第二種-->
<resultMap id="studentMap1" type="student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<!-- 封裝關(guān)聯(lián)查詢(xún)-->
<association property="major" javaType="major" select="findMajor" column="majorid">
</association>
</resultMap>
<select id="findStudentById" resultMap="studentMap1">
select id,num,name,gender,majorid from student where id = #{id}
</select>
<!-- 嵌套查詢(xún)學(xué)生關(guān)聯(lián)的專(zhuān)業(yè)-->
<select id="findMajor" resultType="major">
select name from major where id = #{majorid}
</select>
collection關(guān)聯(lián)數(shù)據(jù)表
collection用來(lái)查詢(xún)一個(gè)集合
關(guān)聯(lián)查詢(xún)
<resultMap id="majorMap" type="major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<collection property="students" javaType="list" ofType="student">
<result column="num" property="num"></result>
<result column="sname" property="name"></result>
</collection>
</resultMap>
<select id="findMajorById" parameterType="int" resultMap="majorMap">
select
m.id,
m.name,
s.num,
s.name sname
from major m inner join student s on m.id = s.majorid where m.id = #{id}
</select>嵌套查詢(xún)
<resultMap id="majorMap1" type="major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<collection property="students" javaType="list" ofType="student" select="findStudents" column="id"></collection>
</resultMap>
<select id="findMajors1" resultMap="majorMap1">
select id,name from major
</select>
<select id="findStudents" resultType="student">
select num,name from student where majorid = #{id}
</select>代碼解讀

Collection和Association區(qū)別
Collection(集合)
- 定義: Collection 是一個(gè)數(shù)據(jù)結(jié)構(gòu)或容器,用于存儲(chǔ)一組對(duì)象。它通常用于管理和操作多個(gè)相同類(lèi)型的對(duì)象。例如,列表(List)、數(shù)組(Array)、集合(Set)等都是典型的 Collection。
- 特點(diǎn):
- 包含多個(gè)對(duì)象,可以對(duì)其進(jìn)行添加、刪除、迭代等操作。
- Collection 通常與某種特定的數(shù)據(jù)結(jié)構(gòu)關(guān)聯(lián),負(fù)責(zé)對(duì)這些對(duì)象進(jìn)行管理(如排序、查找等)。
- 對(duì)象的生存周期通常由 Collection 管理,特別是在集合被銷(xiāo)毀時(shí),里面的對(duì)象可能也會(huì)被銷(xiāo)毀。
- 用途: 用于聚合和管理一組對(duì)象,通常用于處理大量相同類(lèi)型的對(duì)象集合。
Association(關(guān)聯(lián)關(guān)系)
- 定義: Association 是一種類(lèi)與類(lèi)之間的關(guān)系,描述一個(gè)類(lèi)的對(duì)象與另一個(gè)類(lèi)的對(duì)象之間的鏈接。例如,一個(gè)學(xué)校類(lèi)和一個(gè)學(xué)生類(lèi)之間可能會(huì)有一個(gè) Association,表示學(xué)校包含許多學(xué)生。
- 特點(diǎn):
- 表示類(lèi)之間的連接或關(guān)系,而不是數(shù)據(jù)結(jié)構(gòu)本身。
- Association 可以是單向或雙向的。單向 Association 表示一個(gè)類(lèi)知道另一個(gè)類(lèi)的存在,但反之不然;雙向 Association 則表示兩個(gè)類(lèi)彼此都知道對(duì)方。
- 關(guān)聯(lián)關(guān)系不負(fù)責(zé)對(duì)象的生存周期管理。對(duì)象的創(chuàng)建和銷(xiāo)毀由其他機(jī)制負(fù)責(zé)。
- 用途: 用于表示類(lèi)與類(lèi)之間的關(guān)系,幫助定義對(duì)象間的交互和連接。
總結(jié)
- Collection 主要用于管理一組對(duì)象的集合,關(guān)注的是數(shù)據(jù)結(jié)構(gòu)和對(duì)象的管理。
- Association 主要用于描述類(lèi)之間的關(guān)系,關(guān)注的是對(duì)象之間的連接和相互作用
注解方式
- @Insert : 插入 sql , 和 xml insert sql 語(yǔ)法完全一樣
- @Select : 查詢(xún) sql, 和 xml select sql 語(yǔ)法完全一樣
- @Update :更新 sql, 和 xml update sql 語(yǔ)法完全一樣
- @Delete :刪除 sql, 和 xml delete sql 語(yǔ)法完全一樣
使用場(chǎng)景:簡(jiǎn)單的sql一般適合使用注解查詢(xún) 例如:用戶(hù)信息查詢(xún),添加用戶(hù),刪除單個(gè)用戶(hù)等
代碼演示:
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);動(dòng)態(tài)sql
出現(xiàn)原因:因?yàn)闃I(yè)務(wù)需求出現(xiàn)用戶(hù)存數(shù)據(jù)可能只存 姓名 不存 性別 或者不存任何數(shù)據(jù),sql語(yǔ)句就需要判斷書(shū)寫(xiě).
第一:where 與 if 標(biāo)簽
if test 屬性條件成立 執(zhí)行if標(biāo)簽體,不成立就不執(zhí)行
where標(biāo)簽 當(dāng)where標(biāo)簽 if語(yǔ)句有條件成立時(shí),就會(huì)動(dòng)態(tài)添加where關(guān)鍵字,還可以刪除where后面緊跟的關(guān)鍵字(例如:and,or)
<select id="teachers1" resultType="teacher">
SELECT * FROM teacher
<where>
<if test="num!=0">
and num = #{num}
</if>
<if test="name!=null">
and name = #{name}
</if>
</where>
</select>第二:trim標(biāo)簽
參數(shù):
- prefix:
- 作用: 在生成的 SQL 語(yǔ)句前添加的內(nèi)容。
- 示例: 如果你想在 SQL 語(yǔ)句的條件部分加上
WHERE,可以使用prefix="WHERE"。
- prefixOverrides:
- 作用: 如果生成的 SQL 語(yǔ)句以指定的內(nèi)容開(kāi)頭,則移除這些內(nèi)容。通常用于去掉多余的
AND或OR。 - 示例:
prefixOverrides="AND"會(huì)去掉生成 SQL 語(yǔ)句中以AND開(kāi)頭的部分。
- 作用: 如果生成的 SQL 語(yǔ)句以指定的內(nèi)容開(kāi)頭,則移除這些內(nèi)容。通常用于去掉多余的
- suffix:
- 作用: 在生成的 SQL 語(yǔ)句末尾添加的內(nèi)容。
- 示例: 如果你想在 SQL 語(yǔ)句的最后加上
ORDER BY,可以使用suffix="ORDER BY"。
- suffixOverrides:
- 作用: 如果生成的 SQL 語(yǔ)句以指定的內(nèi)容結(jié)尾,則移除這些內(nèi)容。通常用于去掉多余的逗號(hào)、AND 或 OR。
- 示例:
suffixOverrides=","會(huì)去掉生成 SQL 語(yǔ)句末尾多余的逗號(hào)
第三:choose標(biāo)簽
注:choose標(biāo)簽選擇標(biāo)簽,標(biāo)簽中必須有選擇對(duì)象,也就是必須有<when>標(biāo)簽
<select id="teachers" resultType="teacher">
SELECT * FROM teacher
<trim prefix="where" prefixOverrides="and|or">
<choose>
<when test="name!=null">
name = #{name}
</when>
<otherwise>
name = '蘇老師'
</otherwise>
</choose>
</trim>
</select><when> --->當(dāng)test中條件滿足這執(zhí)行,不滿足執(zhí)行<otherwise>標(biāo)簽中 和 if else差不多
第四:set標(biāo)簽
<set>標(biāo)簽可以在變量之間添加 逗號(hào)(,)
<update id="updateTeacher" parameterType="teacher">
update teacher
<set>
<if test="num!=0">
num = #{num},
</if>
<if test="name!=null">
name = #{name}
</if>
<if test="gender!=null">
gender = #{gender}
</if>
where id = #{id}
</set>
</update>第五:foreach標(biāo)簽
1. collection
- 作用: 指定要迭代的集合。這個(gè)集合可以是列表、數(shù)組或其他 Java 集合類(lèi)型。
- 示例:
collection="list"表示要迭代名為list的集合。
2. item
- 作用: 指定每次迭代時(shí)集合中元素的變量名。
- 示例:
item="item"表示每次迭代時(shí),當(dāng)前集合項(xiàng)會(huì)被引用為item。
3. index
- 作用: 可選參數(shù),指定每次迭代時(shí)當(dāng)前項(xiàng)的索引(從 0 開(kāi)始)。通常用于在 SQL 語(yǔ)句中需要索引的場(chǎng)景。
- 示例:
index="index"表示每次迭代時(shí),當(dāng)前項(xiàng)的索引會(huì)被引用為index。
4. open
- 作用: 在生成的 SQL 片段開(kāi)頭添加的內(nèi)容。通常用于生成集合的開(kāi)頭部分,如括號(hào)。
- 示例:
open="("表示生成的 SQL 片段的開(kāi)頭會(huì)加上左括號(hào)。
5. close
- 作用: 在生成的 SQL 片段末尾添加的內(nèi)容。通常用于生成集合的結(jié)束部分,如括號(hào)。
- 示例:
close=")"表示生成的 SQL 片段的末尾會(huì)加上右括號(hào)。
6. separator
- 作用: 指定每個(gè)集合項(xiàng)之間的分隔符。用于生成 SQL 片段中的項(xiàng)之間的分隔符,如逗號(hào)。
- 示例:
separator=","表示集合項(xiàng)之間會(huì)用逗號(hào)分隔
代碼演示:
<delete id="deleteTeacher" parameterType="list">
DELETE FROM teacher
WHERE id IN
<foreach collection="list" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
</delete>到此這篇關(guān)于MyBatis查詢(xún) 修改 刪除操作的文章就介紹到這了,更多相關(guān)MyBatis查詢(xún) 修改 刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
HelloSpringMVC配置版實(shí)現(xiàn)步驟解析
這篇文章主要介紹了HelloSpringMVC配置版實(shí)現(xiàn)步驟解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
關(guān)于spring data jpa一級(jí)緩存的問(wèn)題
這篇文章主要介紹了關(guān)于spring data jpa一級(jí)緩存的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Java守護(hù)線程實(shí)例詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在Java中有兩類(lèi)線程:User Thread(用戶(hù)線程)、Daemon Thread(守護(hù)線程) 。下面通過(guò)本文給大家分享java守護(hù)線程實(shí)例詳解,需要的朋友參考下吧2017-06-06
java實(shí)現(xiàn)批量下載 多文件打包成zip格式下載
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)批量下載、將多文件打包成zip格式下載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
mybatis?plus中如何編寫(xiě)sql語(yǔ)句
這篇文章主要介紹了mybatis?plus中如何編寫(xiě)sql語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
springmvc?html資源請(qǐng)求404的問(wèn)題解決并分析
這篇文章主要介紹了springmvc?html資源請(qǐng)求404的問(wèn)題解決并分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
idea使用pagehelper實(shí)現(xiàn)后端分頁(yè)功能的步驟詳解
這篇文章主要介紹了idea使用pagehelper實(shí)現(xiàn)后端分頁(yè)功能的步驟,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Servlet實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法
本文將結(jié)合實(shí)例代碼,介紹Servlet實(shí)現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

