MyBatis-Plus
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,
在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
在这里所有的讲解都是依据官网,这个官网很适合英文不好的朋友,所以说还是建议大家多看看官网
pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
application.yml
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/aw?useSSL=false&useUincode=true&characterEncoding=utf-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
#使用默认的控制台输出日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
我们意识依据官网的快速入门,使用相同表,这里就不多说了。我们就在那张表中添加了两个新的字段
实体类
这里的实体类名必须与数据库中的表明一致
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private int age;
private String email;
private Date createTime;
private Date updateTime;
}
mapper
这里的Mapper中点是已成BaseMapper类泛型User
@Repository
public interface UserMapper extends BaseMapper<User> {
}
Test
@SpringBootTest
@MapperScan("com.aw.mybatisplus.mapper")//扫描相应的接口
class MybatisplusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
//测试查询
List<User> studentList = userMapper.selectList(null);
studentList.forEach(System.out::println);
}
}
Inserter
如果我们只将id设置为主键,我们在插入的时候不设置id的值,他将会有一个默认值的值,这个是mybatisplus自动生成的类型为Long,使用的是雪花算法:
所有生成的id按时间趋势递增
整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)
插入
@Test
void insert(){
User user = new User();
user.setName("阿威");
user.setAge(11);
user.setEmail("2333");
int i = userMapper.insert(user);
System.out.println(i);
}
默认生成的id
设置主键id的策略
我们只需要添加相应的注解即可实现
@TableId(type =)
private Long id;
他的类型是泛型 ,通过源码可以很清楚的看到他的取值,需要注意的是我们设置自动增长的前提是将表中id勾选自动增长,选择手动输入id的时候在插入数据的时候就必须设置id的值。
/**
* 生成ID类型枚举类
*
* @author hubin
* @since 2015-11-10
*/
@Getter
public enum IdType {
/**
* 数据库ID自增
* <p>该类型请确保数据库设置了 ID自增 否则无效</p>
*/
AUTO(0),
/**
* 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 分配ID (主键类型为number或string),
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
*
* @since 3.3.0
*/
ASSIGN_ID(3),
/**
* 分配UUID (主键类型为 string)
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
*/
ASSIGN_UUID(4),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_ID}
*/
@Deprecated
ID_WORKER(3),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_ID}
*/
@Deprecated
ID_WORKER_STR(3),
/**
* @deprecated 3.3.0 please use {@link #ASSIGN_UUID}
*/
@Deprecated
UUID(4);
update
这里需要注意的是我们虽然是用过id更新,但是传递的参数是对象。
@Test
void update(){
User user = new User();
user.setId(1L);
user.setName("阿威");
// 在修改一个值 mybatis-plus是执行的动态sql进行拼接的
user.setAge(18);
// 这里的虽然是通过id进行查找的但是他的参数是传递的对象
int i = userMapper.updateById(user);
System.out.println(i);
}
delete
@Test
void delete(){
int i = userMapper.deleteById("1395985586421956615");
System.out.println(i);
}
自动填充
有时候我们需要记录创建时间、修改时间,但是我们有不希望通过修改数据库进行修改。所以我们要单独写一个处理类。
首先是我们需要现在实体类上面属性添加相应的注解
@TableField()这个注解是设置与字段相关的,fill是他其中的一个属性,自动填充的属性
//设置当前字段在插入的时候自动更新
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//在更新的时候自动填充
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
处理类
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入
@Override
public void insertFill(MetaObject metaObject) {
log.info("插入正在填充");
setFieldValByName("createTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("修改正在填充");
setFieldValByName("updateTime",new Date(),metaObject);
}
}