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实战系列(十一)之封装方法详解(续一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基础学习(五)第一次修改
- 下一篇: 第三篇:函数之对象