您的当前位置:首页正文

Mybatis-Plus 实现增删改查 -- Mybatis-Plus 快速入门保姆级教程(一)

2024-11-29 来源:个人技术集锦


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)


发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【】。

一、MyBatis-Plus是什么?

1.MyBatis-plus简介

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

2.MyBatis-plus特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

二、MyBatis-Plus入门案例(数据库连接与MP接口调用)

1.设计并编写数据库表

代码如下(示例):

Drop database if EXISTS mybatisplus_db;
CREATE SCHEMA `mybatisplus_db` DEFAULT CHARACTER SET utf8mb4;
 
use `mybatisplus_db`;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL,
  `name` varchar(20),
  `password` varchar(50) ,
  `age` int(10) ,
	`tel` varchar(255) ,
  PRIMARY KEY (`id`) 
);

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'tom', 'tom', 3 , '188666888');
INSERT INTO `user` VALUES (2, 'jerry', 'jerry',  4 , '166888666');
INSERT INTO `user` VALUES (3, 'jock', '123456',  41 , '400618400');
INSERT INTO `user` VALUES (4, '传智播客', 'itcast', 23 , '400617500');

效果如下:

2.创建springboot工程并勾选相关依赖

(此处只是示例,具体命名根据自己情况决定,操作步骤如图)

3.手动导入相关坐标

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
  1. 导入druid数据源坐标
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

4.编写数据库配置文件application.yml

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    //数据库名称示例:mybatisplus_db
    url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
    //用户名示例:root
    username: root
    //用户密码示例:root
    password: root

5.编写数据层功能

(一定要注意文件之间的层级关系,搞错了可能导致无法自动装配bean等问题)

  1. 创建名称为domain的包,用于封装数据,根据设计的数据库表在doamin包下创建编辑名称为user的实体类
//lombok
//@Data 注解的主要作用是提高代码的简洁,
// 使用这个注解可以省去代码中大量的get()、 set()、 toString()等方法(这些通用方法可以一键生成);
//要使用 @Data 注解要先引入lombok,它是一个工具类库,可以用简单的注解形式来简化代码,提高开发效率。
@Data
public class User {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;
}
  1. 创建名称为dao的包,用于编写数据层接口,并创建名称为UserDao的接口
//继承BaseMapper接口,泛型填写实体类名称
@Mapper
public interface UserDao extends BaseMapper<User> {
}

  1. 编写测试类

@SpringBootTest
class DlMpApplicationTests {
    //将Userdao接口装配bean到IOC容器
    @Autowired
    private UserDao userDao;

    //查询全部
    @Test
    void testGetAll() {
        List<User> userList = userDao.selectList(null);
        System.out.println(userList);
    }
}
  1. 测试类运行结果

三、CRUD(增删改查)接口介绍

1.Mybatis-plus CRUD接口详细介绍

【】

2.Service CRUD 与 Mapper CRUD的区别与联系

  • Service CRUD 返回的boolean的值,Mapper CRUD 返回的是int值

  • Mapper简化了单表的sql操作步骤(CRUD),而Serivce则是对Mapper的功能增强,比如Service 还提供了一些批量方法(批量插入、批量更新数据),这是 Mapper 没有的

  • 在运用CRUD上两者区别不大,Service以业务功能为主,更加复杂(底层)的SQL查询还是要靠Mapper去编写SQL语句

  • 为了避免混淆,Service 与 Mapper 的 CRUD 方法前缀有所区别:

    1. Mapper 的方法前缀是:select(查询)、insert(插入)、update(更新)、delete(删除)
    2. Service 的方法前缀是:get(查询单行)、list(查询集合)、page(分页查询)、save(插入)、update(更新)、remove(删除)

四、标准CRUD开发

(在入门案例的测试类上进行编码)

1.增(Mapper CRUD接口 insert() )

  @Test
    void testSave(){
        User user = new User();
        user.setId(12L);
        user.setName("黑马程序员");
        user.setAge(12);
        user.setPassword("itheima");
        user.setTel("400418400");
        //实现增加操作的Mapper CRUD接口: int insert(T entity);
        userDao.insert(user);
    }

2.删(Mapper CRUD接口 deleteById() )

    @Test
    void testDelete(){
        //实现删除操作的Mapper CRUD接口: int deleteById(Serializable id);
        userDao.deleteById(12L);
    }

3.改(Mapper CRUD接口 updateById() )

@Test
    void testUpdate(){
        User user = new User();
        user.setId(1L);
        user.setName("Tom666");
        user.setPassword("tom888");
        // 实现修改操作的Mapper CRUD接口: int updateById(@Param(Constants.ENTITY) T entity);;
        userDao.updateById(user);
    }

4.查全部(Mapper CRUD接口 selectList() )

(上面的入门案例做过)

    @Test
    void testGetAll() {
        //实现了Mapper CRUD 的 selectList 接口,根据 entity 条件,查询全部记录
        //List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)
        List<User> userList = userDao.selectList(null);
        System.out.println(userList);
    }

5. 查单个(Mapper CRUD接口 selectById() )

    @Test
    void testGetById(){
        // 实现了Mapper CRUD的selectById接口,根据 ID 查询
        // T selectById(Serializable id);
        User user = userDao.selectById(1L);
        System.out.println(user);
    }

6.分页查询(Mapper CRUD接口 selectPage() )

  1. 在src/main/java/com.example.dl_mp目录下创建名称为config的包并创建MpConfig类
  2. 编写Mpconfig类构建拦截器
@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        //1.定义Mp拦截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2.添加具体的拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    }

}

  1. 在测试类编写分页查询代码
    //分页查询
    //ctrl + H 查看类的继承关系
    //ctrl + 鼠标左键 查看源码
    //Alt + 7 查看类中的所有方法列表
    @Test
    void testGetPage(){
        //current : 1 代表当前查第几页,size : 2 代表每页有多少条
        IPage page = new Page(1, 2);
        // 实现Mapper CRUD中的selectPage接口,根据 entity 条件,查询全部记录(并翻页)
        //IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
        userDao.selectPage(page, null);
        System.out.println("当前页码值:" + page.getCurrent());
        System.out.println("每页显示数:" + page.getSize());
        System.out.println("一共多少页:" + page.getPages());
        System.out.println("一共多少条数据:" + page.getTotal());
        System.out.println("数据:" + page.getRecords());
    }
    
  1. 测试方法运行结果

`博客内容借鉴了bilibili黑马程序员SSM课程资料,如有侵权,请联系作者删除`

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)

显示全文