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中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的靈活性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM