springboot(测试类)整合mybatisplus增删改查

下载地址

天翼云盘下载链接
天翼云盘下载上传不限速,真的特别好用。不知道是不是只有电信用户能用。
百度网盘下载链接
提取码:84pi

1.创建springboot项目(Spring Initializer快速创建)

添加依赖
引入 Spring Boot Starter 父工程

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.0</version>
    <relativePath/>
</parent>

引入 spring-boot-starter、spring-boot-starter-test、mybatis-plus-boot-starter、lombok、mysql、druid,junit

<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>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
         <version>1.1.6</version>
    </dependency>
    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
       <scope>test</scope>
     </dependency>
</dependencies>

2.配置文件,数据库等

这里我使用的是application.yml,数据库的名字叫mybatisplus

server:
  port: 8080
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/mybatisplus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
    username: root
    password: 123456

# 配置日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

创建数据库
在这里插入图片描述
创建表和数据

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
  `version` int(10) NULL DEFAULT 1 COMMENT '乐观锁',
  `deleted` int(1) NULL DEFAULT 0 COMMENT '是否被删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (1, 'Jone', 18, 'test1@baomidou.com', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 1);
INSERT INTO `user` VALUES (2, 'Jack', 20, 'test2@baomidou.com', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);
INSERT INTO `user` VALUES (3, 'Tom', 28, 'test3@baomidou.com', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);
INSERT INTO `user` VALUES (4, 'Sandy', 21, 'test4@baomidou.com', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);
INSERT INTO `user` VALUES (5, 'Billie', 24, 'test5@baomidou.com', '2020-11-10 16:23:57', '2020-11-10 16:23:57', 1, 0);

SET FOREIGN_KEY_CHECKS = 1;

3.配置,策略,实体类

如果有注解不认识的地方,可以百度一下,lombok这个插件很方便的。
(1).创建实体类

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

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @TableId(type = IdType.AUTO)//主键自增
    private Long id;//对应数据库中的主键
    private String name;
    private Integer age;
    private String email;
    @TableLogic
    private Integer deleted;//逻辑删除
    @Version
    private Integer version;//乐观锁
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
}

@AllArgsConstructor------全参构造
@NoArgsConstructor-----无参构造
@Data-----get、set、equals、hashCode、canEqual、toString方法
点击查看注解官方解释
@TableLogic-----表字段逻辑处理注解(逻辑删除)
@Version-----乐观锁注解
@TableId(type = IdType.AUTO)
@TableField-----字段注解
这个注解的idType点进去查看源码,可以发现是一个枚举类,视情况选择。
在这里插入图片描述

在这里插入图片描述
(2).创建mapper(继承baseMapper,泛型填写对应的实体类)

public interface UserMapper extends BaseMapper<User> {

}

(3).创建填充策略
为@tableField创建填充策略
在这里插入图片描述
原理:
(1).实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
(2).注解填充字段 @TableField(… fill = FieldFill.INSERT) 生成器策略部分也可以配置

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    //插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill....");
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
    //更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("start update fill....");
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

注意事项:
填充原理是直接给entity的属性设置值!!! 注解则是指定该属性在对应情况下必有值,如果无值则入库会是null。
MetaObjectHandler提供的默认方法的策略均为:如果属性有值则不覆盖,如果填充值为null则不填充。
字段必须声明TableField注解,属性fill选择对应策略,该声明告知Mybatis-Plus需要预留注入SQL字段。
填充处理器MyMetaObjectHandler在 Spring Boot 中需要声明@Component或@Bean注入。
要想根据注解FieldFill.xxx和字段名以及字段类型来区分必须使用父类的strictInsertFill或者strictUpdateFill方法。
不需要根据任何来区分可以使用父类的fillStrategy方法。

public enum FieldFill {
    /**
     * 默认不处理
     */
    DEFAULT,
    /**
     * 插入填充字段
     */
    INSERT,
    /**
     * 更新填充字段
     */
    UPDATE,
    /**
     * 插入和更新填充字段
     */
    INSERT_UPDATE
}

(4).配置类

import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement//事务
@MapperScan("com.qwl.mybatisplus.mapper")//扫描包
@Configuration//配置类
public class MybatisPlusConfig {
        //注册乐观锁插件
    @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { 
    	return new OptimisticLockerInterceptor(); 
    }
    //分页插件
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor(){
        return new PaginationInnerInterceptor();
    }
}

@MapperScan(“com.qwl.mybatisplus.mapper”)----扫描mapper
@EnableTransactionManagement-----添加事务

4.增删改查

使用springboot的测试类进行增删改查

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

@SpringBootTest
class MybatisplusApplicationTests {
    @Resource
    private UserMapper userMapper;

 }

查询

查询全部
    /**
     * 查询全部
     */
    @Test
    void queryAll() {
        List<User> list = userMapper.selectList(null);
        System.out.println(list);
    }

在这里插入图片描述

查询-根据id批量查询
    /**
     *id批量查询
     */
    @Test
    public void testSelectBacthIds(){
        List<User> list = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        list.forEach(System.out::println);
    }

在这里插入图片描述

查询-根据map查询
    /**
     * map查询
     */
    @Test
    public void testSelectByMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name","jack");
        List<User> list = userMapper.selectByMap(map);
        list.forEach(System.out::println);
    }

在这里插入图片描述

查询-分页查询
    /**
     *分页查询
     */
    @Test
    public void testSelectPage(){
        Page<User> page = new Page<>(2,2);//(pageNumber,pageSize)
        userMapper.selectPage(page, null);
        page.getRecords().forEach(System.out::println);
    }

在这里插入图片描述

查询-wrapper查询
查询name不为空的,并且邮箱不为空的用户,年龄大于21的。(isNotNull–非空 ,ge—大于)
    /**
     * 查询 isNotNull--非空 ge---大于
     */
    @Test
    void queryIsNotNull() {
        //查询name不为空的,并且邮箱不为空的用户,年龄大于21的
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .isNotNull("name")
                .isNotNull("email")
                .ge("age",21);
        userMapper.selectList(wrapper).forEach(System.out::println);
    }

在这里插入图片描述

查询 eq(等于)
    /**
     * 查询 eq
     */
    @Test
    void queryEq() {
        //查询name为tom的
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name","Tom");
        User user = userMapper.selectOne(wrapper);
        System.out.println(user);
    }

在这里插入图片描述

查询 between and
    /**
     * 查询 between and
     */
    @Test
    void queryBetweenAnd() {
        //查询年纪为21~30的
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.between("age",21,30);
        Integer count = userMapper.selectCount(wrapper);
        System.out.println(count);
    }

在这里插入图片描述

模糊查询 notLike–not like %x% like–%x% likeRight–x% likeLeft–%x
    /**
     * 模糊查询 notLike--not like %x%  like--%x% likeRight--x% likeLeft--%x
     */
    @Test
    void queryLike() {

        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .notLike("name","m")
                .likeRight("email","t");
        userMapper.selectMaps(wrapper).forEach(System.out::println);
    }

在这里插入图片描述

连接查询
    /**
     * 连接查询
     */
    @Test
    void queryQueryConnect() {
        //id在子查询中查出
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper
                .inSql("id","select id from user where id<4");
        List<Object> list = userMapper.selectObjs(wrapper);
        list.forEach(System.out::println);
    }

在这里插入图片描述

查询排序
    /**
     * 查询排序
     */
    @Test
    void queryOrderBy() {
        //通过id进行排序
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("id");
        List<User> list = userMapper.selectList(wrapper);
        list.forEach(System.out::println);

    }

在这里插入图片描述

新增

主键自增,创建时间修改时间自动插入
    /**
     *插入
     */
    @Test
    public void testInsert(){
        User user = new User();
        user.setName("qwl");
        user.setAge(18);
        user.setEmail("291532919@qq.com");
        userMapper.insert(user); //自动生成id
        System.out.println(user.getId());
    }

在这里插入图片描述
在这里插入图片描述

修改

修改–乐观锁(修改成功)
    /**
     *修改---乐观锁
     */
    @Test
    public void testUpdate(){
        User user = userMapper.selectById(8L);
        user.setName("鹿小葵加油222");
        user.setAge(88);
        userMapper.updateById(user);
    }

在这里插入图片描述
在这里插入图片描述

修改–乐观锁(修改失败)
    /**
     *修改--乐观锁(修改失败)
     */
    @Test
    public void testOptimisticLocker(){
        //线程1
        User u1 = userMapper.selectById(8L);
        u1.setName("鹿小葵加92号油");
        u1.setAge(666);
        //线程2
        User u2 = userMapper.selectById(8L);
        u2.setName("鹿小葵加95号油");
        u2.setAge(666);
        userMapper.updateById(u2);
        userMapper.updateById(u1);//更改失败,乐观锁
    }

在这里插入图片描述
在这里插入图片描述

删除

数据库有"deleted"字段,采用的是逻辑删除。(0代表未删除,1代表已删除)

删除-map删除
    /**
     * map删除
     */
    @Test
    public void testDeleteByMap(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("id",8L);
        userMapper.deleteByMap(map);
    }

在这里插入图片描述
在这里插入图片描述

删除-根据idList批量删除
    /**
     * 根据idList批量删除
     */
    @Test
    public void testDeleteBatchIds(){
        userMapper.deleteBatchIds(Arrays.asList(5L,4L));
    }

在这里插入图片描述
在这里插入图片描述

删除-根据id删除
    /**
     * 根据id删除
     */
    @Test
    public void testDeleteById(){
        userMapper.deleteById(1);
    }

在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiweilong123456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值