mybatisplus快速入门、mapper层的crud、自动填充

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);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值