MyBatis查詢?、修改?、刪除操作示例代碼
前言:
在現(xiàn)代應用開發(fā)中,數(shù)據(jù)庫操作是核心環(huán)節(jié)。MyBatis 作為一款靈活的持久層框架,提供了直接編寫 SQL 語句的能力,避免了其他 ORM 框架可能帶來的性能和功能限制。MyBatis 的查詢、修改和刪除操作是開發(fā)者必須掌握的基本技能。這些操作不僅影響數(shù)據(jù)的獲取、更新和刪除,還直接關(guān)系到應用的性能與安全性。接下來,我們將簡要介紹 MyBatis 中如何高效執(zhí)行這三種操作,并通過代碼示例展示最佳實踐
MyBatis搭建與配置
- 創(chuàng)建一個maven對象
- 導入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 —>唯一標識(接口中方法名)
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);
復雜參數(shù)傳遞
如果傳入一個復雜的對象,就需要使用 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ū)別
#{} 占位符,采用預編譯的方式向sql中傳值,可以防止sql注入,如果我們往SQL傳值,使用#{}
${} 是將內(nèi)容直接拼接到sql語句中,一般不用與向sql中傳值,一般用于向SQL中動態(tài)的傳遞列名
區(qū)別:
- 底層實現(xiàn)不同
- #{} 采用預編譯方式,防止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 的唯一標識,本例中定義為 “majorMap”
- resutlMap 的 type 屬性是映射的 POJO 類型
- id 標簽映射主鍵,result 標簽映射非主鍵
- 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)查詢到的學生信息進行自定義映射關(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> <!-- 嵌套查詢學生關(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),負責對這些對象進行管理(如排序、查找等)。
- 對象的生存周期通常由 Collection 管理,特別是在集合被銷毀時,里面的對象可能也會被銷毀。
- 用途: 用于聚合和管理一組對象,通常用于處理大量相同類型的對象集合。
Association(關(guān)聯(lián)關(guān)系)
- 定義: Association 是一種類與類之間的關(guān)系,描述一個類的對象與另一個類的對象之間的鏈接。例如,一個學校類和一個學生類之間可能會有一個 Association,表示學校包含許多學生。
- 特點:
- 表示類之間的連接或關(guān)系,而不是數(shù)據(jù)結(jié)構(gòu)本身。
- Association 可以是單向或雙向的。單向 Association 表示一個類知道另一個類的存在,但反之不然;雙向 Association 則表示兩個類彼此都知道對方。
- 關(guān)聯(lián)關(guān)系不負責對象的生存周期管理。對象的創(chuàng)建和銷毀由其他機制負責。
- 用途: 用于表示類與類之間的關(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è)務需求出現(xiàn)用戶存數(shù)據(jù)可能只存 姓名 不存 性別 或者不存任何數(shù)據(jù),sql語句就需要判斷書寫.
第一:where 與 if 標簽
if test 屬性條件成立 執(zhí)行if標簽體,不成立就不執(zhí)行
where標簽 當where標簽 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標簽
參數(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標簽
注:choose標簽選擇標簽,標簽中必須有選擇對象,也就是必須有<when>標簽
<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> --->當test中條件滿足這執(zhí)行,不滿足執(zhí)行<otherwise>標簽中 和 if else差不多
第四:set標簽
<set>標簽可以在變量之間添加 逗號(,)
<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標簽
1. collection
- 作用: 指定要迭代的集合。這個集合可以是列表、數(shù)組或其他 Java 集合類型。
- 示例:
collection="list"
表示要迭代名為list
的集合。
2. item
- 作用: 指定每次迭代時集合中元素的變量名。
- 示例:
item="item"
表示每次迭代時,當前集合項會被引用為item
。
3. index
- 作用: 可選參數(shù),指定每次迭代時當前項的索引(從 0 開始)。通常用于在 SQL 語句中需要索引的場景。
- 示例:
index="index"
表示每次迭代時,當前項的索引會被引用為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)文章
關(guān)于spring data jpa一級緩存的問題
這篇文章主要介紹了關(guān)于spring data jpa一級緩存的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11Java守護線程實例詳解_動力節(jié)點Java學院整理
在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程) 。下面通過本文給大家分享java守護線程實例詳解,需要的朋友參考下吧2017-06-06java實現(xiàn)批量下載 多文件打包成zip格式下載
這篇文章主要為大家詳細介紹了java實現(xiàn)批量下載、將多文件打包成zip格式下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07idea使用pagehelper實現(xiàn)后端分頁功能的步驟詳解
這篇文章主要介紹了idea使用pagehelper實現(xiàn)后端分頁功能的步驟,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Servlet實現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法
本文將結(jié)合實例代碼,介紹Servlet實現(xiàn)共享數(shù)據(jù)JavaWeb組件的幾種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07