创建SpringBoot项目,使用MybatisPlus实现CRUD操作、自动填充

1、创建数据库,创建表,添加数据

CREATE TABLE `user`
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);

INSERT INTO user (id,name,age,email) VALUES
(1,'Jone',18,'test1@qq.com'),
(2,'Jack',120,'test2@qq.com'),
(3,'Tom',28,'test3@qq.com'),
(4,'Sandy',21,'test4@qq.com'),
(5,'Billie',24,'test5@qq.com')

首先看一下表的结构:

再看一下表的数据:

 2、使用快速方法创建一个SpringBoot项目:

https://blog.csdn.net/YyjYsj/article/details/111152044?spm=1001.2014.3001.5501

3、引入相关依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>

    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <!--lombok用来简化实体类,只需要写属性,不用写get、set方法和有参无参构造,lombok能够自动生成-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

4、在IDEA中安装lombok插件, lombok依赖才会生效

5、创建application.properties文件,添加MySQL数据库的相关配置

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123

#mybatis日志(能够清楚的看到SQL语句、参数、返回数据、数据条数等信息)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

6、创建实体类和mapper接口

在实体类中添加数据库表中相应的字段

package cn.henu.domain;

import lombok.Data;

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

在mapper接口中继承BaseMapper接口,泛型传入相应的实体类

package cn.henu.mapper;

import cn.henu.domain.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

/*
* 在测试类中注入mapper的实现类时会报错(不管它也能正常运行),加上下面的注解就能不报错,把这个对象声明一下,交给Spring进行管理
* 加上@Component或者@Service或者@Repository都可以
* */
//@Component
//@Service
@Repository

/*
* 所有的mapper中的接口都继承BaseMapper接口,泛型传入相应的实体类,就不用写这个接口的实现类了(注意是baomidou中的BaseMapper)
* */
public interface UserMapper extends BaseMapper<User> {
}

7、在测试类中写CRUD方法

7.1、查询User表中所有数据

7.2、添加数据(不需要设置id值,因为mp会根据主键生成策略自动生成一个19位随机的唯一的id值)

主键生成策略:https://blog.csdn.net/YyjYsj/article/details/112342241?spm=1001.2014.3001.5501

在实体类中id属性的上面加上注解实现自动生成主键(不加默认就是@TableId(type = IdType.ID_WORKER))

package cn.henu.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

@Data
public class User {
//    @TableId(type = IdType.AUTO)//主键自动增长
    @TableId(type = IdType.ID_WORKER)//mp自带策略,生成19位的ID值,数字类型使用这种策略,比如long
//    @TableId(type = IdType.ID_WORKER_STR)//mp自带策略,生成19位的ID值,字符串类型使用这种策略,比如string
//    @TableId(type = IdType.INPUT)//ID值不会帮我们生成,需要自己手动输入ID
//    @TableId(type = IdType.NONE)//不用任何策略,也是需要自己手动输入ID
//    @TableId(type = IdType.UUID)//每次帮我们生成一个随机的唯一的ID值
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

7.3、修改数据


自动填充:

不需要原始的手动添加 set 方法实现数据的填充,而是使用 MybatisPlus 的自动填充功能实现数据的添加

一、原始方式(手动添加): 

1、在表中添加两个字段:create_time(创建时间) 和 update_time (修改时间)

添加之后的表结构:

添加之后的表数据:

2、在实体类中添加这两个属性

package cn.henu.domain;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

import java.util.Date;

@Data
public class User {
//    @TableId(type = IdType.AUTO)//主键自动增长
    @TableId(type = IdType.ID_WORKER)//mp自带策略,生成19位的ID值,数字类型使用这种策略,比如long
//    @TableId(type = IdType.ID_WORKER_STR)//mp自带策略,生成19位的ID值,字符串类型使用这种策略,比如string
//    @TableId(type = IdType.INPUT)//ID值不会帮我们生成,需要自己手动输入ID
//    @TableId(type = IdType.NONE)//不用任何策略,也是需要自己手动输入ID
//    @TableId(type = IdType.UUID)//每次帮我们生成一个随机的唯一的ID值
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //create_time
    private Date createTime;

    //update_time
    private Date updateTime;
}

注意字段属性的命名规则:

在数据库中字段名为 create_time 和 update_time ,在实体类中就要把中间的下划线去掉,第二个单词的首字母大写,变成 createTime 和 updateTime 。(使用驼峰规则)

3、添加数据实验一下

//插入数据
@Test
void addUser(){
    User user = new User();
    user.setName("zhangsan");
    user.setAge(23);
    user.setEmail("zhangsan@qq.com");

    int insert = userMapper.insert(user);
    System.out.println("insert:"+insert);
}

看一下数据库中的数据,发现 create_time 和 update_time 两个字段并不会填充

 要想在添加操作时填充 create_time 和 update_time 两个字段,就需要添加 user.setCreateTime(new Date()); 和 user.setUpdateTime(new Date());

//插入数据(手动添加数据)(添加了create_time和update_time两个字段之后)
@Test
void addUser1(){
    User user = new User();
    user.setName("lisi");
    user.setAge(33);
    user.setEmail("lisi@qq.com");

    //要想填充create_time和update_time两个字段,需要手动加上下面两行代码(原始方式)
    user.setCreateTime(new Date());
    user.setUpdateTime(new Date());

    int insert = userMapper.insert(user);
    System.out.println("insert:"+insert);
}

运行之后看数据库中新添加的数据:

二、MybatisPlus 自动填充的具体实现过程:

1、在实体类中需要自动填充的属性上面添加注解

//create_time
@TableField(fill = FieldFill.INSERT)//INSERT的含义就是添加,也就是说在做添加操作时,下面一行中的createTime会有值
private Date createTime;

//update_time
@TableField(fill = FieldFill.INSERT_UPDATE)//INSERT_UPDATE的含义就是在做添加和修改时下面一行中的updateTime都会有值,因为是第一次添加,还没有做修改(一般都使用这个)
private Date updateTime;

2、创建一个类,实现 MetaObjectHandler 接口,并且实现接口中的方法

package cn.henu.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component//注意在这个类上加@Component注解,或者@Service或者@Repository表示将这个类交给Spring进行管理
public class MyMetaObjectHandler implements MetaObjectHandler {
    //使用mp实现添加的操作,这个方法就会执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }

    //使用mp实现修改的操作,这个方法就会执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

3、写一个测试方法,不需要添加 user.setCreateTime(new Date()); 和 user.setUpdateTime(new Date());

//插入数据(mp自动填充)添加了create_time和update_time两个字段之后)
@Test
void addUser2(){
    User user = new User();
    user.setName("wangwu");
    user.setAge(18);
    user.setEmail("wangwu@qq.com");

    int insert = userMapper.insert(user);
    System.out.println("insert:"+insert);
}

运行之后看数据库中新添加的数据: 

测试一下修改操作:

//修改操作
@Test
void updateUser1(){
    User user = new User();
    user.setId(1347375418848399362L);//上面使用mp自动填充功能添加的数据的ID值
    user.setAge(120);

    int row = userMapper.updateById(user);
    System.out.println(row);
}

 运行之后看数据库中新添加的数据: 

可见创建时间不变,修改时间已经变了


一些简单的mp方法:

1、根据id查询数据

2、多个id的批量查询

3、mp实现复杂查询操作

//mp实现复杂查询操作
@Test
void testQueryWrapper(){
    //创建QueryWrapper对象
    QueryWrapper<User> wrapper = new QueryWrapper<>();

    //通过QueryWrapper设置条件
    //ge(大于等于)、gt(大于)、le(小于等于)、lt(小于)、isNull(为空)、isNotNull(不为空)
    //查询age>=30的记录
    //第一个参数:字段名称,第二个参数:要设置的值
//    wrapper.ge("age",30);


    //eq(等于)、ne(不等于)
    //查询name为zhangsan的记录
//    wrapper.eq("name","zhangsan");
    //查询name不等于zhangsan的记录
//    wrapper.ne("name","zhangsan");


    //between(在...之间)、notBetween(不在...之间)(包含大小边界)
//    wrapper.between("age",20,30);


    //like、notLike、likeLeft、likeRight
//    wrapper.like("name","w");

    //orderBy、orderByDesc(降序)、orderByAsc(升序)
//    wrapper.orderByDesc("id");


    //last(直接拼接到sql的最后)
//    wrapper.last("limit 1");

    //查询指定的列
    wrapper.select("name","age");

    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值