1. Mybatis-plus
1. 依賴
com.baomidoumybatis-plus-spring-boot3-starter3.5.9
2. 註解配置表名、字段名
一般情況下,數據庫映射為實體類對應關係
- 數據庫表與實體類類名:下劃線轉為駝峯
- 實體類中的id字段對應數據庫中的主鍵字段id
- 表中列名與實體類屬性名:下劃線轉駝峯
如不滿足以上條件,需在實體類中使用註解
- 表名註解:
@TableName:用來指定表名 - 指定主鍵:
@TableId指定表中的主鍵 - 實體類屬性註解:
@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:常見場景
- 實體類屬性與數據庫表中字段不一致,
// 屬性是name,表中是username
@TableField("username")
private String name;
- 表中以is開頭並且是boolean值
// 表中字段名:is_ban,映射的屬性名為ban
@TableField(“is_ban”)
private Boolean name; - 屬性名與數據庫的關鍵字一致
// order在數據庫中是關鍵字,注意使用了 ``
@TableField(“order”)
private String order; - 屬性並不屬於數據庫表中的字段
// 數據表中不存在該屬性對應的列
@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的用法
- 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 {
} - service:繼承
IService接口
import com.baomidou.mybatisplus.extension.service.IService;
import org.example.learn.bean.User; // 實體類
public interface UserService extends IService {
} - 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
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操作,查詢時總是會把標誌位作為條件帶入
- 使用remove方法刪除時,mybatis-plus使用了updata方法更新了邏輯刪除的列
addressService.removeById(59L);
/*
* ==> Preparing: UPDATE address SET deleted=1 WHERE id=? AND deleted=0
* ==> Parameters: 59(Long)
* <== Updates: 0
* */
- 查詢時也會自動添加邏輯刪除標誌位為未刪除的條件
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,在查詢、新增、更新等操作時,此數據轉為對象形式
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. 在查詢後返回的結果就是對象形式
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
本文章為轉載內容,我們尊重原作者對文章享有的著作權。如有內容錯誤或侵權問題,歡迎原作者聯繫我們進行內容更正或刪除文章。