欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)タ纯?,他幫我們寫的Service是什么樣子,這里只看一個修改操作吧。

接口:

    /**
     * <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;
    }

哈哈,是不是我們自己也會這樣寫??!

查詢

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

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)文章

  • 使用maven如何將項目中的test代碼打包進(jìn)jar中

    使用maven如何將項目中的test代碼打包進(jìn)jar中

    這篇文章主要介紹了使用maven如何將項目中的test代碼打包進(jìn)jar中,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java中的日期時間類Date和SimpleDateFormat

    java中的日期時間類Date和SimpleDateFormat

    這篇文章主要介紹了java中的日期時間類Date和SimpleDateFormat,Date類的對象在Java中代表的是當(dāng)前所在系統(tǒng)的此刻日期時間,說白了就是你計算機(jī)上現(xiàn)實的時間,需要的朋友可以參考下
    2023-09-09
  • java實現(xiàn)遠(yuǎn)程桌面的實例代碼

    java實現(xiàn)遠(yuǎn)程桌面的實例代碼

    下面小編就為大家分享一篇java實現(xiàn)遠(yuǎn)程桌面的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java實現(xiàn)動態(tài)驗證碼生成

    Java實現(xiàn)動態(tài)驗證碼生成

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)動態(tài)驗證碼生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • maven package后Idea項目中找不到target文件的解決

    maven package后Idea項目中找不到target文件的解決

    在Idea中執(zhí)行mavenpackage打包后,target文件不顯示,點擊「ShowinExplore」可以在本地文件夾中查到,解決方法:在Idea的Maven工具窗口中,右鍵點擊項目,選擇Reimport,刷新項目即可
    2024-11-11
  • Java由淺入深細(xì)數(shù)數(shù)組的操作上

    Java由淺入深細(xì)數(shù)數(shù)組的操作上

    數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同。Java?語言中提供的數(shù)組是用來存儲固定大小的同類型元素
    2022-04-04
  • Spring Boot應(yīng)用啟動時自動執(zhí)行代碼的五種方式(常見方法)

    Spring Boot應(yīng)用啟動時自動執(zhí)行代碼的五種方式(常見方法)

    Spring Boot為開發(fā)者提供了多種方式在應(yīng)用啟動時執(zhí)行自定義代碼,這些方式包括注解、接口實現(xiàn)和事件監(jiān)聽器,本文我們將探討一些常見的方法,以及如何利用它們在應(yīng)用啟動時執(zhí)行初始化邏輯,感興趣的朋友一起看看吧
    2024-04-04
  • springboot實現(xiàn)執(zhí)行sql語句打印到控制臺

    springboot實現(xiàn)執(zhí)行sql語句打印到控制臺

    這篇文章主要介紹了springboot實現(xiàn)執(zhí)行sql語句打印到控制臺的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 關(guān)于nacos無法正常下線問題記錄

    關(guān)于nacos無法正常下線問題記錄

    這篇文章主要介紹了關(guān)于nacos無法正常下線問題記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringBoot事件發(fā)布和監(jiān)聽詳解

    SpringBoot事件發(fā)布和監(jiān)聽詳解

    今天去官網(wǎng)查看spring boot資料時,在特性中看見了系統(tǒng)的事件及監(jiān)聽章節(jié),所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot事件發(fā)布和監(jiān)聽的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11

最新評論