国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MyBatis-Plus 進(jìn)階學(xué)習(xí)筆記】

這篇具有很好參考價值的文章主要介紹了【MyBatis-Plus 進(jìn)階學(xué)習(xí)筆記】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一、 MyBatis Plus 七大功能

0. 數(shù)據(jù)準(zhǔn)備

數(shù)據(jù)庫表:
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL COMMENT '主鍵 ',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  `email` varchar(50) DEFAULT NULL COMMENT '郵箱',
  `manager_id` bigint(20) DEFAULT NULL COMMENT '直屬上級id',
  `create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建時間',
  `update_time` datetime DEFAULT NULL COMMENT '修改時間',
  `version` int(11) DEFAULT '1' COMMENT '版本',
  `deleted` int(1) DEFAULT '0' COMMENT '邏輯刪除標(biāo)識(0未刪除,1已刪除)',
  PRIMARY KEY (`id`),
  KEY `manager_fk` (`manager_id`),
  CONSTRAINT `manager_fk` FOREIGN KEY (`manager_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
實(shí)體類:

@Data
@Accessors(chain = true)
@TableName("user")
public class User extends Model<User> implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 主鍵ID
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;

    /**
     * 姓名
     */
    @TableField("name")
    private String name;

    /**
     * 年齡
     */
    @TableField("age")
    private Integer age;

    /**
     * 郵箱
     */
    @TableField("email")
    private String email;

    @TableField("manager_id")
    private Long  manageId;

    /**
     * 出生時間
     */
    @TableField("create_time")
    private LocalDateTime createTime;
    @TableField("update_time")
    private LocalDateTime updateTime;

    /**
     * 是否置頂
     */
    @TableField("version")
    private Integer version;

    /**
     * 字段排除
     */
    @TableLogic
    @TableField("deleted")
    private Integer deleted;
}
xml配置:
server:
  port: 8088
spring:
  # 配置數(shù)據(jù)源信息
  datasource:
    # 配置連接數(shù)據(jù)庫信息
    #本地地址:“127.0.0.1”
    #數(shù)據(jù)庫名稱:“db2”
    url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    #數(shù)據(jù)庫賬戶
    username: root
    #數(shù)據(jù)庫密碼
    password: root
mybatis-plus:
  global-config:
    db-config:
    #邏輯刪除字段
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

1. 邏輯刪除

邏輯刪除語句:
 int i = userMapper.deleteById(2);
        System.out.println(i);
真實(shí)執(zhí)行語句:
==>  Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0
==> Parameters: 2(Integer)
<==    Updates: 1
實(shí)際未刪除,只修改刪除字段的值
這時候如果執(zhí)行查詢語句,則只會展示邏輯刪除為0的字段記錄:
 List<User> list = userMapper.selectList(null);
        list.forEach(System.out::println);
雖然庫中有三條記錄但是有兩條刪除字段為1,則list中只展示一條
    @TableField(value = "deleted",select = false)
    private Integer deleted;
    select=false; 查詢語句將不出現(xiàn)deleted字段

2. 自動填充

自動填充 創(chuàng)建和 更新時間
  @TableField(value = "create_time",fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(value = "update_time",fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        System.out.println("==============insertFill");
        setFieldValByName("createTime", LocalDateTime.now(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
        System.out.println("==============updateFill");
    }
}

2.1 優(yōu)化1 自動填充 有的類沒有更新和創(chuàng)建時間字段


@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        boolean hasSetter = metaObject.hasSetter("createTime");
        if (hasSetter){
            System.out.println("==============insertFill");
            setFieldValByName("createTime", LocalDateTime.now(),metaObject);
        }

    }

    @Override
    public void updateFill(MetaObject metaObject) {
        boolean hasSetter = metaObject.hasSetter("updateTime");
        if (hasSetter){
            setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
            System.out.println("==============updateFill");
        }

    }
}

2.2 優(yōu)化2 自己設(shè)置時間時填充自己設(shè)置的,不設(shè)置時自動填充


@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        Object createTime = getFieldValByName("createTime", metaObject);
        if (ObjectUtils.isNull(createTime)){
            boolean hasSetter = metaObject.hasSetter("createTime");
            if (hasSetter){
                System.out.println("==============insertFill");
                setFieldValByName("createTime", LocalDateTime.now(),metaObject);
            }
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        Object updateTime = getFieldValByName("updateTime", metaObject);
        if (ObjectUtils.isNull(updateTime)){
            boolean hasSetter = metaObject.hasSetter("updateTime");
            if (hasSetter){
                setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
                System.out.println("==============updateFill");
            }
        }


    }
}

3. 樂觀鎖插件 注:wrapper不能服用

樂觀鎖和悲觀鎖是在并發(fā)編程中用來處理資源競爭和保證數(shù)據(jù)一致性的兩種不同策略。它們各自適用于不同的使用場景:
樂觀鎖:
樂觀鎖的核心思想是假設(shè)并發(fā)訪問的操作不會發(fā)生沖突,因此在讀取資源時不會進(jìn)行加鎖,而是在更新資源時進(jìn)行沖突檢測。如果發(fā)現(xiàn)有其他線程已經(jīng)對資源進(jìn)行修改,則放棄當(dāng)前操作或嘗試重新執(zhí)行。
使用場景:
并發(fā)寫入操作較少的情況下,沖突發(fā)生的概率較低。
數(shù)據(jù)庫表中的數(shù)據(jù)很少被修改,在持續(xù)時間較短的事務(wù)中進(jìn)行讀取操作。
適合處理樂觀并發(fā)控制機(jī)制,如版本號或時間戳等。
悲觀鎖:
悲觀鎖的核心思想是假設(shè)并發(fā)訪問的操作會發(fā)生沖突,因此在訪問資源之前會進(jìn)行加鎖操作,確保在整個操作期間資源不被其他線程修改。
使用場景:
并發(fā)寫入操作較多的情況下,沖突發(fā)生的概率較高。
數(shù)據(jù)庫表中的數(shù)據(jù)經(jīng)常被修改,在持續(xù)時間較長的事務(wù)中進(jìn)行讀取操作。
適合使用數(shù)據(jù)庫的行級鎖、表級鎖或者分布式鎖等來實(shí)現(xiàn)。
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //添加:分頁插件
        //參數(shù):new PaginationInnerInterceptor(DbType.MYSQL),是專門為mysql定制實(shí)現(xiàn)的內(nèi)部的分頁插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        //添加:樂觀鎖插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}
實(shí)體類字段:
    @TableField("version")
    @Version
    private Integer version;
    測試:
        int version=2;
        User user = new User();
        user.setId(1683667832465985538L);
        user.setEmail("lwx@qq.com");
        user.setName("lwx");
        user.setVersion(version);
        int update = userMapper.updateById(user);
        System.out.println(update);

4. 性能分析插件

4.1 PerformanceInterceptor 3.2.0版本被廢除

 @Bean
    @Profile({"dev","test"}) // 指定環(huán)境
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor interceptor = new PerformanceInterceptor();
        // sql美化打印
        interceptor.setFormat(true);
        // 設(shè)置SQL超時時間
        interceptor.setMaxTime(500);
        //格式化語句
        performanceInterceptor.setFormat(true);
        return interceptor;
    }

4.2 p6spy 使用

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.8.7</version>
</dependency>

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定義日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志輸出到控制臺
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系統(tǒng)記錄 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 設(shè)置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前綴
useprefix=true
# 配置記錄 Log 例外,可去掉的結(jié)果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 實(shí)際驅(qū)動可多個
#driverlist=org.h2.Driver
# 是否開啟慢SQL記錄
outagedetection=true
# 慢SQL記錄標(biāo)準(zhǔn) 2 秒
outagedetectioninterval=2
server:
  port: 8088
spring:
  # 配置數(shù)據(jù)源信息
  datasource:
    # 配置連接數(shù)據(jù)庫信息
    #本地地址:“127.0.0.1”
    #數(shù)據(jù)庫名稱:“db2”
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://localhost:3306/db2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    #數(shù)據(jù)庫賬戶
    username: root
    #數(shù)據(jù)庫密碼
    password: root
mybatis-plus:
  global-config:
    db-config:
      #邏輯刪除字段
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

【MyBatis-Plus 進(jìn)階學(xué)習(xí)筆記】,mybatis,學(xué)習(xí),筆記文章來源地址http://www.zghlxwxcb.cn/news/detail-617114.html

5. 多租戶SQL解析器

6. 動態(tài)表名SQL解析器

7. SQL注入器

到了這里,關(guān)于【MyBatis-Plus 進(jìn)階學(xué)習(xí)筆記】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MyBatis-Plus 超詳細(xì)筆記|配置使用|多種查詢|常用注解

    Mybatis-Plus可以節(jié)省大量時間,所有的CRUD代碼都可以自動化完成。 MyBatis-Plus是一個MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。其在 MyBatis 的基礎(chǔ)上提供了很多方便的 CRUD 操作、分頁查詢、邏輯刪除、自動填充等功能。 在Maven項(xiàng)目中,

    2024年02月05日
    瀏覽(18)
  • Mybatis-Plus學(xué)習(xí)2 IService+ServiceImpl

    service層寫法,繼承ISerice,泛型為實(shí)體類對象 impl層寫法,繼承ServiceImpl,實(shí)現(xiàn)service,泛型為Mapper對象+實(shí)體類對象 Mybatis-Plus默認(rèn)使用的主鍵算法是雪花算法,通過TableId的type屬性可以更改算法策略 如果主動設(shè)置了主鍵,則使用自己設(shè)置的主鍵 @TableLogic表示邏輯刪除字段,刪除

    2024年02月12日
    瀏覽(15)
  • 【Mybatis-Plus】Mybatis-Plus快速入門

    Mybatis-Plus是基于Mybatis的數(shù)據(jù)庫操作組件,其實(shí)現(xiàn)的功能完全是Mybatis的功能拓展,不改變Mybatis的使用方式,可以兼容Mybatis的操作方式。 創(chuàng)建一個數(shù)據(jù)庫、一個表進(jìn)行基礎(chǔ)操作: 創(chuàng)建一個Spring項(xiàng)目,項(xiàng)目通過Spring Initlizer創(chuàng)建,不導(dǎo)入任何依賴包,在POM.xml文件中進(jìn)行依賴導(dǎo)入

    2024年02月07日
    瀏覽(28)
  • Mybatis-Plus(三)--Mybatis-Plus配置和條件構(gòu)造器

    在MP中有大量的配置,其中有一部分是Mybatis原生的配置,另一部分是MP的配置,詳情:https://mybatis.plus/config 【1】configLocation--自己單獨(dú)的MyBatis配置的路徑 SpringMVC的xml中寫法: 【2】mapperLocations--MyBatis Mapper所對應(yīng)的XML文件位置 如果你在Mapper中有自定義方法(XML中有自定義實(shí)現(xiàn)

    2024年02月15日
    瀏覽(27)
  • Mybatis-Plus通用枚舉功能 [MyBatis-Plus系列] - 第493篇

    Mybatis-Plus通用枚舉功能 [MyBatis-Plus系列] - 第493篇

    歷史文章( 文章 累計490+) 《國內(nèi)最全的Spring?Boot系列之一》 《國內(nèi)最全的Spring?Boot系列之二》 《

    2024年02月08日
    瀏覽(21)
  • mybatis升級到mybatis-plus

    mybatis升級到mybatis-plus,兩個共存 之前依賴只有mybatis,沒有plus 做法: 修改之后的依賴 更換 完整配置代碼 1.添加plus的插件 注入 3.完整代碼 就是上面升級plus 的代碼. 參考文章:https://www.likecs.com/show-308411339.html

    2024年02月11日
    瀏覽(21)
  • Mybatis 框架 ( 三 ) Mybatis-Plus

    Mybatis 框架 ( 三 ) Mybatis-Plus

    官網(wǎng) : https://www.baomidou.com/ MyBatis-Plus 是一個 MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上封裝了大量常規(guī)操作,減少了SQL的編寫量。 使用時通常通過Springboot框架整合使用 并且使用Lombok框架簡化實(shí)體類 重點(diǎn)注意 : 與 SpringBoot整合時, 在啟動類增加注解 @MapperScan(\\\"mapper接口路徑 \\\") 或者

    2024年02月01日
    瀏覽(21)
  • 若依m(xù)ybatis升級為mybatis-plus

    若依m(xù)ybatis升級為mybatis-plus

    一、添加mybatis-plus依賴、刪除mybatis依賴,我用的是ruoyi 3.8.5,主pom里面已經(jīng)沒有了mybatis的依賴,如果有的話注釋一下 這里添加mybatisplus依賴 注意:一定要做mybatis依賴的移除,否則pagehelper還是依賴mybatis會與plus沖突,報錯。 ruoyi-common下的pom.xml添加依賴 解釋一下為什么要在這里

    2024年02月12日
    瀏覽(22)
  • mybatis-plus-join mybatis-plus必備神器

    mybatis-plus-join是mybatis plus的一個多表插件,上手簡單,十分鐘不到就能學(xué)會全部使用方式,只要會用mp就會用這個插件,僅僅依賴了lombok,而且是擴(kuò)展mp的構(gòu)造器并非更改原本的構(gòu)造器,不會對原有項(xiàng)目產(chǎn)生一點(diǎn)點(diǎn)影響,相信大多數(shù)項(xiàng)目都有這倆插件,四舍五入就是沒依賴。

    2023年04月08日
    瀏覽(20)
  • mybatis-plus分頁total為0,分頁失效,mybatis-plus多租戶插件使用

    背景:項(xiàng)目使用mybatis分頁插件不生效,以及多租戶使用時讀取配置異常 多租戶插件使用遇到的問題: 最開始在MyTenantLineHandler中使用 @Value(\\\"${tables}\\\"),服務(wù)啟動時能從配置中心拉取到配置,但在運(yùn)行時獲取到的值為空,試了很多方法都不生效,后面將配置中心的配置在調(diào)用My

    2024年02月06日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包