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("获取商品列表失败"); }