之前寫的封裝方法詳解,比較簡要。
今天我主要講增加和刪除及其修改。查的話得單獨再詳講。
增刪改查,無論是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中in wrapper.notIn(column, value) //sql中 not in wrapper.orderBy(columns, isAsc) //排序 wrapper.exists(value) //相對於sql中exists查詢 wrapper.notExists(value) //相當於sql中not exists查詢 wrapper.notBetween(column, val1, val2) //相當於sql中在某個范圍內使用的between wrapper.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的靈活性。