最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作

 更新時間:2022年03月08日 11:04:55   作者:馮文議  
Mybatis-Plus是一個?Mybatis?的增強(qiáng)工具,在?Mybatis?的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus如何最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作的相關(guān)資料,需要的朋友可以參考下

引言

兩點:

一,使用MyBatis-Plus最新版(3.0.1)完成相關(guān)操作

二,好久沒寫MyBatis操作數(shù)據(jù)庫的博文了,有沒有想我啊,哈哈,認(rèn)真看,認(rèn)真聽,認(rèn)真學(xué)。

測試效果:

使用swagger2顯示API接口

swagge2 接口以及model信息

分頁接口測試.png

下面聽我細(xì)細(xì)道來,MyBatis-Plus的優(yōu)雅、簡潔與強(qiáng)大。

代碼生成器

代碼生成器,又被叫做逆向工程,MyBatis官方為了推廣,自己也寫了一個,我之前也使用這個,功能也是非常強(qiáng)大,強(qiáng)大以為支持自定義配置,那么問題來了,我該怎么配置才合理呢,所以,有人把所有的配置項都弄成中文的,還有人開發(fā)了生成插件,這些在我以往的博文中都看看到。MyBatis-Plus的代碼生成器到底怎么樣,這我就不評判了,我就這樣說,用用看吧。

在MyBatis-Plus的官網(wǎng)文檔中,有將代碼生成器的問題,有配置詳解,也有項目示例代碼,復(fù)制來就可用。

我這次是用MP 3.0.1,也就是最新版,官方還沒有更新呢,所以,我去找了很久的源碼,才將這個完成,勉強(qiáng)適合自己的了。這個在 CodeGenerator Module中,可以下下下來,導(dǎo)入到IDE中,看一下,修改配置就能運行。有問題,也可以與我討論。

功能列表:

[?] 自動生成model類

[?] 自動生成dao接口

[?] 自動生成xml文件

[?] 自動生成service接口

[?] 自動生成service實現(xiàn)類

[?] model支持Builder模式

[?] 支持swagger2

[?] 支持生成數(shù)據(jù)庫字段常量

[?] 支持生成Kotlin代碼

[] ......

項目初始化

第一步:pom.xml引入MyBatis-Plus依賴,注意,不需要再引入MyBatis的包,因為我這里使用Spring Boot搭建的工程,所有因為方式見下:

<dependencies>
    ...
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.1</version>
    </dependency>
    ...
</dependencies>

第二步:將生成的代碼,拷貝到相應(yīng)的包下

代碼目錄結(jié)構(gòu)

第三步:在配置文件中進(jìn)行相應(yīng)的配置

具體配置可參考官網(wǎng),這里需要注意這樣幾個地方:

mybatis-plus:
  # xml
  mapper-locations: classpath:mapper/*Mapper.xml
  # 實體掃描,多個package用逗號或者分號分隔
  type-aliases-package: com.fengwenyi.mp3demo.model
  configuration:
    # 這個配置會將執(zhí)行的sql打印出來,在開發(fā)或測試的時候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

日志:分頁查詢

第四步:在啟動類上添加下面的注解

@EnableTransactionManagement
@MapperScan("com.fengwenyi.mp3demo.dao")

增刪改

Service

我們一起去看源碼 com.baomidou.mybatisplus.extension.service.IService<T>

增加:

    /**
     * <p>
     * 插入一條記錄(選擇字段,策略插入)
     * </p>
     *
     * @param entity 實體對象
     */
    boolean save(T entity);

修改:

    /**
     * <p>
     * 根據(jù) ID 選擇修改
     * </p>
     *
     * @param entity 實體對象
     */
    boolean updateById(T entity);

    /**
     * <p>
     * 根據(jù) whereEntity 條件,更新記錄
     * </p>
     *
     * @param entity        實體對象
     * @param updateWrapper 實體對象封裝操作類 
     * {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    boolean update(T entity, Wrapper<T> updateWrapper);

刪除:

    /**
     * <p>
     * 根據(jù) ID 刪除
     * </p>
     *
     * @param id 主鍵ID
     */
    boolean removeById(Serializable id);

    /**
     * <p>
     * 根據(jù) entity 條件,刪除記錄
     * </p>
     *
     * @param queryWrapper 實體包裝類 
     * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    boolean remove(Wrapper<T> queryWrapper);

Mapper

com.baomidou.mybatisplus.core.mapper.BaseMapper<T>

增加:

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

修改:

    /**
     * <p>
     * 根據(jù) whereEntity 條件,更新記錄
     * </p>
     *
     * @param entity        實體對象 (set 條件值,不能為 null)
     * @param updateWrapper 實體對象封裝操作類(可以為 null,里面的 entity 用于生成 where 語句)
     */
    int update(@Param(Constants.ENTITY) T entity, 
               @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * <p>
     * 根據(jù) ID 修改
     * </p>
     *
     * @param entity 實體對象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

刪除:

? ? /**
? ? ?* <p>
? ? ?* 根據(jù) entity 條件,刪除記錄
? ? ?* </p>
? ? ?*
? ? ?* @param queryWrapper 實體對象封裝操作類(可以為 null)
? ? ?*/
? ? int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

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

以上相當(dāng)于是常用API了,我們?nèi)タ纯?,他是怎么實現(xiàn)的。毫無疑問,Mapper是底層,Service調(diào)用Mapper去執(zhí)行sql,完成相關(guān)操作,所以,你完全可以直接調(diào)用Mapper完成相關(guān)操作,就跟使用MyBatis一樣。下面我們?nèi)タ纯矗麕臀覀儗懙腟ervice是什么樣子,這里只看一個修改操作吧。

接口:

    /**
     * <p>
     * 根據(jù) whereEntity 條件,更新記錄
     * </p>
     *
     * @param entity        實體對象
     * @param updateWrapper 實體對象封裝操作類
     * {@link com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper}
     */
    boolean update(T entity, Wrapper<T> updateWrapper);

實現(xiàn):

    @Override
    public boolean update(T entity, Wrapper<T> updateWrapper) {
        return ServiceImpl.retBool(baseMapper.update(entity, updateWrapper));
    }

    /**
     * <p>
     * 判斷數(shù)據(jù)庫操作是否成功
     * </p>
     * <p>
     * 注意?。?該方法為 Integer 判斷,不可傳入 int 基本類型
     * </p>
     *
     * @param result 數(shù)據(jù)庫操作返回影響條數(shù)
     * @return boolean
     */
    protected static boolean retBool(Integer result) {
        return SqlHelper.retBool(result);
    }

    /**
     * <p>
     * 判斷數(shù)據(jù)庫操作是否成功
     * </p>
     *
     * @param result 數(shù)據(jù)庫操作返回影響條數(shù)
     * @return boolean
     */
    public static boolean retBool(Integer result) {
        return null != result && result >= 1;
    }

哈哈,是不是我們自己也會這樣寫?。?/p>

查詢

接下來,我們一起討論下查詢吧。

MP 3.x,查詢接口發(fā)生了很大的變化,反正我是不喜歡的,你就弄一個什么開頭啊,到時候,我一點就知道有哪些方法了,他這里有 list*, get*,反正就是一個字——沒必要。

先看下接口說明:

    /**
     * <p>
     * 查詢列表
     * </p>
     *
     * @param queryWrapper 實體對象封裝操作類 
     * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    List<T> list(Wrapper<T> queryWrapper);

      /**
     * <p>
     * 根據(jù) ID 查詢
     * </p>
     *
     * @param id 主鍵ID
     */
    T getById(Serializable id);

    /**
     * <p>
     * 根據(jù) Wrapper,查詢一條記錄
     * </p>
     *
     * @param queryWrapper 實體對象封裝操作類
     * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    T getOne(Wrapper<T> queryWrapper);

嗯,差不多了吧,這樣需要注意這樣一個方法:

    /**
     * <p>
     * 從list中取第一條數(shù)據(jù)返回對應(yīng)List中泛型的單個結(jié)果
     * </p>
     *
     * @param list
     * @param <E>
     * @return
     */
    public static <E> E getObject(List<E> list) {
        if (CollectionUtils.isNotEmpty(list)) {
            int size = list.size();
            if (size > 1) {
                SqlHelper.logger.warn(
String.format("Warn: execute Method There are  %s results.", size));
            }
            return list.get(0);
        }
        return null;
    }

下面說下分頁的問題

根據(jù)官網(wǎng)的說法,需要借助插件,這我們是可以理解。

在Spring Boot啟動類里面添加:

    /**
     * 分頁插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

這樣就可以使用他提供的分頁接口了:

    /**
     * <p>
     * 翻頁查詢
     * </p>
     *
     * @param page         翻頁對象
     * @param queryWrapper 實體對象封裝操作類
     * {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
     */
    IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);

我們?nèi)タ匆幌拢?/p>

    @Override
    public IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper) {
        queryWrapper = (Wrapper<T>) SqlHelper.fillWrapper(page, queryWrapper);
        return baseMapper.selectPage(page, queryWrapper);
    }

    /**
     * <p>
     * 填充Wrapper
     * </p>
     *
     * @param page    分頁對象
     * @param wrapper SQL包裝對象
     */
    @SuppressWarnings("unchecked")
    public static Wrapper<?> fillWrapper(IPage<?> page, Wrapper<?> wrapper) {
        if (null == page) {
            return wrapper;
        }
        if (ArrayUtils.isEmpty(page.ascs())
            && ArrayUtils.isEmpty(page.descs())
            && ObjectUtils.isEmpty(page.condition())) {
            return wrapper;
        }
        QueryWrapper qw;
        if (null == wrapper) {
            qw = new QueryWrapper<>();
        } else {
            qw = (QueryWrapper) wrapper;
        }
        // 排序
        if (ArrayUtils.isNotEmpty(page.ascs())) {
            qw.orderByAsc(page.ascs());
        }
        if (ArrayUtils.isNotEmpty(page.descs())) {
            qw.orderByDesc(page.descs());
        }
        // MAP 參數(shù)查詢
        if (ObjectUtils.isNotEmpty(page.condition())) {
            qw.allEq(page.condition());
        }
        return qw;
    }

    /**
     * <p>
     * 根據(jù) entity 條件,查詢?nèi)坑涗洠ú⒎摚?
     * </p>
     *
     * @param page         分頁查詢條件(可以為 RowBounds.DEFAULT)
     * @param queryWrapper 實體對象封裝操作類(可以為 null)
     */
    IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

分頁的代碼大抵就是這樣,我之前也自己寫過,思路還是相當(dāng)來說比較簡單,關(guān)鍵是看你的查詢添加如何封裝,分頁類如何構(gòu)造。

這里有一點說明:

分頁從 1 開始 !!!

枚舉類

1、實現(xiàn) 接口

/**
 * <p>
 * 自定義枚舉接口
 * </p>
 *
 * @author hubin
 * @since 2017-10-11
 */
public interface IEnum<T extends Serializable> {

    /**
     * 枚舉數(shù)據(jù)庫存儲值
     */
    T getValue();

}

2、實現(xiàn)注意

    @Override
    public Integer getValue() {
        return this.value;
    }

    @JsonValue
    public String getDesc() {
        return desc;
    }

這是Jackson的寫法,我沒用FastJson,所以用的伙伴,去官網(wǎng)看一下:FastJson看官網(wǎng)。

3:被忘了在配置文件中添加掃描:

mybatis-plus:
  # 掃描枚舉類 # 支持統(tǒng)配符 * 或者 ; 分割
  type-enums-package: com.fengwenyi.mp3demo.enums

差不多了吧,好像

邏輯刪除

1、代碼生成器中配置:

new StrategyConfig().setLogicDeleteFieldName("is_delete") // 邏輯刪除屬性名稱

或者,你可以手寫,參考:

    @ApiModelProperty(value = "是否邏輯刪除(true:刪除;false:正常(默認(rèn)))")
    @TableLogic
    private Boolean isDelete;

2、自定義數(shù)據(jù)庫的值:

mybatis-plus:
  global-config:
    db-config:
      #邏輯刪除配置
      logic-delete-value: 1
      logic-not-delete-value: 0

MyBatis-Plus-Example

MyBatis-Plus的代碼都會上傳到github上

https://github.com/fengwenyi/MyBatis-Plus-Example

參考資料

MyBatis-Plus

MyBatis-Plus 使用枚舉自動關(guān)聯(lián)注入

mybatis-plus插件使用的一些問題

設(shè)計模式之Builder模式

修復(fù)Long類型太長,而Java序列化JSON丟失精度問題的方法

總結(jié)

到此這篇關(guān)于MyBatis-Plus最優(yōu)雅最簡潔地完成數(shù)據(jù)庫操作的文章就介紹到這了,更多相關(guān)MyBatis-Plus數(shù)據(jù)庫操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java?SpringBoot整合shiro-spring-boot-starterqi項目報錯解決

    Java?SpringBoot整合shiro-spring-boot-starterqi項目報錯解決

    這篇文章主要介紹了Java?SpringBoot整合shiro-spring-boot-starterqi項目報錯解決,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下
    2022-08-08
  • java 兩個數(shù)組合并的幾種方法

    java 兩個數(shù)組合并的幾種方法

    本篇文章主要介紹了java 兩個數(shù)組合并的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Java導(dǎo)出Excel通用工具類實例代碼

    Java導(dǎo)出Excel通用工具類實例代碼

    這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出Excel通用工具類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java多線程之火車售票系統(tǒng)

    Java多線程之火車售票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java多線程之火車售票系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java的Volatile實例用法及講解

    Java的Volatile實例用法及講解

    在本篇文章里小編給大家整理了關(guān)于Java的Volatile知識點相關(guān)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。
    2019-09-09
  • java使用靜態(tài)關(guān)鍵字實現(xiàn)單例模式

    java使用靜態(tài)關(guān)鍵字實現(xiàn)單例模式

    這篇文章主要為大家詳細(xì)介紹了java使用靜態(tài)關(guān)鍵字實現(xiàn)單例模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 使用Java實現(xiàn)驗證碼程序

    使用Java實現(xiàn)驗證碼程序

    這篇文章主要為大家詳細(xì)介紹了使用Java實現(xiàn)驗證碼程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 解決nacos項目啟動報錯:Connection refused: no further informa問題

    解決nacos項目啟動報錯:Connection refused: no further&

    這篇文章主要介紹了解決nacos項目啟動報錯:Connection refused: no further informa問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • spring boot高并發(fā)下耗時操作的實現(xiàn)方法

    spring boot高并發(fā)下耗時操作的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于spring boot高并發(fā)下耗時操作的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id

    mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id

    這篇文章主要介紹了mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論

恩施市| 米林县| 徐闻县| 罗江县| 安乡县| 旬邑县| 泽普县| 新建县| 永顺县| 波密县| 营山县| 建水县| 同仁县| 辽阳县| 克山县| 灵寿县| 新和县| 玉山县| 莒南县| 丹阳市| 永修县| 溧水县| 平舆县| 贵德县| 泰安市| 温州市| 闸北区| 且末县| 禹城市| 兴城市| 苏尼特左旗| 陆河县| 上思县| 改则县| 六枝特区| 岚皋县| 中宁县| 同江市| 武清区| 宜川县| 敦化市|