MybatisPlus自动实现CRUD

本文介绍了如何在SpringBoot项目中集成MyBatisPlus,包括环境搭建、配置数据源、创建数据库表、实体类、mapper接口,以及进行增删改查的测试。此外,还展示了如何开启MyBatisPlus的日志,以便于查看执行的SQL语句。文章详细讲解了每个步骤,并提供了相关的代码示例。
摘要由CSDN通过智能技术生成

一、环境搭建

1、创建springBoot工程

  1. 创建springboot模块
  2. 模块名称
  3. jdk版本,最好是jdk1.8
  4. java版本,最好是java8
  5. 打包方式

在这里插入图片描述

  1. springboot版本
  2. 选择Lombok简化开发
  3. 选择mysql驱动

在这里插入图片描述

2、加入依赖

MyBatisPlus是国人开发的工具,spring官方并没有收录,所以依赖只能单独添加。

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

还需要用到数据库连接池,我这里用的是Druid。

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

3、配置数据源信息

springboot一般配置文件都是yml格式的,所以一般都将默认的properties格式替换掉。数据库连接池我用Druid,看你习惯喜欢用什么就用什么。当然,Druid是阿里下国产的数据源,性能还是比较优秀的,所以我支持国产。

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/mybatisplus
      username: root
      password: 1234

4、创建数据库测试表

DROP TABLE IF EXISTS `fruits`;
CREATE TABLE `fruits`  (
  `f_id` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `s_id` int NOT NULL,
  `f_name` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `f_price` decimal(8, 2) NOT NULL,
  `quantity` int NULL DEFAULT 1000,
  PRIMARY KEY (`f_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;


INSERT INTO `fruits` VALUES ('a1', 101, 'apple', 5.20, 1000);
INSERT INTO `fruits` VALUES ('a2', 103, 'apricot', 2.30, 1000);
INSERT INTO `fruits` VALUES ('b1', 101, 'blackberry', 10.20, 1000);
INSERT INTO `fruits` VALUES ('b2', 104, 'berry', 7.60, 1000);
INSERT INTO `fruits` VALUES ('b3', 100, 'peanut', 3.50, 1000);
INSERT INTO `fruits` VALUES ('b5', 107, 'pear', 3.60, 1000);
INSERT INTO `fruits` VALUES ('bs1', 102, 'orange', 11.20, 1000);
INSERT INTO `fruits` VALUES ('bs2', 105, 'melon', 8.20, 1000);
INSERT INTO `fruits` VALUES ('c0', 101, 'plum', 3.20, 1000);
INSERT INTO `fruits` VALUES ('l2', 104, 'lemon', 6.40, 1000);
INSERT INTO `fruits` VALUES ('m1', 106, 'mango', 15.60, 1000);
INSERT INTO `fruits` VALUES ('m2', 105, 'watermelon', 2.60, 1000);
INSERT INTO `fruits` VALUES ('m3', 105, 'cherry', 11.60, 1000);
INSERT INTO `fruits` VALUES ('o2', 103, 'coconut', 9.20, 1000);
INSERT INTO `fruits` VALUES ('t1', 102, 'banana', 10.30, 1000);
INSERT INTO `fruits` VALUES ('t2', 102, 'grape', 5.30, 1000);
INSERT INTO `fruits` VALUES ('t4', 107, 'peanut', 3.60, 1000);


DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `user_name`(`user_name`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;


INSERT INTO `user` VALUES (1, '11', '11');
INSERT INTO `user` VALUES (3, '111', '11');
INSERT INTO `user` VALUES (4, 'a', '11');
INSERT INTO `user` VALUES (7, 'aaa', 'aaa');
INSERT INTO `user` VALUES (8, '8', '8');

5、创建实体类

下面用到几个注解,简单解释一下:

  1. @Data:使用lombok注解自动生成get、set、toString、equals等方法
  2. @TableName("fruits"):该注解用于数据库表与实体类名之间的对应
  3. @TableField("s_id"): MyBatisPlus注解,指明数据库字段与实体类对应关系,若一样通过反射机制自动对应,不需要注解
  4. @TableId(value = "id", type = IdType.AUTO): MyBatisPlus注解,说明该字段为主键,value对应数据库表字段,type对应主键数据生成类型,默认是雪花算法生成的,修改成AUTO后变成自动增长
//使用lombak注解自动生成get、set、tostring、equals等方法
@Data
public class User {

//    MyBatisPlus注解,说明该字段为主键,value对应数据库表字段,type对应主键数据生成类型,
//    默认是雪花算法生成的,修改成AUTO后变成自动增长
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

//    MyBatisPlus注解,指明数据库字段与实体类对应关系,若一样通过反射机制自动对应,不需要注解
    @TableField("user_name")
    private String userName;

    private String password;

}

@Data
// 该注解用于数据库表与实体类名之间的对应
@TableName("fruits")
public class Fruit {

    @TableId(value = "f_id", type = IdType.UUID)
    private String fId;

    @TableField("s_id")
    private Integer sId;

    @TableField("f_name")
    private String fName;

    @TableField("f_price")
    private Float fPrice;

    private Integer quantity;

}

6、创建mapper接口

这里的mapper就相当于springMVC里面的DAO层,与SpringMVC不同的是,SSM或者SSMP架构在DAO层都不需要实现类,直接定义接口,MyBatisPlus会将接口对应的代理类加载到spring容器。还要注意mapper接口需要加上@Mapper注解,告诉spring这是mapper映射接口,或者在引导类上面加上注解@MapperScan("com.cx.mybatisplus.mapper"),直接将mapper包路径扫描。

@Mapper
public interface FruitMapper extends BaseMapper<Fruit> {
}

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

mapper里面的接口一般不需要自己写那些抽象方法,只需要继承BaseMapper类,并且将泛型传进去,大部分方法都有。可以看到BaseMapper接口里面定义了大部分操作表的方法,如果需要添加其它方法,可以在对应mapper接口里面添加。MyBatisPlus实在MyBatis基础上扩展的,并不会修改MyBatis原有的用法。
在这里插入图片描述

7、加上MyBatisPlus日志

在springboot配置文件中加上,以下配置,就可以在控制台上看到执行日志了。

mybatis-plus:
  configuration:
    #加上日志功能
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

二、测试Mapper部分方法

1、添加

添加用户:

    @Test
    public void insertUserTest(){
        User user = new User();
        user.setUserName("cxx");
        user.setPassword("1234567");
        userMapper.insert(user);
        System.out.println("userId="+user.getId());
    }

构造的sql语句:
在这里插入图片描述

2、删除

  1. 通过id删除
    @Test
    public void deleteFruitByIdTest(){
        fruitMapper.deleteById("a1");
    }

构造的sql语句:
在这里插入图片描述

  1. 通过Map集合删除
    @Test
    public void deleteFruitByMapTest(){
        Map<String,Object> map = new HashMap<>();
        map.put("s_id",107);
        map.put("f_name","pear");
        fruitMapper.deleteByMap(map);
    }

构造的sql语句:
在这里插入图片描述

  1. 通过List集合批量删除
    @Test
    public void deleteFruitByListTest(){
        List<String> list = Arrays.asList("b1", "b2", "b3");
        fruitMapper.deleteBatchIds(list);
    }

构造的sql语句:
在这里插入图片描述

3、修改

根据id修改

    @Test
    public void updateUserById(){
        User user = new User();
        user.setId(32);
        user.setUserName("cxxxx");
        user.setPassword("cxxxxxx");
        userMapper.updateById(user);
    }

在这里插入图片描述

4、查询

  1. 通过id查询
    @Test
    public void selectFruitById(){
        Fruit fruit = fruitMapper.selectById("a2");
        System.out.println(fruit);
    }

查询结果以及构造的SQL语句:
在这里插入图片描述

  1. 通过list集合批量查询
    @Test
    public void selectFruitByList(){
        List<String> list = Arrays.asList("m1", "m2", "m3");
        List<Fruit> fruits = fruitMapper.selectBatchIds(list);
        for (Fruit fruit : fruits) {
            System.out.println(fruit);
        }
    }

查询结果以及sql语句:
在这里插入图片描述

  1. 通过map集合查询
    @Test
    public void selectFruitByMap(){
        Map<String,Object> map = new HashMap<>();
        map.put("s_id",105);
        map.put("quantity",1000);
        List<Fruit> fruits = fruitMapper.selectByMap(map);
        for (Fruit fruit : fruits) {
            System.out.println(fruit);
        }
    }

查询结果:
在这里插入图片描述

  1. 分页功能
    分页插件的配置:
    MyBatisPlus实现分页功能必须要配置分页插件,如果不配置,分页查询会没有效果。
    配置如下:
@Configuration
@MapperScan("com.cx.mybatisplus.mapper")
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
           MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
           mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
           return mybatisPlusInterceptor;
    }
}

实现分页查询:
分页查询要传入两个参数,第一个是一个page对象,第二个是条件构造器。创建Page对象时不要忘了加上查询对象的泛型,然后Current是现在是第几页,Size是每页几条数据。

    public void pagesTest01(){
        Page<Fruit> page = new Page<>();
        page.setCurrent(2);
        page.setSize(3);
        fruitMapper.selectPage(page,null);
        System.out.println(page);
    }

查询构造的sql语句,实际上就是分页查询的sql:
在这里插入图片描述

三、测试Service方法

1、创建通用service接口以及实现类

MyBatisPlus不仅在DAO提供了简化开发的接口,在service层也有对应的接口以及实现类。首先我们的service接口要继承MyBatisPlus里面的通用的IService接口,注意泛型就是对应的实体类。按照三层构架开发模式,我们有service接口,就需要重写接口里面所有的方法,但是MyBatisPlus连对应要重写的方法都给我们写好了,我们只需要在实现service接口基础上,再继承MyBatisPlus为我们定义的通用service层的实现类ServiceImpl,泛型第一个就是对应mapper接口,第二个就是实体类。

service接口

public interface UserService extends IService<User> {
}
public interface FruitService extends IService<Fruit> {
}

serviceimpl实现类

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

@Service
public class FruitServiceImpl extends ServiceImpl<FruitMapper, Fruit> implements FruitService {
}

Iservice里面的方法:
在这里插入图片描述

serviceImpl里面的方法:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我没得冰阔落.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值