第一部分:mybatisPlus

发布于:2025-02-11 ⋅ 阅读:(109) ⋅ 点赞:(0)

mybatisPlus官网
详细mybatisPlus解析

1.快速入门

1.1 入门案例

1. 引入MybatisPlus的起步依赖(导入依赖)(使用mybatisplus依赖替代mybatis依赖);
2. 定义Mapper(自定义Mapper继承MybatisPlus提供的BaseMapper接口,如public interface UserMapper extends BaseMapper<User>{})
BaseMapper中的方法规则:
新增-insert();
修改-updateXXX();
删除-deleteXXX();
查询-selectXXX();
注意:继承父类BaseMapper时,一定要带上实体类泛型,如User;

1.2 常见注解

MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息;
实体类符合数据库表格字段定义【约定大于定义】:
- 类名驼峰转下划线作为表名;
- 名为id的字段作为主键;
- 变量名驼峰转下划线作为表的字段名;
注:以上是要做到实体类和数据库表格字段定义规则;

实体不符合数据库表格字段定义(需要使用注解):
1. @TableName:用来指定表名,如@TableName("tb_user)加到实体类User上;

2. @TableId:用来指定表中的主键字段信息,如@TableId(value="id",type=IdType.type)加到主键属性上;
- value:指数据库表中的主键名;
- IdType.type:type指数据库表中的主键是否呈现自增长类型(AUTO:数据库自增长,INPUT:通过set方法自行输入,ASSIGN_ID:分配ID(默认id使用),接口IdentitierGenerator的方法nextId来生成id,默认实现类为DefaultdentifierGenerator雪花算法-Long类型);

3. @TableField:用来指定表中的普通字段信息,如@TableField("数据库表中字段名");
使用@TableField的常见场景:
- 成员变量名于数据库字段名不一致;
- 成员变量名以is开头,且是布尔值;
- 成员变量名于数据库关键字冲突,如order关键字:@TableField("`order`");
- 成员变量不是数据库字段,如@TableField(exist = false),表示被标识的变量不是数据库表中的字段;

1.3 常见配置

MyBatisPlus的配置项继承了Mybatis原生配置和一些自己特有的配置:
mybatis-plus:
   type-aliases-package: com.yueyue.mp.domain.po  #实体类,别名扫描包
   mapper-locations: "classpath*:/mapper/**/*.xml"  #Mapper.xml文件地址,默认值
   configuration:
      map-underscore-to-camel-case: true  #是否开启下划线和驼峰的映射
      cache-enabled: false  #是否开启二级缓存
   global-config:
      db-config:
        id-type: assign_id  #id为雪花算法生成
        update-strategy: not_null     #更新策略:只更新非空字段;

2.核心功能

2.1 条件构造器

Wrapper(AbstractWrapper(AbstractLambdaWrapper(LambdaUpdateWrapper,LamndaQueryWrapper)),UpdateWrapper,QueryWrapper)

LambdaUpdateWrapper:当在使用数据库表中对应的字段时,直接使用实体类进行引用字段,而非写定,若为写定的则为硬编码;

2.2 自定义sql

利用MyBatisPlus的Wrapper来构建复杂的where条件,然后自己定义SQL语句中剩下的部分;
(1)基于Wrapper构建where条件;
(2)在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew;
(3)自定义SQL,并使用Wrapper条件;

2.3 Service接口

Service接口中方法规则:
新增--saveXXX();
新增或修改--saveOrUpdateXXX();
删除--removeXXX();
查询多个--listXXX();
查询一个--getXXX();
查询数量--countXXX();
分页查询--pageXXX();
复杂条件查询--lambdaXXX();

service层提供接口类继承IService接口类,其中还存在ServiceImpl实现类
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{}
UserMapper:对应的mapper层;
User:实体类;

(1)MP的Service接口使用流程是怎样的?
自定义Service接口继承IService接口;
public interface IUserService extends IService<User>{}
(2)自定义Service实现类,实现自定义接口并继承ServiceImpl类;
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{}

注意:
1. 在controller层中使用service层,推荐使用【构造函数】注入:
在类上加上注解@RequiredArgsConstructor
private final IUserService userService;
2.可以使用hutool工具将一个实体类中的字段值复制到含有相同属性的实体类中;

dto:
vo:查询时使用;

3.扩展功能

3.1 代码生成

1. 实体类
	使用注解(@TableName("user")、@TableId(type=IdType.AUTO等等)),使实体类和数据库表对应;
2. mapper层
	public interface UserMapper extends BaseMapper<User>{}
3. service接口
	public interface IUserService extends IService<User>{}
4. service接口实现类
	@Service
	public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{}


代码生成器:
MybatisX官方快速开发插件,其是IDEA的快速开发插件,能够生成代码;
Mybatisplus插件,其也是IDEA的快速开发插件,能够生成代码(推荐使用);
5. 安装上面两种插件;
6. 在idea中上方出现Other选项,在其中配置连接数据库,
7. 选择Other中的code Generator,填写module(没有子模块不用填);

3.2 静态工具

Db:方法和IService中类似,但Db中的方法都是静态的,在调用方法的方式上有所不同;

3.3 逻辑删除

逻辑删除:基于代码逻辑模拟删除效果,但并不会真正删除数据;
application.yml文件中配置逻辑删除的字段名称和值:
mybatis-plus:
  global-config:
  	db-config:
  		logic-delete-field: flag   #全局逻辑删除的实体字段名,字段类型可以是boolean、integer
  		logic-delete-value: 1  #逻辑已删除值(默认为 1)
  		logic-not-delete-value: 0  #逻辑未删除值(默认为 0)

3.4 枚举处理器

枚举处理器:实体类中有一个用户状态字段;
在application.yml中配置全局枚举处理器

3.5 JSON处理器

数据库表中,存在【json】类型的字段,其实体类应该对应类型是【String】类型,但我们所需要的是直接将json类型的值,调整为对象类型对应的值;
将json类型数据转换为对象类型数据:
1. 定义与实体类A中json类型中数据对应的实体类B;
2. 在实体类A中定义json类型数据为实体类B,且实体类A中json类型字段上面加上注解@TableField(typeHandler = JacksonTypeHandler.class)

4.插件功能

4.1 分页插件

1. 在配置类中注册MyBatisPlus的核心插件,同时添加分页插件;
2. 直接使用:
interceptor.addInnerInterceptor(),添加使用的插件等;
3. 直接使用分页的API

4.2 通用分页实体

直接将分页功能,存放到一个分页公共类中,如果想要进行分页操作,直接调用分页类中的函数即可。