• MyBatis-Plus快速入门


    最近项目中使用到了 MyBatis-Plus。接下来快速搭建一个项目,快速入门 MyBatis-Plus。

    官方文档非常详细:https://baomidou.com/pages/226c21/

    一、MyBatis-Plus简介

    来自官方介绍。

    MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

    特性:

    • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
    • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
    • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
    • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
    • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
    • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
    • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
    • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
    • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
    • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
    • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

    二、快速入门

    1、搭建项目

    1.1 创建数据表

    DROP TABLE IF EXISTS `t_user`;
    CREATE TABLE `t_user` (
      `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `user_name` varchar(30) NOT NULL  DEFAULT '' COMMENT '用户名',
      `age` int NOT NULL  DEFAULT 0 COMMENT '年龄',
    	`height` DOUBLE(10,2) NOT NULL  DEFAULT 0.00 COMMENT '身高',
      `email` varchar(50) NOT NULL  DEFAULT '' COMMENT '邮箱',
      `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
    
    -- 
    DELETE FROM `t_user`;
    
    INSERT INTO `t_user` (id, user_name, age, height, email) VALUES
    (1, 'Jone', 18, 1.65, 'test1@baomidou.com'),
    (2, 'Jack', 20, 1.60,'test2@baomidou.com'),
    (3, 'Tom', 28, 1.75, 'test3@baomidou.com'),
    (4, 'Sandy', 21, 1.72, 'test4@baomidou.com'),
    (5, 'Billie', 24, 1.80, 'test5@baomidou.com');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    1.2 引入依赖

    创建 maven项目,引入依赖:

    
        <dependency>
          <groupId>com.baomidougroupId>
          <artifactId>mybatis-plus-boot-starterartifactId>
          <version>3.5.1version>
        dependency>
    
        
        <dependency>
          <groupId>mysqlgroupId>
          <artifactId>mysql-connector-javaartifactId>
          <version>8.0.22version>
          <scope>runtimescope>
        dependency>
        
        <dependency>
          <groupId>org.springframework.bootgroupId>
          <artifactId>spring-boot-starter-jdbcartifactId>
          <version>2.5.8-SNAPSHOTversion>
        dependency>
    
        <dependency>
          <groupId>com.alibabagroupId>
          <artifactId>druid-spring-boot-starterartifactId>
          <version>1.2.3version>
        dependency>
    
        <dependency>
          <groupId>org.projectlombokgroupId>
          <artifactId>lombokartifactId>
          <version>1.18.22version>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    1.3 yaml配置文件

    server:
      port: 18081
      servlet:
        context-path: /
    
    spring:
      application:
        name: mybatis-plus-springboot
      ## 数据源配置
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver # com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis_db?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT
        username: root
        password: 123456
    
    
    logging:
      level:
        root: info
        com.charge.learn.mybatis.plus: debug #打印SQL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    到此,环境就搭建好了,可以使用 MyBatis-Plus。

    1.5 创建DO

    @Data
    @ToString
    @TableName("t_user")
    public class UserDO {
    
    	@TableId(value = "id", type = IdType.AUTO)
    	private Long id;
    
    	@TableField("user_name")
    	private String userName;
    
    	private Integer age;
    
    	private Double height;
    
    	private String email;
    
    	@TableField(value = "create_time", fill = FieldFill.INSERT)
    	private Date createTime;
    
    	@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    	private Date updateTime;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    官方文档-注解:https://baomidou.com/pages/223848/

    下面针对表创建 mapper,service等,进行使用。

    2、Mapper CRUD 接口

    说明:

    • 通用 CRUD 封装 BaseMapper(opens new window)接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
    • 泛型 T 为任意实体对象,一般即POJO对象
    • 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
    • 对象 Wrapper 为 条件构造器

    所以,我们 POJO对应的Mapper接口只需要继承 BaseMapper接口,即可进行一些通用 CRUD的操作。对象 Wrapper 为 条件构造器后面在学习。
    官方文档-Mapper CRUD 接口:https://baomidou.com/pages/49cc81/#mapper-crud-接口

    public interface UserMapper extends BaseMapper<UserDO> {
    }
    
    • 1
    • 2

    就可以进行单元测试了。

    2.1 新增

        @Autowired
        private UserMapper userMapper;
    
        @Test
        public void testInsert() {
            System.out.println(("----- insert method test ------"));
            UserDO userDO = new UserDO();
            userDO.setUserName("赵云");
            userDO.setAge(20);
            userDO.setHeight(1.88);
            userDO.setEmail("zhaoyun@123.com");
            int count = userMapper.insert(userDO);
    
            System.out.println("count = " + count);
            System.out.println("userDO = " + userDO);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    注意:如果指定了 fill为后面三个时,必须显示设置值。否则为报错:Column 'create_time' cannot be null. 后面我们在使用字段自动填充。这里也可以不指定或者显示设置值。

    在这里插入图片描述

    2.2 删除

        @Test
        public void testDeleteById() {
            System.out.println(("----- deleteById method test ------"));
            int count = userMapper.deleteById(1L);
    
            System.out.println("count = " + count);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2.3 修改

        @Test
        public void testUpdateById() {
            System.out.println(("----- updateById method test ------"));
            UserDO userDO = new UserDO();
            userDO.setId(6L);
            userDO.setUserName("赵子龙");
            //userDO.setAge(21);
            userDO.setHeight(1.908);
            //userDO.setEmail("zhaoyun@123.com");
            /**
             * 因为 update_time,fill = INSERT_UPDATE,所以它必须设值,否则会报不能为null的错误
             * @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
             */
            userDO.setUpdateTime(new Date()); /
            int count = userMapper.updateById(userDO);
    
            System.out.println("count = " + count);
            System.out.println("userDO = " + userDO);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    2.4 查询

        @Test
        public void testSelectById() {
            System.out.println(("----- selectById method test ------"));
            UserDO userDO = userMapper.selectById(6L);
    
            System.out.println("userDO = " + userDO);
        }
    
        @Test
        public void testSelectList() {
            System.out.println(("----- selectList method test ------"));
            List<UserDO> userList = userMapper.selectList(null);
    
            userList.forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    3、Service CRUD 接口

    说明:

    • 通用 Service CRUD 封装 IService(opens new window)接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,
    • 泛型 T 为任意实体对象
    • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
    • 对象 Wrapper 为 条件构造器

    官方文档-Service CRUD 接口:https://baomidou.com/pages/49cc81/#service-crud-接口
    所以,我们 POJO对应的 server接口只需要继承 IService接口,即可进行一些通用 CRUD的操作。对象 Wrapper 为 条件构造器后面在学习。

    public interface UserService extends IService<UserDO> {
    }
    
    • 1
    • 2

    注意:

    • service的实现类继承 service接口,就需要实现 IService接口里面的方法,但是,MyBatis-Plus也提供了一个 ServiceImpl类。更方便的简化我们的开发。
    @Service
    public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService {
        
    }
    
    • 1
    • 2
    • 3
    • 4

    ServiceImpl类有两个泛型:

    • 泛型 M 为 BaseMapper子类,即我们的Mapper对象
    • 泛型 T 为任意实体对象,即POJO

    就可以进行单元测试了。

    3.1 新增

    3.1.1 save方法

    	@Autowired
    	private UserService userService;
    
    	@Test
    	public void testSave() {
    		System.out.println(("----- save method test ------"));
    		UserDO userDO = new UserDO();
    		userDO.setUserName("赵云save");
    		userDO.setAge(20);
    		userDO.setHeight(1.88);
    		userDO.setEmail("zhaoyun@123.com");
    		userDO.setCreateTime(new Date());
    		userDO.setUpdateTime(new Date());
    		boolean save = userService.save(userDO);
    
    		System.out.println("save = " + save);
    		System.out.println("userDO = " + userDO);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    3.1.2 saveBatch方法

    	@Test
    	public void testSaveBatch() {
    		System.out.println(("----- saveBatch method test ------"));
    		List<UserDO> userDOList = new ArrayList<>();
    
    		for (int i = 0; i < 2; i++) {
    			UserDO userDO = new UserDO();
    			userDO.setUserName("赵云save" + i);
    			userDO.setAge(20);
    			//userDO.setHeight(1.88);
    			userDO.setEmail("zhaoyun@123.com");
    			userDO.setCreateTime(new Date());
    			userDO.setUpdateTime(new Date());
    			userDOList.add(userDO);
    		}
    		//boolean saveBatch = userService.saveBatch(userDOList);
    		int batchSize = 5;
    		boolean saveBatch = userService.saveBatch(userDOList, batchSize); //取userDOList的最小值
    
    		System.out.println("saveBatch = " + saveBatch);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    3.2 删除

    	@Test
    	public void testRemoveById() {
    		System.out.println(("----- removeById method test ------"));
    		boolean remove = userService.removeById(13L);
    		System.out.println("remove = " + remove);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    3.3 修改

    3.3.1 updateById方法

    	@Test
    	public void testUpdateById() {
    		System.out.println(("----- updateById method test ------"));
    		UserDO userDO = new UserDO();
    		userDO.setId(11L);
    		userDO.setUserName("赵子龙");
    		//userDO.setAge(21);
    		userDO.setHeight(1.908);
    		//userDO.setEmail("zhaoyun@123.com");
    		userDO.setUpdateTime(new Date());
    		boolean update = userService.updateById(userDO);
    
    		System.out.println("update = " + update);
    		System.out.println("userDO = " + userDO);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    3.3.2 saveOrUpdate方法

    	@Test
    	public void testSaveOrUpdate() {
    		System.out.println(("----- save method test ------"));
    		UserDO userDO = new UserDO();
    		userDO.setId(110L); //id为null或者不存在时,新增,否则修改
    		userDO.setUserName("赵云saveOrUpdate");
    		userDO.setAge(20);
    		userDO.setHeight(1.88);
    		userDO.setEmail("zhaoyun@123.com");
    
    		userDO.setCreateTime(new Date());
    		userDO.setUpdateTime(new Date());
    		boolean saveOrUpdate = userService.saveOrUpdate(userDO);
    
    		System.out.println("saveOrUpdate = " + saveOrUpdate);
    		System.out.println("userDO = " + userDO);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    3.4 查询

    	@Test
    	public void testGetById() {
    		System.out.println(("----- getById method test ------"));
    		UserDO userDO = userService.getById(6L);
    
    		System.out.println("userDO = " + userDO);
    	}
    
    	@Test
    	public void testList() {
    		System.out.println(("----- list method test ------"));
    		List<UserDO> userList = userService.list(null);
    
    		userList.forEach(System.out::println);
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    – 求知若饥,虚心若愚。

  • 相关阅读:
    Nwafu-OJ-1508 Problem 阶段2考试题目5 变位词统计
    MATLAB环境下基于变分贝叶斯的组织学病理图像颜色盲反卷积方法
    算法通关村第十二关白银挑战——仅仅反转英文字母问题解析
    SSM+好乐买超市管理系统 毕业设计-附源码111743
    北京旅游HTML学生网页设计作品 dreamweaver作业静态HTML网页设计模板 北京旅游景点网页作业制作 HTML+CSS+JS
    数据在内存中的存储——深度解析
    netty websockt之断连重试
    XX市消防救援指挥中心实战指挥平台多链路聚合解决方案实例
    C++项目——云备份-①-项目介绍&环境搭建
    Linux修改主机名
  • 原文地址:https://blog.csdn.net/qq_42402854/article/details/126203248