天天看點

學習了MyBatis-Plus你還會用MyBatis嘛

MyBatis Plus概述

        簡介

官網:​​http://mp.baomidou.com/​​

參考教程:​​http://mp.baomidou.com/guide/​​

​​MyBatis-Plus​​​(簡稱 MP)是一個 ​​MyBatis​​ 的增強工具,在 MyBatis 的基礎上隻做增強不做改變,為簡化開發、提高效率而生。

        特點

  • 無侵入:隻做增強不做改變,引入它不會對現有工程産生影響,如絲般順滑
  • 損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向對象操作
  • 強大的 CRUD 操作:内置通用 Mapper、通用 Service,僅僅通過少量配置即可實作單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求
  • 支援 Lambda 形式調用:通過 Lambda 表達式,友善的編寫各類查詢條件,無需再擔心字段寫錯
  • 支援多種資料庫:支援 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種資料庫
  • 支援主鍵自動生成:支援多達 4 種主鍵政策(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
  • 支援 XML 熱加載:Mapper 對應的 XML 支援熱加載,對于簡單的 CRUD 操作,甚至可以無 XML 啟動
  • 支援 ActiveRecord 模式:支援 ActiveRecord 形式調用,實體類隻需繼承 Model 類即可進行強大的 CRUD 操作
  • 支援自定義全局通用操作:支援全局通用方法注入( Write once, use anywhere )
  • 支援關鍵詞自動轉義:支援資料庫關鍵詞(order、key......)自動轉義,還可自定義關鍵詞
  • 内置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支援模闆引擎,更有超多自定義配置等您來使用
  • 内置分頁插件:基于 MyBatis 實體分頁,開發者無需關心具體操作,配置好插件之後,寫分頁等同于普通 List 查詢
  • 内置性能分析插件:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能快速揪出慢查詢
  • 内置全局攔截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規則,預防誤操作
  • 内置 Sql 注入剝離器:支援 Sql 注入剝離,有效預防 Sql 注入攻擊

入門案例

        搭建環境

  • 步驟一:建立項目:test-mybatis-plus
  • 步驟二:修改pom.xml,添加依賴
  • 步驟三:建立yml檔案,配置資料庫相關
  • 步驟一:建立項目:test-mybatis-plus
  • 步驟二:修改pom.xml,添加依賴
<!--确定spring boot的版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
    </parent>      
<dependencies>
        <!-- web 開發 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--MySQL資料庫驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--支援lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--測試-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
    </dependencies>      

步驟三:建立yml檔案,配置資料庫相關

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud_db1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 1234
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #輸出日志      

        資料庫和表

CREATE TABLE `tmp_customer` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(50) DEFAULT NULL,
  `password` varchar(32) DEFAULT NULL,
  `telephone` varchar(11) DEFAULT NULL,
  `money` double DEFAULT NULL,
  `version` int(11) DEFAULT NULL,
  `create_time` date DEFAULT NULL,
  `update_time` date DEFAULT NULL,
  PRIMARY KEY (`cid`)
);

insert  into `tmp_customer`(`cid`,`cname`,`password`,`telephone`,`money`,`version`,`create_time`,`update_time`) 
values (1,'jack','1234','110',1000,NULL,NULL,NULL),(2,'rose','1234','112',1000,NULL,NULL,NULL),(3,'tom','1234','119',1000,NULL,NULL,NULL);      

        入門:查詢所有

  • 步驟1:配置JavaBean
  • 步驟2:編寫dao
  • 步驟3:編寫啟動類
  • 步驟4:編寫測試類
  • 步驟1:配置JavaBean
  • ​@TableName​

    ​ 表名注解,value屬性設定表名
package com.czxy.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.util.List;

@Data
@TableName("tmp_customer")
public class Customer {
    @TableId(type = IdType.AUTO)
    private Integer cid;
    private String cname;
    private String password;
    private String telephone;
    private String money;

    private Integer version;

    @TableField(exist = false)
    private List<Integer> ids;
}      
  • 步驟2:編寫dao
package com.czxy.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.czxy.mp.domain.Customer;
import org.apache.ibatis.annotations.Mapper;

/**
 * Created by liangtong.
 */
@Mapper
public interface CustomerMapper extends BaseMapper<Customer> {
}      
  • 步驟3:編寫啟動類
package com.czxy.mp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created by liangtong.
 */
@SpringBootApplication
public class MybatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}      
  • 步驟4:編寫測試類
package com.czxy;

import com.czxy.mp.MybatisPlusApplication;
import com.czxy.mp.domain.Customer;
import com.czxy.mp.mapper.CustomerMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

/**
 * Created by liangtong.
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MybatisPlusApplication.class)
public class TestDemo01 {
    @Resource
    private CustomerMapper customerMapper;

    @Test
    public void testFindAll() {
        List<Customer> list = customerMapper.selectList(null);
        list.forEach(System.out::println);
    }
}      

基本操作

        常見API

BaseMapper 封裝CRUD操作,泛型 ​

​T​

​ 為任意實體對象

  • 增删改
方法名 描述
int insert(T entity) 插入一條記錄,entity 為 實體對象
int delete(Wrapper<T> wrapper) 根據 entity 條件,删除記錄,wrapper 可以為 null
int deleteBatchIds(Collection idList) 根據ID 批量删除
int deleteById(Serializable id) 根據 ID 删除
int deleteByMap(Map<String, Object> map) 根據 columnMap 條件,删除記錄
int update(T entity, Wrapper<T> updateWrapper) 根據 whereEntity 條件,更新記錄
int updateById(T entity); 根據 ID 修改
  • 查詢
方法名 描述
T selectById(Serializable id) 根據 ID 查詢
T selectOne(Wrapper<T> queryWrapper) 根據 entity 條件,查詢一條記錄
List<T> selectBatchIds(Collection idList) 根據ID 批量查詢
List<T> selectList(Wrapper<T> queryWrapper) 根據 entity 條件,查詢全部記錄
List<T> selectByMap(Map<String, Object> columnMap) 根據 columnMap 條件
List<Map<String, Object>> selectMaps(Wrapper<T> queryWrapper) 根據 Wrapper 條件,查詢全部記錄
List<Object> selectObjs( Wrapper<T> queryWrapper) 根據 Wrapper 條件,查詢全部記錄。注意: 隻傳回第一個字段的值
IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper) 根據 entity 條件,查詢全部記錄(并翻頁)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, Wrapper<T> queryWrapper) 根據 Wrapper 條件,查詢全部記錄(并翻頁)
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) 根據 Wrapper 條件,查詢總記錄數

        添加

@Test
    public void testInsert() {
        Customer customer = new Customer();
        customer.setCname("測試");

        customerMapper.insert(customer);
    }      

獲得自動增長列資訊

學習了MyBatis-Plus你還會用MyBatis嘛
@Test
    public void testInsert() {
        Customer customer = new Customer();
        customer.setCname("測試");
        customerMapper.insert(customer);
        System.out.println(customer);
    }      

        更新

  • 通過id更新
@Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(15);
        customer.setCname("測試777");
        customer.setPassword("777");

        // 需要給Customer設定@TableId
        customerMapper.updateById(customer);
    }      
  • 更新所有
@Test
    public void testUpdate2() {
        Customer customer = new Customer();
        customer.setCname("測試777");
        customer.setPassword("777");
        // 更新所有
        customerMapper.update(customer,null);
    }      

        删除

  • 根據id進行删除
@Test
    public void testDelete() {
        // 需要給Customer設定@TableId
        int i = customerMapper.deleteById(11);
        System.out.println(i);
    }      
  • 批量删除
@Test
    public void testBatchDelete() {
        // 需要給Customer設定@TableId
        int i = customerMapper.deleteBatchIds(Arrays.asList(9,10));
        System.out.println(i);
    }      

查詢

        Map條件

@Test
    public void testMap(){
        Map map = new HashMap();
        map.put("cname","測試");
        map.put("password","123456");

        List list = customerMapper.selectByMap(map);
        list.forEach(System.out::println);
    }      

        QueryWrapper

                wrapper介紹

學習了MyBatis-Plus你還會用MyBatis嘛
  • Wrapper : 條件構造抽象類,最頂端父類
  • AbstractWrapper : 用于查詢條件封裝,生成 sql 的 where 條件
  • QueryWrapper : Entity 對象封裝操作類,不是用lambda文法
  • UpdateWrapper : Update 條件封裝,用于Entity對象更新操作
  • AbstractLambdaWrapper : Lambda 文法使用 Wrapper統一處了解析 lambda 擷取 column。
  • LambdaQueryWrapper :看名稱也能明白就是用于Lambda文法使用的查詢Wrapper
  • LambdaUpdateWrapper : Lambda 更新封裝Wrapper
  • 如果想進行複雜條件查詢,那麼需要使用條件構造器 Wapper,涉及到如下方法
方法名 描述
selectOne
selectCount
selectList
selectMaps
selectObjs
update
delete
  • 拼湊條件相關關鍵字
查詢方式 說明
setSqlSelect 設定 SELECT 查詢字段
where WHERE 語句,拼接 + WHERE 條件
and AND 語句,拼接 + AND 字段=值
andNew AND 語句,拼接 + AND (字段=值)
or OR 語句,拼接 + OR 字段=值
orNew OR 語句,拼接 + OR (字段=值)
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查詢 LIKE
notLike 模糊查詢 NOT LIKE
in IN 查詢
notIn NOT IN 查詢
isNull NULL 值查詢
isNotNull IS NOT NULL
groupBy 分組 GROUP BY
having HAVING 關鍵詞
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 條件語句
notExists NOT EXISTS 條件語句
between BETWEEN 條件語句
notBetween NOT BETWEEN 條件語句
addFilter 自由拼接 SQL
last 拼接在最後,例如:last(“LIMIT 1”)

                條件查詢

  • 基本多條件查詢
@Test
    public void testWrapper(){
        // 拼湊條件
        QueryWrapper<Customer> queryWrapper = new QueryWrapper();
        // 1)模糊查詢
        queryWrapper.like("cname","測試");
        // 2)等值查詢
        queryWrapper.eq("password","777");
        // 3)批量查詢
        queryWrapper.in("cid",1,2,3,4);

        // 查詢
        List<Customer> list = customerMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
    }      
  • 條件判斷
@Test
    public void findCondition2() {
        Customer customer = new Customer();
        customer.setPassword("777");
        customer.setCname("888");
        customer.setIdList(Arrays.asList(2,3,4));
        customer.setCid(3);
        //條件查詢
        QueryWrapper<Customer> queryWrapper = new QueryWrapper<>();
        // 1) 等值查詢
        queryWrapper.eq( customer.getPassword()!=null ,"password", customer.getPassword());
        // 2) 模糊查詢
        queryWrapper.like(customer.getCname() != null , "cname",customer.getCname());
        // 3) in語句
        queryWrapper.in(customer.getIdList() != null , "cid",customer.getIdList());
        // 4) 大于等于
        queryWrapper.ge(customer.getCid() != null , "cid" , customer.getCid());


        //查詢
        List<Customer> list = customerMapper.selectList(queryWrapper);
        //list.forEach(customer-> System.out.println(customer));
        list.forEach(System.out::println);

    }      

              條件更新

  • 基本更新
@Test
    public void testWrapperUpdate(){
        // 資料
        Customer customer = new Customer();
        customer.setCname("測試888");

        // 拼湊條件
        QueryWrapper<Customer> queryWrapper = new QueryWrapper();
        queryWrapper.in("cid",1,2,3,4);


        // 更新
        int result = customerMapper.update(customer, queryWrapper);
        System.out.println(result);
    }      

        分頁

                内置插件

  • 主體插件: MybatisPlusInterceptor,該插件内部插件集:
  • 分頁插件: PaginationInnerInterceptor
  • 多租戶插件: TenantLineInnerInterceptor
  • 動态表名插件: DynamicTableNameInnerInterceptor
  • 樂觀鎖插件: OptimisticLockerInnerInterceptor
  • sql性能規範插件: IllegalSQLInnerInterceptor
  • 防止全表更新與删除插件: BlockAttackInnerInterceptor

                配置類

學習了MyBatis-Plus你還會用MyBatis嘛
package com.czxy.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class MybatisPlusConfig {

    /**
     * 配置插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 分頁插件
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return mybatisPlusInterceptor;
    }

    /**
     * 新的分頁插件,一緩和二緩遵循mybatis的規則,需要設定 MybatisConfiguration#useDeprecatedExecutor = false 避免緩存出現問題(該屬性會在舊插件移除後一同移除)
     * @return
     */
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }
}      

                分頁

@Test
    public void testPage(){
        // 分頁資料
        int pageNum = 1;
        int pageSize = 3;
        Page<Customer> page = new Page<>(pageNum , pageSize);
        page.setSearchCount(true);

        // 查詢
        customerMapper.selectPage(page, null);

        // 分頁資料
        System.err.println("目前頁碼:" + page.getCurrent());
        System.err.println("每頁顯示記錄數:" + page.getSize());
        System.err.println("總頁數:" + page.getPages());
        System.err.println("總記錄數:" + page.getTotal());
        System.err.println("是否有下一頁:" + page.hasNext());
        System.err.println("是否有上一頁:" + page.hasPrevious());
        // 分頁資料清單
        page.getRecords().forEach(System.err::println);
    }      

常見注解

        表名注解:@TableName

屬性 描述
value 表名
keepGlobalPrefix 是否保持使用全局的 tablePrefix 的值(如果設定了全局 tablePrefix 且自行設定了 value 的值)

        主鍵注解:@TableId

屬性 描述
value 主鍵字段名
type 主鍵類型 IdType.ASSIGN_UUID ,配置設定UUID IdType.ASSIGN_ID ,配置設定ID(預設使用雪花算法)

        字段注解(非主鍵):@TableField

屬性 描述
value 資料庫字段名
fill 字段自動填充政策 FieldFill.INSERT 插入時填充字段 FieldFill.UPDATE 更新時填充字段 FieldFill.INSERT_UPDATE 插入和更新時填充字段

常見配置

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #輸出日志
    map-underscore-to-camel-case: true  #駝峰命名
  global-config:
    db-config:
      id-type: auto  #全局配置,id自動增強
      table-prefix: tmp_ #表名字首
  type-aliases-package: com.czxy.mp.domain #别名包掃描路徑
  mapper-locations: classpath*:/mapper/**/*.xml #映射檔案位置      

進階

        自動填充

項目中經常會遇到一些資料,每次都使用相同的方式填充,例如記錄的建立時間,更新時間等。

我們可以使用MyBatis Plus的自動填充功能,完成這些字段的指派工作:

                原理

  • 實作元對象處理器接口:​

    ​com.baomidou.mybatisplus.core.handlers.MetaObjectHandler​

    ​,确定填充具體操作
  • 注解填充字段:​

    ​@TableField(fill = ...)​

    ​ 确定字段填充的時機
  • FieldFill.INSERT:插入填充字段
  • FieldFill.UPDATE:更新填充字段
  • FieldFill.INSERT_UPDATE:插入和更新填充字段

                基本操作

  • 步驟一:修改表添加字段
alter table tmp_customer add column create_time date;
alter table tmp_customer add column update_time date;      
  • 步驟二:修改JavaBean
package com.czxy.mp.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

/**
 * Created by liangtong.
 */
@Data
@TableName("tmp_customer")
public class Customer {
    @TableId(type = IdType.AUTO)
    private Integer cid;
    private String cname;
    private String password;
    private String telephone;
    private String money;

    @TableField(value="create_time",fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(value="update_time",fill = FieldFill.UPDATE)
    private Date updateTime;

}      

步驟三:編寫處理類

學習了MyBatis-Plus你還會用MyBatis嘛
package com.czxy.mp.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;


@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
    }

    /**
     * 更新填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}      
  • 步驟四:測試
@Test
    public void testInsert() {
        Customer customer = new Customer();
        customer.setCname("測試888");

        customerMapper.insert(customer);
    }

    @Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(11);
        customer.setTelephone("999");

        customerMapper.updateById(customer);
    }      

        樂觀鎖

                什麼是樂觀鎖

  • 當要更新一條記錄的時候,希望這條記錄沒有被别人更新
  • 樂觀鎖實作方式:
  • 取出記錄時,擷取目前version
  • 更新時,帶上這個version
  • 執行更新時, set version = newVersion where version = oldVersion
  • 如果version不對,就更新失敗

                實作

步驟一:修改表結構,添加version字段

學習了MyBatis-Plus你還會用MyBatis嘛

步驟二:修改JavaBean,添加version屬性

學習了MyBatis-Plus你還會用MyBatis嘛
package com.czxy.mp.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

/**
 * Created by liangtong.
 */
@Data
@TableName("tmp_customer")
public class Customer {
    @TableId(type = IdType.AUTO)
    private Integer cid;
    private String cname;
    private String password;
    private String telephone;
    private String money;
    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;
}      
  • 步驟三:元對象處理器接口添加version的insert預設值 (保證version有資料)
學習了MyBatis-Plus你還會用MyBatis嘛
package com.czxy.mp.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created by liangtong.
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("version", 1, metaObject);
    }

    /**
     * 更新填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}      
  • 步驟四:修改 MybatisPlusConfig 開啟樂觀鎖
package com.czxy.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by liangtong.
 */
@Configuration
public class MybatisPlusConfig {
     */
    /**
     * 配置插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 分頁插件
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 樂觀鎖
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        return mybatisPlusInterceptor;
    }
}      
  • 步驟五:測試
  • 先添加一條,保證version有資料
  • 在更新該條
@Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(14);
        customer.setCname("測試999");
        // 與資料庫中資料一緻,将更新成功,否則傳回失敗。
        customer.setVersion(1);

        int i = customerMapper.updateById(customer);
        System.out.println(i);
    }      

                注意事項

  • 支援的資料類型隻有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整數類型下​

    ​newVersion = oldVersion + 1​

  • ​newVersion​

    ​​ 會回寫到 ​

    ​entity​

    ​ 中
  • 僅支援​

    ​updateById(id)​

    ​ 與 ​

    ​update(entity, wrapper)​

    ​ 方法
  • 在 ​

    ​update(entity, wrapper)​

    ​ 方法下, ​

    ​wrapper​

    ​ 不能複用!!!

        邏輯删除

                什麼是邏輯删除

  • 邏輯删除,也稱為删除。就是在表中提供一個字段用于記錄是否删除,實際該資料沒有被删除。

                實作

步驟一:修改表結構添加deleted字段

學習了MyBatis-Plus你還會用MyBatis嘛

步驟二:修改JavaBean,給deleted字段添加​

​@TableLogic​

學習了MyBatis-Plus你還會用MyBatis嘛
package com.czxy.mp.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

/**
 * Created by liangtong.
 */
@Data
@TableName("tmp_customer")
public class Customer {
    @TableId(type = IdType.AUTO)
    private Integer cid;
    private String cname;
    private String password;
    private String telephone;
    private String money;
    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;

    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;
}      

 步驟三:添加資料時,設定預設“邏輯未删除值”

學習了MyBatis-Plus你還會用MyBatis嘛
package com.czxy.mp.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created by liangtong.
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("version", 1, metaObject);
        this.setFieldValByName("deleted", 0, metaObject);
    }

    /**
     * 更新填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}      

 步驟四:測試

@Test
    public void testDelete() {
        // 删除時,必須保證deleted資料為“邏輯未删除值”
        int i = customerMapper.deleteById(12);
        System.out.println(i);
    }      

                全局配置

  • 如果使用了全局配置,可以不使用注解​

    ​@TableLogic​

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted  # 局邏輯删除的實體字段名
      logic-delete-value: 1  # 邏輯已删除值(預設為 1)
      logic-not-delete-value: 0 # 邏輯未删除值(預設為 0)      

通用Service

  • service接口
package com.czxy.service;
  
  import com.baomidou.mybatisplus.extension.service.IService;
  import com.czxy.domain.Customer;
  

  public interface CustomerService extends IService<Customer> {
  }      
package com.czxy.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.domain.Customer;
import com.czxy.mapper.CustomerMapper;
import com.czxy.service.CustomerService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
@Transactional
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper,Customer> implements CustomerService {

}