Mybatis-Plus
依賴
-
依賴選擇
<!-- 最新版本 --> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version> </dependency>
配置
分頁
-
分頁攔截器配置
@Configuration @MapperScan("scan.your.mapper.package") public class MybatisPlusConfig {/*** 添加分頁插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多個插件,切記分頁最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多數據源可以不配具體類型 否則都建議配上具體的DbTypereturn interceptor;} }
連接
-
連接配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/redis_api?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useServerPrepStmts=trueusername: rootpassword: root # mybatis-plus 配置 mybatis-plus:global-config:db-config:table-underline: falseconfiguration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpltype-aliases-package: com.example.redisapi.domainmapper-locations: classpath:com/example/redisapi/mapper/*Mapper.xml
自動填充
-
實現
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill ....");// 或者this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推薦) }@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill ....");this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推薦) } }
-
實體類字段配置
@TableName("sys_user") public class User {@TableId(value="id",type=IdType.AUTO)private Long id;private String name;private Integer age;private String email;@TableField(.. fill = FieldFill.INSERT_UPDATE)private LocalDateTime createTime;@TableField(.. fill = FieldFill.INSERT)private LocalDateTime updateTime; }
-
框架自帶,用于說明
public enum FieldFill {/*** 默認不處理*/DEFAULT,/*** 插入填充字段*/INSERT,/*** 更新填充字段*/UPDATE,/*** 插入和更新填充字段*/INSERT_UPDATE }
Mapper
-
實現方式
public interface UserMapper extends BaseMapper<User> {}
Service
-
接口
public interface LoginService {ResultVO<String> login(String username, String password) throws JsonProcessingException; }
-
實現類方式
@Service public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login>implements LoginService {}
主鍵自增配置
-
在實體類的
id
列標注@TableName("sys_user") public class User {@TableId(value="id",type=IdType.AUTO)private Long id;private String name;private Integer age;private String email; }
注意: 如果出現配置了數據庫的自動增長,出現一段很長的數據時,需要通過
show create table xxx
,先備份原有的數據,這時,在表結構上可能會出現自增的起始id值
,只要將這個值刪除即可,就會按照數據庫表中的最后一個值進行數據自增。
邏輯刪除
-
數據庫字段
id_deleted
-
實體類字段通過注解映射
@TableName("sys_user") public class User {@TableId(value="id",type=IdType.AUTO)private Long id;private String name;private Integer age;private String email;@TableLogic@TableField("is_deleted")private Integer deleted; }
分頁實現
-
自定義
mapper
方法實現分頁-
mapper
IPage<UserVo> selectPageVo(IPage<?> page, Integer state); // or (class MyPage extends Ipage<UserVo>{ private Integer state; }) MyPage selectPageVo(MyPage page); // or List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);
-
xml
<!-- 根據mapper 的返回,會自動拼接 limit --> <select id="selectPageVo" resultType="xxx.xxx.xxx.UserVo">SELECT id,name FROM user WHERE state=#{state} </select>
-
-
調用方法
@Override public ResultVO listProducts(ProductVO productVO) {LambdaQueryWrapper<Products> queryWrapper = new LambdaQueryWrapper<>();// 1: 名稱queryWrapper.like(productVO.getName() != null, Products::getName, productVO.getName());queryWrapper.orderByAsc(Products::getPrice);// 這兩部是實現分頁的核心Page<Products> productsPage = new Page<>(productVO.getPageNum(), productVO.getPageSize());// pageInfo 是分頁后的結果,用于直接返回到前端IPage<Products> pageInfo = productsMapper.selectPage(productsPage, queryWrapper);if (pageInfo != null) {return ResultVO.success("商品列表獲取成功", pageInfo);}return ResultVO.fail("獲取商品列表失敗"); }