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

參數(shù)傳遞
單參數(shù)傳遞
Admin selectAdmins(int id);
多參數(shù)傳遞
多個參數(shù)使用@Param(“id”)綁定
//多個參數(shù)的傳遞
Admin login(@Param("acc") String account, @Param("pass") String password);復(fù)雜參數(shù)傳遞
如果傳入一個復(fù)雜的對象,就需要使用 parameterType 參數(shù)進行類型定義,例如: 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>
<!-- 查詢-->
<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語句中,一般不用與向sql中傳值,一般用于向SQL中動態(tài)的傳遞列名
區(qū)別:
- 底層實現(xiàn)不同
- #{} 采用預(yù)編譯方式,防止sql注入更加的安全
- ${} 采用字符串拼接,直接將值拼接在sql中
- 使用場景不同
- #{} 一般用于向sql中的列傳值
- ${} 一般用于向sql中動態(tài)的傳遞列明 例如:排序時 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)識,本例中定義為 “majorMap”
- resutlMap 的 type 屬性是映射的 POJO 類型
- id 標(biāo)簽映射主鍵,result 標(biāo)簽映射非主鍵
- property 設(shè)置對象屬性名稱,column 映射查詢結(jié)果的列名稱
駝峰命名與下劃線映射關(guān)系
為什么要解決駝峰命名與下劃線映射關(guān)系?
因為數(shù)據(jù)庫中命名一般為Student_Id Java中命名一般為StudentId所以為了我們方便操作,我們通過設(shè)置來解決問題
解決:在mybatis配置文件中設(shè)置如下代碼
<!-- MyBatis配置文件-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 打印日志 -->
<setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 解決駝峰問題 -->
</settings>多表操作 association 關(guān)聯(lián)數(shù)據(jù)表 關(guān)聯(lián)查詢
方法一:在數(shù)據(jù)庫中一次查出所有數(shù)據(jù)
<!--對關(guān)聯(lián)查詢到的學(xué)生信息進行自定義映射關(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ù) 專業(yè)名稱-->
<association property="major" javaType="major">
<result column="mname" property="name"></result>
</association>
</resultMap>
<!--關(guān)聯(liá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對象中的major成員變量
javaType="major"----->major對象
解釋:我們在Student類中創(chuàng)建Major變量,從而將Major類和Student類連接.我們從后端查詢出來的Major類中數(shù)據(jù),我們可直接封裝在Major對象中(簡單理解:其實也就是給Major變量賦值)
嵌套查詢
方法二:數(shù)據(jù)庫分次查詢
<!-- 關(guān)聯(liá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)查詢-->
<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>
<!-- 嵌套查詢學(xué)生關(guān)聯(lián)的專業(yè)-->
<select id="findMajor" resultType="major">
select name from major where id = #{majorid}
</select>
collection關(guān)聯(lián)數(shù)據(jù)表
collection用來查詢一個集合
關(guān)聯(liá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>嵌套查詢
<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 是一個數(shù)據(jù)結(jié)構(gòu)或容器,用于存儲一組對象。它通常用于管理和操作多個相同類型的對象。例如,列表(List)、數(shù)組(Array)、集合(Set)等都是典型的 Collection。
- 特點:
- 包含多個對象,可以對其進行添加、刪除、迭代等操作。
- Collection 通常與某種特定的數(shù)據(jù)結(jié)構(gòu)關(guān)聯(lián),負(fù)責(zé)對這些對象進行管理(如排序、查找等)。
- 對象的生存周期通常由 Collection 管理,特別是在集合被銷毀時,里面的對象可能也會被銷毀。
- 用途: 用于聚合和管理一組對象,通常用于處理大量相同類型的對象集合。
Association(關(guān)聯(lián)關(guān)系)
- 定義: Association 是一種類與類之間的關(guān)系,描述一個類的對象與另一個類的對象之間的鏈接。例如,一個學(xué)校類和一個學(xué)生類之間可能會有一個 Association,表示學(xué)校包含許多學(xué)生。
- 特點:
- 表示類之間的連接或關(guān)系,而不是數(shù)據(jù)結(jié)構(gòu)本身。
- Association 可以是單向或雙向的。單向 Association 表示一個類知道另一個類的存在,但反之不然;雙向 Association 則表示兩個類彼此都知道對方。
- 關(guān)聯(lián)關(guān)系不負(fù)責(zé)對象的生存周期管理。對象的創(chuàng)建和銷毀由其他機制負(fù)責(zé)。
- 用途: 用于表示類與類之間的關(guān)系,幫助定義對象間的交互和連接。
總結(jié)
- Collection 主要用于管理一組對象的集合,關(guān)注的是數(shù)據(jù)結(jié)構(gòu)和對象的管理。
- Association 主要用于描述類之間的關(guān)系,關(guān)注的是對象之間的連接和相互作用
注解方式
- @Insert : 插入 sql , 和 xml insert sql 語法完全一樣
- @Select : 查詢 sql, 和 xml select sql 語法完全一樣
- @Update :更新 sql, 和 xml update sql 語法完全一樣
- @Delete :刪除 sql, 和 xml delete sql 語法完全一樣
使用場景:簡單的sql一般適合使用注解查詢 例如:用戶信息查詢,添加用戶,刪除單個用戶等
代碼演示:
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);動態(tài)sql
出現(xiàn)原因:因為業(yè)務(wù)需求出現(xiàn)用戶存數(shù)據(jù)可能只存 姓名 不存 性別 或者不存任何數(shù)據(jù),sql語句就需要判斷書寫.
第一:where 與 if 標(biāo)簽
if test 屬性條件成立 執(zhí)行if標(biāo)簽體,不成立就不執(zhí)行
where標(biāo)簽 當(dāng)where標(biāo)簽 if語句有條件成立時,就會動態(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 語句前添加的內(nèi)容。
- 示例: 如果你想在 SQL 語句的條件部分加上
WHERE,可以使用prefix="WHERE"。
- prefixOverrides:
- 作用: 如果生成的 SQL 語句以指定的內(nèi)容開頭,則移除這些內(nèi)容。通常用于去掉多余的
AND或OR。 - 示例:
prefixOverrides="AND"會去掉生成 SQL 語句中以AND開頭的部分。
- 作用: 如果生成的 SQL 語句以指定的內(nèi)容開頭,則移除這些內(nèi)容。通常用于去掉多余的
- suffix:
- 作用: 在生成的 SQL 語句末尾添加的內(nèi)容。
- 示例: 如果你想在 SQL 語句的最后加上
ORDER BY,可以使用suffix="ORDER BY"。
- suffixOverrides:
- 作用: 如果生成的 SQL 語句以指定的內(nèi)容結(jié)尾,則移除這些內(nèi)容。通常用于去掉多余的逗號、AND 或 OR。
- 示例:
suffixOverrides=","會去掉生成 SQL 語句末尾多余的逗號
第三:choose標(biāo)簽
注:choose標(biāo)簽選擇標(biāo)簽,標(biāo)簽中必須有選擇對象,也就是必須有<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)簽可以在變量之間添加 逗號(,)
<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
- 作用: 指定要迭代的集合。這個集合可以是列表、數(shù)組或其他 Java 集合類型。
- 示例:
collection="list"表示要迭代名為list的集合。
2. item
- 作用: 指定每次迭代時集合中元素的變量名。
- 示例:
item="item"表示每次迭代時,當(dāng)前集合項會被引用為item。
3. index
- 作用: 可選參數(shù),指定每次迭代時當(dāng)前項的索引(從 0 開始)。通常用于在 SQL 語句中需要索引的場景。
- 示例:
index="index"表示每次迭代時,當(dāng)前項的索引會被引用為index。
4. open
- 作用: 在生成的 SQL 片段開頭添加的內(nèi)容。通常用于生成集合的開頭部分,如括號。
- 示例:
open="("表示生成的 SQL 片段的開頭會加上左括號。
5. close
- 作用: 在生成的 SQL 片段末尾添加的內(nèi)容。通常用于生成集合的結(jié)束部分,如括號。
- 示例:
close=")"表示生成的 SQL 片段的末尾會加上右括號。
6. separator
- 作用: 指定每個集合項之間的分隔符。用于生成 SQL 片段中的項之間的分隔符,如逗號。
- 示例:
separator=","表示集合項之間會用逗號分隔
代碼演示:
<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查詢 修改 刪除操作的文章就介紹到這了,更多相關(guān)MyBatis查詢 修改 刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解在idea 中使用Mybatis Generator逆向工程生成代碼
這篇文章主要介紹了在idea 中使用Mybatis Generator逆向工程生成代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
基于java+springboot+mybatis+laiyu實現(xiàn)學(xué)科競賽管理系統(tǒng)
這篇文章主要介紹了基于java+springboot+mybatis+laiyu實現(xiàn)的學(xué)科競賽管理系統(tǒng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
SpringBoot基于Jackson解決Long型長度丟失問題
本文主要介紹了SpringBoot基于Jackson解決Long型長度丟失問題,通過自定義Jackson ObjectMapper子類添加String序列化器,并在SpringMVC配置中注冊該轉(zhuǎn)換器,使ID在JSON傳輸中保持完整,與數(shù)據(jù)庫數(shù)據(jù)一致2025-08-08
Java 通過JDBC連接Mysql數(shù)據(jù)庫
本文給大家詳細(xì)介紹了java如何使用JDBC連接Mysql的方法以及驅(qū)動包的安裝,最后給大家附上了java通過JDBC連接其他各種數(shù)據(jù)庫的方法,有需要的小伙伴可以參考下。2015-11-11

