欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis查詢?、修改?、刪除操作示例代碼

 更新時間:2024年08月29日 15:26:21   作者:蘇少朋  
MyBatis?作為一款靈活的持久層框架,提供了直接編寫?SQL?語句的能力,避免了其他?ORM?框架可能帶來的性能和功能限制,本文介紹?MyBatis?中如何高效執(zhí)行這三種操作,并通過代碼示例展示最佳實踐,感興趣的朋友一起看看吧

前言:

在現(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

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)容。通常用于去掉多余的 ANDOR。
    • 示例: prefixOverrides="AND" 會去掉生成 SQL 語句中以 AND 開頭的部分。
  • 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)文章

最新評論