Java後端--29--Mybatis的更新和刪除操作

隨 亦發表於2020-12-12

一、更新操作

1.1、普通更新操作

1、resources/mapper/MusicMapper.xml

<!-- 普通更新 -->
<update id="updateMusic" parameterType="com.demo.mybatis.domain.Music">
    update music
    <!-- 更新哪些欄位 -->
    set
    <!-- 左邊是資料庫的欄位,右邊是JavaPOJO欄位,所以有下劃線和駝峰的區別 -->
    title = #{title,jdbcType=VARCHAR},
    summary = #{summary,jdbcType=VARCHAR},
    cover_img = #{coverImg,jdbcType=VARCHAR},
    price = #{price,jdbcType=INTEGER},
    create_time = #{createTime,jdbcType=TIMESTAMP},
    point = #{point,jdbcType=DOUBLE}

    where
    <!-- 目前只根據id進行更新 -->
    id = #{id}
</update>

2、dao/MusicMapper.java

// 更新操作
int updateMusic(Music music);

3、SqlSessionDemo.java

// 跟新記錄
Music music =  new Music();
// 只更新id為52的標題的圖片
// 此處沒有設定其他欄位,所以其他欄位為空值,更新之後其他欄位即變為預設值
music.setId(52);
music.setTitle("原來是隨亦111,現在更新了");
music.setCoverImg("music-update.net/6666.png");

musicMapper.updateMusic(music);

4、執行效果演示

在這裡插入圖片描述

5、資料庫演示。可見整條資料全部更新了,沒有資料的更新為預設資料(預設一般是NULL、0等)

在這裡插入圖片描述

1.2、動態選擇更新

1、resources/mapper/MusicMapper.xml

<!-- 動態選擇更新,即只更新某些指定欄位 -->
<update id="updateMusicSelective" parameterType="com.demo.mybatis.domain.Music">
    update music
    <!-- trim用於去掉最後一行語句末尾的逗號,因為存在判斷語句,所以實際執行的時候,
    並不知道哪一句是最後一句,而最後一句必須是沒有逗號的,所以去逗號需要動態實現 -->
    <trim prefix="set" suffixOverrides=",">
        <!-- if test先判斷是否符合條件,符合條件則進行更新,不符合條件則不更新 -->
        <if test="title != null "> title = #{title,jdbcType=VARCHAR},</if>
        <if test="summary != null "> summary = #{summary,jdbcType=VARCHAR},</if>
        <if test="coverImg != null "> cover_img = #{coverImg,jdbcType=VARCHAR},</if>
        <if test="price != 0 "> price = #{price,jdbcType=INTEGER},</if>
        <if test="createTime != null "> create_time = #{createTime,jdbcType=TIMESTAMP},</if>
        <!-- 一定要看pojo類裡面的是基本資料型別,還是包裝資料型別 -->
		<if test="point != null "> point = #{point,jdbcType=DOUBLE},</if>
    </trim>

    where
    id = #{id}
</update>

2、dao/MusicMapper.java

// 動態選擇更新
int updateMusicSelective(Music music);

3、SqlSessionDemo.java

// 動態選擇更新
Music music =  new Music();
music.setId(53);
music.setTitle("原來是隨亦222,現在動態選擇更新了");
music.setCoverImg("music-update.net/6666.png");

musicMapper.updateMusicSelective(music);

4、執行效果演示

在這裡插入圖片描述

5、資料庫演示。可見該條資料只更新了指定的欄位,沒有指定的欄位資料保持原樣

在這裡插入圖片描述

二、刪除操作

1、resources/mapper/MusicMapper.xml

<!-- 刪除操作 -->
<delete id="deleteByCreateTimeAndPrice" parameterType="java.util.Map">
    <!-- 刪除符合條件的資料,此處的條件是:小於某個建立時間 且 大於等於某個價格的刪除 -->
    <!-- 此處不能直接使用">"標籤,需對該標籤進行轉義
     大於等於(將其用CDATA標籤包含起來即可):<![CDATA[ >= ]]>
     小於等於(將其用CDATA標籤包含起來即可):<![CDATA[ <= ]]>
     -->
    delete from music where create_time <![CDATA[ < ]]> #{createTime} and price <![CDATA[ >= ]]> #{price}
</delete>

2、dao/MusicMapper.java

// 根據時間和價格刪除
int deleteByCreateTimeAndPrice(Map<String,Object> map);

3、SqlSessionDemo.java

// 刪除操作
Map<String,Object> map = new HashMap<>();
// 刪除的條件
map.put("createTime","2020-12-10 22:14:00");
map.put("price",5980);
int rows = musicMapper.deleteByCreateTimeAndPrice(map);
System.out.println(rows);

4、執行效果演示

在這裡插入圖片描述

5、資料庫演示。可見刪除了符合要求的資料

在這裡插入圖片描述

三、總結

整體程式碼結構沒有變化:

在這裡插入圖片描述

本節修改過的程式碼檔案的整體程式碼,其他程式碼檔案本節未作修改:

1、resources/mapper/MusicMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--
namespace: 名稱空間,一般需要保持全域性唯一,最好是和dao層的java介面一致,
可以對映sql語句到對應的方法名稱和引數、返回型別。

mybatis是使用介面動態代理,所以namespace必須為dao層的全路徑,才能找得到
-->
<mapper namespace="com.demo.mybatis.dao.MusicMapper">

    <!-- 通過註解方式獲取值 -->
    <!--
    id:當前mapper下需要唯一,才能找得到
    resultType:sql查詢結果集的封裝
    -->
    <select id="selectById" parameterType="java.lang.Integer" resultType="com.demo.mybatis.domain.Music">
        <!-- 取值必須使用#號,否則存在SQL隱碼攻擊漏洞 -->
        <!-- orderby、like等動態SQL可以使用$取值 -->
        <!-- 取值必須和dao層引數名一致,如果有別名則使用別名 -->
        <!-- jdbcType對映成資料庫中的欄位,寫jdbcType是一個良好的程式設計習慣 -->
        select * from music where id = #{music_id,jdbcType=INTEGER}
    </select>

    <!-- 通過配置檔案方式獲取值 -->
    <select id="selectListByXML" resultType="com.demo.mybatis.domain.Music">
        select * from music
    </select>

    <select id="selectByPointAndTitleLike" resultType="com.demo.mybatis.domain.Music">
        <!-- 也是一個JavaType對映jdbcType型別的例子 -->
        select * from music where point=#{point,jdbcType=DOUBLE} and title like concat('%', #{title,jdbcType=VARCHAR},'%')
    </select>

    <!-- 增加資料 -->

    <!-- useGeneratedKeys:是否要利用自增的主鍵 -->
    <!-- keyProperty:對映到Java實體類的哪一個屬性,此處是id -->
    <!-- keyColumn:資料庫的哪一個屬性對映到Java實體類,此處是資料庫的id對映到Java實體類的id -->
    <insert id="add" parameterType="com.demo.mybatis.domain.Music" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
        <!-- 定義哪些欄位插入資料 -->
        INSERT INTO `music` ( `title`, `summary`, `cover_img`, `price`, `create_time`, `point`)
        VALUES
        <!-- 取值,和上一句的欄位要一一對應 -->
	    (#{title,jdbcType=VARCHAR},#{summary,jdbcType=VARCHAR},#{coverImg,jdbcType=VARCHAR},#{price,jdbcType=INTEGER},
	     #{createTime,jdbcType=TIMESTAMP},#{point,jdbcType=DOUBLE});
    </insert>

    <!-- 批量插入 -->

    <!-- 也是一個獲取了插入的自增主鍵 -->
    <insert id="addBatch" parameterType="com.demo.mybatis.domain.Music" useGeneratedKeys="true" keyProperty="id" keyColumn="id" >
        INSERT INTO `music` ( `title`, `summary`, `cover_img`, `price`, `create_time`, `point`)
        VALUES
        <!-- foreach用於迴圈拼接的內建標籤,常用於批量新增、查詢等 -->
        <!-- 需要通過物件取值,因此每個引數前面都有music.字首 -->
        <foreach collection="list" item="music" separator=",">
            (#{music.title,jdbcType=VARCHAR},#{music.summary,jdbcType=VARCHAR},#{music.coverImg,jdbcType=VARCHAR},
            #{music.price,jdbcType=INTEGER}, #{music.createTime,jdbcType=TIMESTAMP},#{music.point,jdbcType=DOUBLE})
        </foreach>
    </insert>

    <!-- 普通更新 -->
    <update id="updateMusic" parameterType="com.demo.mybatis.domain.Music">
        update music
        <!-- 更新哪些欄位 -->
        set
        <!-- 左邊是資料庫的欄位,右邊是JavaPOJO欄位,所以有下劃線和駝峰的區別 -->
        title = #{title,jdbcType=VARCHAR},
        summary = #{summary,jdbcType=VARCHAR},
        cover_img = #{coverImg,jdbcType=VARCHAR},
        price = #{price,jdbcType=INTEGER},
        create_time = #{createTime,jdbcType=TIMESTAMP},
        point = #{point,jdbcType=DOUBLE}

        where
        <!-- 目前只根據id進行更新 -->
        id = #{id}
    </update>

    <!-- 動態選擇更新,即只更新某些指定欄位 -->
    <update id="updateMusicSelective" parameterType="com.demo.mybatis.domain.Music">
        update music
        <!-- trim用於去掉最後一行語句末尾的逗號,因為存在判斷語句,所以實際執行的時候,
        並不知道哪一句是最後一句,而最後一句必須是沒有逗號的,所以去逗號需要動態實現 -->
        <trim prefix="set" suffixOverrides=",">
            <!-- if test先判斷是否符合條件,符合條件則進行更新,不符合條件則不更新 -->
            <if test="title != null "> title = #{title,jdbcType=VARCHAR},</if>
            <if test="summary != null "> summary = #{summary,jdbcType=VARCHAR},</if>
            <if test="coverImg != null "> cover_img = #{coverImg,jdbcType=VARCHAR},</if>
            <if test="price != 0 "> price = #{price,jdbcType=INTEGER},</if>
            <if test="createTime != null "> create_time = #{createTime,jdbcType=TIMESTAMP},</if>
            <!-- 一定要看pojo類裡面的是基本資料型別,還是包裝資料型別 -->
            <if test="point != null "> point = #{point,jdbcType=DOUBLE},</if>
        </trim>

        where
        id = #{id}
    </update>

    <!-- 刪除操作 -->
    <delete id="deleteByCreateTimeAndPrice" parameterType="java.util.Map">
        <!-- 刪除符合條件的資料,此處的條件是:小於某個建立時間 且 大於等於某個價格的刪除 -->
        <!-- 此處不能直接使用">"標籤,需對該標籤進行轉義
         大於等於(將其用CDATA標籤包含起來即可):<![CDATA[ >= ]]>
         小於等於(將其用CDATA標籤包含起來即可):<![CDATA[ <= ]]>
         -->
        delete from music where create_time <![CDATA[ < ]]> #{createTime} and price <![CDATA[ >= ]]> #{price}
    </delete>
</mapper>

2、dao/MusicMapper.java

public interface MusicMapper {
    // 根據音樂id查詢音樂物件
    // @Param是用來取別名,此處的別名是music_id
    Music selectById(@Param("music_id") int musicId);

    // 配置檔案方式查詢全部音樂列表
    List<Music> selectListByXML();

    // 註解方式查詢全部音樂列表(如果SQL簡單推薦這種方式)
    @Select("select * from music")
    List<Music> selectList();

    // 根據評分和標題模糊查詢,此處均使用了別名
    List<Music> selectByPointAndTitleLike(@Param("point") double point, @Param("title") String title);

    // 新增一條視訊記錄
    int add(Music music);

    // 批量插入
    int addBatch(List<Music> list);

    // 更新操作
    int updateMusic(Music music);

    // 動態選擇更新
    int updateMusicSelective(Music music);

    // 根據時間和價格刪除
    int deleteByCreateTimeAndPrice(Map<String,Object> map);
}

3、SqlSessionDemo.java

public class SqlSessionDemo {
    public static void main(String [] args) throws IOException {

        // 載入配置檔案
        String resouce = "config/mybatis-config.xml";
        // 讀取配置檔案
        InputStream inputStream = Resources.getResourceAsStream(resouce);

        // 構建Session工廠(sqlSessionFactory)
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 獲取Session
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {

            // 拿到對應的mapper檔案
            MusicMapper musicMapper = sqlSession.getMapper(MusicMapper.class);

            // 查詢musicId為3的資料
            // Music music = musicMapper.selectById(3);
            // System.out.println(music.toString());

            // 通過註解獲取值的方式(如果SQL簡單推薦這種方式)
            // List<Music> musicList =  musicMapper.selectList();

            // 通過配置檔案獲取值的方式
            // List<Music> musicList = musicMapper.selectListByXML();
            // System.out.println(musicList.toString());

            // 多引數查詢,此處是查詢評分為8.7分、標題為HTML的資料
            // List<Music> musicList = musicMapper.selectByPointAndTitleLike(8.7, "HTML");
            // System.out.println(musicList.toString());

            // 新增第一條記錄
            // Music music =  new Music();
            // music.setTitle("隨亦111");
            // music.setCoverImg("music.net/aaa111.png");
            // music.setPoint(9.4);
            // music.setCreateTime(new Date());
            // music.setPrice(9900);
            // music.setSummary("千里亦相隨111");

            // 新增第二條記錄
            // Music music2 =  new Music();
            // music2.setTitle("隨亦222");
            // music2.setCoverImg("music.net/aaa222.png");
            // music2.setPoint(9.2);
            // music2.setCreateTime(new Date());
            // music2.setPrice(9922);
            // music2.setSummary("千里亦相隨222");

            // List<Music> list = new ArrayList<>();
            // list.add(music);
            // list.add(music2);

            // 實現批量新增值
            // int rows = musicMapper.addBatch(list);

            // 輸出檢視
            // System.out.println(rows);
            // System.out.println(music.toString());

            // 跟新記錄
            // Music music =  new Music();
            // 只更新id為52的標題的圖片
            // 此處沒有設定其他欄位,所以其他欄位為空值,更新之後其他欄位即變為預設值
            // music.setId(52);
            // music.setTitle("原來是隨亦111,現在更新了");
            // music.setCoverImg("music-update.net/6666.png");

            // musicMapper.updateMusic(music);

            // 動態選擇更新
            // Music music =  new Music();
            // music.setId(53);
            // music.setTitle("原來是隨亦222,現在動態選擇更新了");
            // music.setCoverImg("music-update.net/6666.png");

            // musicMapper.updateMusicSelective(music);

            // 刪除操作
            Map<String,Object> map = new HashMap<>();
            // 刪除的條件
            map.put("createTime","2020-12-10 22:14:00");
            map.put("price",5980);
            int rows = musicMapper.deleteByCreateTimeAndPrice(map);
            System.out.println(rows);
        }
    }
}

相關文章