# mybatis-plus
**Repository Path**: zoranwang/mybatis-plus
## Basic Information
- **Project Name**: mybatis-plus
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-09-24
- **Last Updated**: 2022-03-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: mybatis-plus
## README
# mybatis-plus基础代码知识点归纳
## 一、mp简介
### 1.1 依赖
```xml
com.baomidou
mybatis-plus-boot-starter
3.3.1
```
### 1.2 配置
启动类(或者配置类)包扫描
```Java
//SpringBoot项目,扫描接口所在包,或者使用@Mapper
@MapperScan("zoran.wang.mybatisplus.mapper")
```
dao层接口
```Java
//dao接口需要继承BaseMapper
@Repository
public interface UserMapper extends BaseMapper {
}
```
查看sql输出日志
```.properties
#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
```
常规操作
```Java
//插入一条记录
int result = userMapper.insert(user);
//根据过滤条件queryWrapper查询
List users = userMapper.selectList(queryWrapper);
```
## 二、mp的主键策略
MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)
优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高
```Java
@TableId(type = IdType.ASSIGN_ID)
private String id;
```
AUTO自增策略
```Java
@TableId(type = IdType.AUTO)
private Long id;
```
在application.properties进行全局主键配置
```Java
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto
```
注意:优先遵循`@TableId`的主键策略,其次遵循全局主键策略
## 三、自动填充
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作。
### 3.1 数据库字段
在User表中添加datetime类型的新的字段 创建时间 gmt_create、修改时间 gmt_modified
### 3.2 实体类上增加字段并添加自动填充注解
```Java
@Data
public class User {
......
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
//@TableField(fill = FieldFill.UPDATE)
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
}
```
### 3.3 实现元对象处理器接口
```Java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 在插入的时候自动填充日期到这两个字段
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
metaObject.setValue("gmtCreate",new Date());
metaObject.setValue("gmtModified",new Date());
}
/**
* 在更新表的时候自动填充日期到 gmtModified 字段
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
metaObject.setValue("gmtModified",new Date());
}
}
```
## 四、乐观锁
### 4.1 数据库表和实体类
加`version`字段和`@Version`注解
```Java
@Version
private Integer version;
```
### 4.2 配置文件中注册乐观锁插件
```Java
//可以将包扫描放到配置中
@Configuration
public class MybatisPlusConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
```
## 五、查询
> 常见的查询:根据id查询、根据id集合查询、条件查询、分页查询、带条件的分页查询
### 5.1 通过多个id批量查询
完成了动态sql的foreach功能
```Java
@Test
public void testSelectBatchIds(){
List users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
}
```
### 5.1 通过多个id批量查询
```Java
@Test
public void testSelectByMap(){
//注意指定范型的key为String
HashMap map = new HashMap<>();
map.put("name","Tom");
map.put("age",28);
List users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
```
### 5.2 通过QueryWrapper查询
```Java
/**
* 查询——通过QueryWrapper查询
*/
@Test
public void testSelectByQueryWrapper(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("name","Jack").or().eq("name","Jone");
wrapper.eq("age",20);
List users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
/**
* 查询——通过LambdaQueryWrapper查询
*/
@Test
public void testSelectByLambdaQueryWrapper(){
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName,"Jack")
.or()
.eq(User::getName,"Jack");
wrapper.eq(User::getAge,20);
List users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
```
## 六、分页插件
MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能
### 6.1 添加分页插件
配置类中注入一个`PaginationInterceptor`实例对象到IOC容器中
```Java
/**
* 分页插件
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
```
### 6.2 简单分页查询
```Java
/**
* 测试selectPage分页
* 最终通过page对象获取相关数据
*/
@Test
public void testSelectPage() {
//分页对象:指定查询的页码和每页显示的记录条数
int pageNum = 1;
int pageSize = 3;
Page page = new Page<>(pageNum,pageSize);
//分页查询的条件对象
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age",18);//年龄大于18
//执行查询
userMapper.selectPage(page , queryWrapper);
//查询到的分页数据集合
page.getRecords().forEach(System.out::println);
//查询到的其他分页信息
System.out.println(page.getCurrent());
System.out.println(page.getPages());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.hasNext());
System.out.println(page.hasPrevious());
}
```
### 6.3 部分字段对分页查询
```Java
@Test
public void testSelectMapsPageOfMine(){
//区别在于:Page对范型指定对是Map,如果指定的是User,则返回结果集非选择字段为null
Page