日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MP实战系列(十一)之封装方法详解(续一)

發布時間:2025/4/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MP实战系列(十一)之封装方法详解(续一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前寫的封裝方法詳解,比較簡要。

今天我主要講增加和刪除及其修改。查的話得單獨再詳講。

增刪改查,無論是Java或者C#等等,凡是對數據庫操作的都離不開這四個。

一、增加方法講解

MyBatis Plus很好的將增加的方法進行封裝。

而且它封裝的這個比原來的MyBatis要靈活的多。

比如下面代碼:

UserEntity u = new UserEntity();u .setLogo(0);u .setCreateTime(DateUtils.getDateTime());u .setEmail("test@231.com");u.setPassword("123456");u.setSex("1");u.setUsername("test001");int line = ud.insert(u); System.out.println(line);

調用就是對應BaseMapper里面的該方法:

/*** <p>* 插入一條記錄* </p>** @param entity 實體對象* @return int*/Integer insert(T entity);

 你可以指定需要在數據表中插入的數據。至于主鍵有四種策略:

主鍵策略源碼:

/*** Copyright (c) 2011-2020, hubin (jobob@qq.com).* <p>* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at* <p>* http://www.apache.org/licenses/LICENSE-2.0* <p>* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/ package com.baomidou.mybatisplus.enums;/*** <p>* 生成ID類型枚舉類* </p>** @author hubin* @Date 2015-11-10*/ public enum IdType {AUTO(0, "數據庫ID自增"), INPUT(1, "用戶輸入ID"),/* 以下2種類型、只有當插入對象ID 為空,才自動填充。 */ID_WORKER(2, "全局唯一ID"), UUID(3, "全局唯一ID"), NONE(4, "該類型為未設置主鍵類型");/*** 主鍵*/private final int key;/*** 描述*/private final String desc;IdType(final int key, final String desc) {this.key = key;this.desc = desc;}/*** <p>* 主鍵策略 (默認 ID_WORKER)* </p>** @param idType ID 策略類型* @return*/public static IdType getIdType(int idType) {IdType[] its = IdType.values();for (IdType it : its) {if (it.getKey() == idType) {return it;}}return ID_WORKER;}public int getKey() {return this.key;}public String getDesc() {return this.desc;}}

 

這四種簡單的說,根據數據表中的主鍵而定,如果你的主鍵是int或者tinyint類型,可以使用自增策略,如果是varchar類型可以使用UUID或者自定義以某種方式進行主鍵生成,通常自定義的話,需要在調用增加方法的時候進行setId(),setId()里面可以填寫,也可以調用某個工具類隨機生成等。

UserEntity u = new UserEntity();u .setLogo(0);u .setCreateTime(DateUtils.getDateTime());u .setEmail("test@123.com");u.setPassword("123456");u.setSex("1");u.setUsername("test003");int lines = ud.insertAllColumn(u);System.out.println(lines);

?

這里的代碼和第一段代碼基本是一樣的除了方法名不一樣而已,方法的作用都是增加,MyBatis Plus開發者之所以這樣起名,我認為應該是有個區分,方法如其名,insertAllColumn意為插入該表所有數據,如果該表有十列,那么這一條數據也應該包含十個列名,對應Java中,也就是屬性名。

?

?

二、修改方法講解

修改中在實際開發,也應用很多,基本可以說,對于龐大的業務系統而言,數據是不允許刪除的,頂多就是改改狀態,假性刪除。對于數據為王的時代,數據就是經濟,數據就是發展。

于是誕生了一個叫大數據的玩意,幫助人們管理數據,然后又誕生了一個職業叫數據分析師,通過分析數據得到某個結論,從而發掘某個市場。

修改的話與增加基本一致,不一致的就是一個在數據表中插入一條數據,而修改,顧名思義,當然是修改對應的數據。

代碼如下:

UserEntity u = new UserEntity();u.setUserId(34);u .setLogo(0);u .setCreateTime(DateUtils.getDateTime());u .setEmail("test@123.com");u.setPassword("123456");u.setSex("2");u.setUsername("test003");int lines = ud.updateById(u);System.out.println(lines);

updateById(),意思是根據主鍵進行修改

相當于MyBatis這樣的一條sql語句:udpate `user` set logo=#{logo} where userId=#{userId}

根據主鍵進行修改。

如果不指定主鍵就無法完成修改業務。

源代碼如下:

/*** <p>* 根據 ID 修改* </p>** @param entity 實體對象* @return int*/Integer updateById(@Param("et") T entity);

updateAllColumnById()意思也是以主鍵為主,對所有的數據列進行修改,當然了,這里的所有是指符合主鍵的條件。主鍵唯一的嘛,當然僅僅就是對該條數據進行修改 UserEntity u = new UserEntity();u.setUserId(34);u .setLogo(0);u .setCreateTime(DateUtils.getDateTime());u .setEmail("test@231.com");u.setPassword("123456");u.setSex("2");u.setUsername("test003");int lines = ud.updateAllColumnById(u);System.out.println(lines);

源代碼如下:

/*** <p>* 根據 ID 修改* </p>** @param entity 實體對象* @return int*/Integer updateAllColumnById(@Param("et") T entity);

?

大家或許要問,我不想通過主鍵來修改數據,我只想傳幾個對應的參數來修改數據,別擔心,MyBatis Plus這個也替你考慮了。

看演示代碼:

UserEntity u = new UserEntity();u.setUserId(34);u .setLogo(0);u .setCreateTime(DateUtils.getDateTime());u .setEmail("test@231.com");u.setPassword("123456");u.setSex("4");u.setUsername("test003");EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();wrapper.eq("user_id", 34);wrapper.eq("email", "test@323.com");int lines = ud.update(u, wrapper);System.out.println(lines);

?

上述代碼本質的sql就是 update 表名 set column=#{data1},column2=#{data2} where user_id=#{userId} and email=#{email}

記住wrapper.eq()對應的參數,一個是數據表中的列名,另外一個就是對應的值。記得一定要填寫正確的列名,否則就會修改失敗。

對于傳統的MyBatis而言,找不到列,會報sql錯誤等異常信息。而MyBatis Plus就不會報。

這里我提醒一句,還是那句話,單元測試很重要,首先在單元測試,測試通過了,多弄幾個常用條件測試,測試都沒問題,再進行ui層面的,也就是web開發。

源代碼如下:

/*** <p>* 根據 whereEntity 條件,更新記錄* </p>** @param entity 實體對象* @param wrapper 實體對象封裝操作類(可以為 null)* @return*/Integer update(@Param("et") T entity, @Param("ew") Wrapper<T> wrapper);

?

這里的Wrapper<T> wrapper非常靈活

只要是wrapper里面有的方法,都可以常用。

比如:

wrapper.between(column, val1, val2)wrapper.groupBy(columns) //對應sql中分組wrapper.eq(column, params) //相當于where條件wrapper.in(column, value) //sql中inwrapper.notIn(column, value) //sql中 not inwrapper.orderBy(columns, isAsc) //排序wrapper.exists(value) //相對于sql中exists查詢wrapper.notExists(value) //相當于sql中not exists查詢wrapper.notBetween(column, val1, val2) //相當于sql中在某個范圍內使用的betweenwrapper.ge(column, params) //大于等于wrapper.le(column, params) //小于等于wrapper.like(column, value) //模糊查詢wrapper.having(sqlHaving, params) //條件過濾

上述wrapper都可以用,前提是只要你有這個需求。

?

三、刪除方法講解

雖然之前強調過,刪除在實際應用中,用的少,這個少是指需求。關鍵是看業務。

比如博客方面,博客系統有一個叫回收站的地方,回收站里面都是一些作者刪除沒用的文章放置處,這個資源對于非盈利性組織而言,回收處的垃圾需要定時清理。

不然的話,數據量大也一定增加會增加服務器壓力,數據庫也是服務器,名曰:數據服務器。

deleteById()?根據主鍵進行刪除

代碼如下:

int lines = ud.deleteById(34);System.out.println(lines);

源碼如下:

/*** <p>* 根據 ID 刪除* </p>** @param id 主鍵ID* @return int*/Integer deleteById(Serializable id);

?

deleteByMap()方法

源代碼如下:

/*** <p>* 根據 columnMap 條件,刪除記錄* </p>** @param columnMap 表字段 map 對象* @return int*/Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);

?

演示代碼如下:

Map<String,Object> map = new HashMap<String,Object>();map.put("username", "李四");int lines = ud.deleteByMap(map);System.out.println(lines);

?

本質相當于 delete from table where username=#{username}

還可以繼續增加條件,對于Java代碼而言就是增加幾個put。

?

delete()方法

源代碼如下:

/*** <p>* 根據 entity 條件,刪除記錄* </p>** @param wrapper 實體對象封裝操作類(可以為 null)* @return int*/Integer delete(@Param("ew") Wrapper<T> wrapper);

?

演示代碼如下:

EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();wrapper.eq("username", "王麻子");wrapper.eq("email", "123@qq.com");int lines = ud.delete(wrapper);System.out.println(lines);

其實本質上還是它

這個"它"指的是?delete from table where username=#{username} and email=#{email}

只不過put里面的鍵必須與#{username}一致否則會刪除失敗,而對于eq而言,對應鍵必須和數據表中的列名,即column一致,否則刪除失敗。就無法達到刪除數據的目的。

?

deleteBatchIds()

批量刪除,在實際中用的也比較多,主要針對無用日志或者對于博客而言,用戶刪除聊天信息等,通常一個一個刪除麻煩,直接批量刪除即可。

源碼如下:

/*** <p>* 刪除(根據ID 批量刪除)* </p>** @param idList 主鍵ID列表* @return int*/Integer deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

?

在這里也得提提動態sql

deleteBatchIds();

本質上代碼相當于這個:

<delete id="batchDeleteUser">delete from table where column in (<foreach collection="idList" item="attribute" separator=",">#{id}</foreach>) </delete>

不過要看清楚了,還是基于主鍵批量刪除。

?

總結:

個人看來,不管怎么樣,MyBatis還是基礎,只有當MyBatis用的非常熟練,那么對于MyBatis Plus可以融會貫通。

本質上說,MyBatis Plus就是MyBatis。MyBatis Plus的創建者們也一再強調多,MyBatis Plus對于MyBatis而言只做增強不做改變。

所以說,用MyBatis Plus,其實相當于還在用MyBatis,只不過,我們不需要再重復性寫大量sql,當然了,這個不寫,并不是指什么都不寫,而是指像增刪改這類的,我們完全可以不用自己寫,因為MyBatis Plus,已經將它們都封裝好了。而我們只需調用即可。

當然了,對于一些復雜業務,需要多表查的,我們只能通過自己手動編寫了。這樣也保留了MyBatis的靈活性。

?

轉載于:https://www.cnblogs.com/youcong/p/9310848.html

總結

以上是生活随笔為你收集整理的MP实战系列(十一)之封装方法详解(续一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。