Java後端--29--Mybatis的更新和刪除操作
一、更新操作
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);
}
}
}
相關文章
- CnosDB的資料更新和刪除
- Python3訪問、更新和刪除列表Python
- Git 操作——如何刪除本地分支和遠端分支Git
- flowable的查詢操作和刪除操作
- Laravel 軟刪除操作Laravel
- Masonite 熟悉步驟小記錄 (七、更新和刪除文章)
- 主鍵的建立、新增、刪除操作
- DML(Data Manipulation Language、資料操作語言),用於新增、刪除、更新和查詢資料庫記資料庫
- 如何對 ABAP 資料庫表透過 ABAP 程式碼進行更新和刪除操作試讀版資料庫
- vue+element-ui操作刪除(單行和批量刪除)VueUI
- Java 操作PDF中的超連結——新增、更新、刪除超連結Java
- C++ 順序容器的刪除操作C++
- 刪除_JAVA_OPTIONSJava
- Java SSH 客戶端 如何刪除 linux 機器上的 檔案Java客戶端Linux
- JavaScript刪除字串中最後的逗號JavaScript字串
- JavaScript刪除字串兩端空格JavaScript字串
- Cookie新增、獲取以及刪除操作Cookie
- redis cluster節點/新增刪除操作Redis
- mybatis mapper.xml批次刪除操作MyBatisAPPXML
- Java 操作PPT數字簽名(一):新增、檢測、刪除簽名Java
- 重構 001 - 刪除Java的Setter方法Java
- LintCode 1905. 字元刪除 Java字元Java
- Git批量刪除分支| 8月更文挑戰Git
- QQ恢復解散後的群聊或刪除後的好友的方法
- SQL的資料庫操作:新增、更新、刪除、查詢SQL資料庫
- Java-二叉排序樹的刪除Java排序
- Java拼接字串時,去掉最後一個多餘的逗號,或者Java刪除某個字元Java字串字元
- 節點操作(刪除,複製)/案例1:刪除留言板的留言 /案例2:動態生成表格
- mysql資料庫誤刪除操作說明MySql資料庫
- oracle資料庫建立、刪除索引等操作Oracle資料庫索引
- kindeditor 圖片管理增加刪除操作按鈕
- windows10更新助手怎麼刪除_windows10更新助手刪除操作方法Windows
- Java在PDF中刪除註釋Java
- 線性表的相關操作-初始化、增添、刪除
- 請求結束後刪除檔案
- 登錄檔刪除之後又出現
- Java8的stream流讓操作集合更容易Java
- 刪除按鈕點選後的虛線輪廓