1. Mybatis-plus

1. 依賴

com.baomidoumybatis-plus-spring-boot3-starter3.5.9

2. 註解配置表名、字段名

一般情況下,數據庫映射為實體類對應關係

  1. 數據庫表與實體類類名:下劃線轉為駝峯
  2. 實體類中的id字段對應數據庫中的主鍵字段id
  3. 表中列名與實體類屬性名:下劃線轉駝峯

如不滿足以上條件,需在實體類中使用註解

  1. 表名註解:@TableName:用來指定表名
  2. 指定主鍵:@TableId 指定表中的主鍵
  3. 實體類屬性註解:@TableField 指定表中的字段信息
    // 指定該實體類對應的表名是t_vip
    @TableName(“t_vip”)
    public class Vip {
    // 指定該屬性為主鍵,且在數據表中的列名為id,且自增
    @TableId(value = “id”, type = IdType.AUTO)
    private Long vid;
    // 指定該屬性對應表中的username列
    @TableField(value = “username”)
    private String name;
    // 數據表中不存在該屬性對應的列
    @TableField(exist = false)
    private String birthday;
    }

@TableId:常見類型

  • 主鍵最好指定類型,默認是type = IdType.ASSIGN_ID
@TableId(type = IdType.AUTO)  // 主鍵自增,數據庫自動生成
@TableId(type = IdType.INPUT) // 通過set方法自行輸入,例如uuid作為主鍵,需要手動賦值
@TableId( type = IdType.ASSIGN_ID)  // 通過接口生成主鍵,由mybatis-plus自動生成

@TableField:常見場景

  1. 實體類屬性與數據庫表中字段不一致,
// 屬性是name,表中是username
@TableField("username")
private String name;
  1. 表中以is開頭並且是boolean值
    // 表中字段名:is_ban,映射的屬性名為ban
    @TableField(“is_ban”)
    private Boolean name;
  2. 屬性名與數據庫的關鍵字一致
    // order在數據庫中是關鍵字,注意使用了 ``
    @TableField(“order”)
    private String order;
  3. 屬性並不屬於數據庫表中的字段
// 數據表中不存在該屬性對應的列
@TableField(exist = false)
private String birthday;

3. yml中的配置

官方:鏈接

  • 很多默認配置已經足夠了
    mybatis-plus:
    type-aliases-package: org.example.learn.domain # 實體類包
    global-config:
    db-config:
    id-type: auto # id生成策略:自增長
    logic-delete-field: deleted # 表中的邏輯刪除字段名
    logic-delete-value: 1 # 邏輯已刪除值(默認為 1)
    logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)
    banner: false # 是否在控制枱打印 MyBatis-Plus 的 LOGO
    configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler # 枚舉類型處理器

4. mapper和service的用法

  1. mapper:繼承BaseMapper接口
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import org.apache.ibatis.annotations.Mapper;
    import org.example.learn.bean.User; // 實體類
    @Mapper
    public interface UserMapper extends BaseMapper {
    }
  2. service:繼承IService接口
    import com.baomidou.mybatisplus.extension.service.IService;
    import org.example.learn.bean.User; // 實體類
    public interface UserService extends IService {
    }
  3. service的實現類seviceImpl:繼承ServiceImpl

ServiceImpl:兩個泛型

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.learn.bean.User;
import org.example.learn.dao.UserMapper;
import org.example.learn.service.UserService;
@Service
public class UserServiceImpl extends ServiceImpl implements UserService {
},user>

2. 使用工具生成mapper和service

springboot:mybatis-plus知識點詳知_主鍵

springboot:mybatis-plus知識點詳知_主鍵_02

3. 邏輯刪除

  • 在實際應用中很多數據是不能刪除的,比如:訂單信息,mybatis-plus提供了邏輯刪除
  • 邏輯刪除:使用數據表中的某一個列,通過列的值表示該數據是否被刪除

1. 需要在yml中配置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 表中的邏輯刪除字段名
      logic-delete-value: 1 # 邏輯已刪除值(默認為 1)
      logic-not-delete-value: 0 # 邏輯未刪除值(默認為 0)

2. 代碼

代碼還是使用正常的刪除和查詢操作,mybaits-plus在刪除時實際使用的是updata操作,查詢時總是會把標誌位作為條件帶入

  1. 使用remove方法刪除時,mybatis-plus使用了updata方法更新了邏輯刪除的列
addressService.removeById(59L);
/*
* ==>  Preparing: UPDATE address SET deleted=1 WHERE id=? AND deleted=0
*  ==> Parameters: 59(Long)
*  <==    Updates: 0
* */
  1. 查詢時也會自動添加邏輯刪除標誌位為未刪除的條件
Address address = addressService.getById(59L);
/*
* ==>  Preparing: SELECT id,user_id,province,city,town,mobile,street,contact,is_default,notes,deleted FROM address WHERE id=? AND deleted=0
* ==> Parameters: 59(Long)
* <==      Total: 0
* */

4. json類型映射對象

在數據表中類型格式為json,在查詢、新增、更新等操作時,此數據轉為對象形式

springboot:mybatis-plus知識點詳知_spring_03

1. 定義json類型字段內容對應的類

{"age": 20, "intro": "佛系青年", "gender": "male"}
@Data
public class UserInfo {
  private Integer age;
  private String intro;
  private String gender;
}

2. 在數據表對應的類屬性和類上加註解

  • 類上註解:@TableName(autoResultMap = true)
  • 屬性註解:@TableField(typeHandler = JacksonTypeHandler.class)@Data
    //@Accessors(chain = true)
    @TableName(autoResultMap = true)
    public class User implements Serializable {
    /**
    * 詳細信息
    */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserInfo info;
    }

3. 在查詢後返回的結果就是對象形式

springboot:mybatis-plus知識點詳知_實體類_04

5. 自動映射枚舉

經常使用數字或布爾值代表一種狀態,每次查詢或新增時都需要對照狀態表來解釋狀態碼。
例如:

//  private Boolean gender; // 男/女
    private Integer status;	// 使用狀態(1正常 2凍結)

1. 配置yml

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

2. 創建枚舉類映射

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "凍結");
    @EnumValue // 在數據庫存/取的值是code的屬性值
    private final Integer code;
    @JsonValue  // 在序列化時返回的JSON中顯示的屬性值
    private final String desc;
    UserStatus(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

3. 修改數據表對應的實體類中該屬性的類型

/**
     * 使用狀態(1正常 2凍結)
     */
    private UserStatus status;

4. 使用

// 1. 查詢id是否存在
    User user = this.getById(id);
    if (user == null || user.getStatus() == UserStatus.FREEZE) {
      throw new RuntimeException("用户不存在或已經被禁用");
    }

6. 創建時間和修改時間自動填充

  • 在創建和修改是自動填寫時間
• // 實體類中的屬性,啓用自動填充
 /**
 * 創建時間
 */
 // FieldFill.INSERT:只有在insert操作時才會使用自定義的處理器
 @TableField(fill = FieldFill.INSERT)
 private LocalDateTime createTime;
/**
 * 更新時間
 */
 // FieldFill.INSERT_UPDATE :插入和更新操作都會使用自定義的處理器
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime
• 定義處理器
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
 import org.apache.ibatis.reflection.MetaObject;
 import org.springframework.stereotype.Component;
 import java.time.LocalDateTime;
 @Component
 public class MyMetaObjectHandler implements MetaObjectHandler {
 @Override
 // insert操作時會同時更新createTime 和 updateTime
 public void insertFill(MetaObject metaObject) {
 // 檢查create_time字段是否為null,如果是,設置為當前時間
 LocalDateTime createTime = (LocalDateTime) getFieldValByName(“createTime”, metaObject);
 if (createTime == null) {
 setFieldValByName(“createTime”, LocalDateTime.now(), metaObject);
 }
 LocalDateTime updateTime = (LocalDateTime) getFieldValByName(“updateTime”, metaObject);
 if ( updateTime == null) {
 setFieldValByName(“updateTime”, LocalDateTime.now(), metaObject);
 }
 }
@Override
 public void updateFill(MetaObject metaObject) {
 // 如果有更新時間字段,如update_time,可以在這裏處理填充邏輯
 LocalDateTime updateTime = (LocalDateTime) getFieldValByName(“updateTime”, metaObject);
 if (updateTime == null) {
 setFieldValByName(“updateTime”, LocalDateTime.now(), metaObject);
 }
 }
 }

pom中所有的依賴

org.springframework.bootspring-boot-startercom.mysqlmysql-connector-jruntimeorg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestcom.baomidoumybatis-plus-boot-starter3.5.3.1cn.hutoolhutool-all5.8.11com.github.xiaoyminknife4j-openapi2-spring-boot-starter4.1.0org.springframework.bootspring-boot-starter-web