MybatisPlus(1)

简介: MybatisPlus(1)

MybatisPlus(1)


前言🍭


MyBatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了一些常用的 CRUD 操作,以及分页、动态 SQL 等常用功能,同时也支持自定义 SQL 语句和存储过程。

一、MybatisPlus简介🍭

MyBatis-Plus官网有两个,第一个域名是热心网友捐赠的(之前已经被申请过了),第二个是正牌官网(国人开发的,为中文)。

MyBatis-Plus

MyBatis-Plus (baomidou.com)

我们可以跟着官网学,这个<快速开始>十分照顾新手。

image.png

1、 MybatisPlus特性🍉

  • 无侵入: 只做增强不做改变,不会对现有工程产生影响
  • 强大的 CRUD 操作: 内置通用 Mapper,少量配置即可实现单表CRUD 操作
  • 支持 Lambda: 编写查询条件无需担心字段写错
  • 支持主键自动生成
  • 内置分页插件
  • ......

详情可见官网:

image.png

总结:使用MybatisPlus几乎可以让你什么都不写,代码简化到极致。

2、MyBatis-Plus历史发展🍉

MyBatis-Plus是一个基于MyBatis的增强工具库,旨在简化和增强MyBatis的开发。下面是MyBatis-Plus的历史发展的总结:

  1. 2012年:MyBatis-Plus的前身是一个名为MyBatis-Plus-Generator的代码生成器,由Javen开发并在GitHub上发布。该代码生成器可以根据数据库表结构自动生成MyBatis的实体类、Mapper接口和XML映射文件。
  2. 2016年:MyBatis-Plus开始独立发展,并发布了第一个版本。它提供了一系列的增强功能,包括通用Mapper、分页插件、逻辑删除、自动填充等,简化了MyBatis的开发。
  3. 2017年:MyBatis-Plus发布了2.0版本,引入了更多的增强功能,例如性能分析插件、动态表名、多租户支持等。
  4. 2018年:MyBatis-Plus发布了3.0版本,引入了Lambda表达式查询、代码生成器的可视化界面等功能,进一步提升了开发效率。
  5. 2019年:MyBatis-Plus发布了3.1版本,增加了更多的增强功能和改进,包括多数据源支持、全局拦截器等。
  6. 2020年:MyBatis-Plus发布了3.2版本,引入了更多的增强功能,如多租户数据隔离、性能优化等。
  7. 2021年:MyBatis-Plus发布了3.3版本,进一步完善了功能,并修复了一些bug。

截至目前,MyBatis-Plus已经成为了一个功能强大、稳定可靠的开发工具库,广泛应用于Java项目中,极大地简化了MyBatis的开发工作。它的持续发展得益于社区的贡献和活跃的维护。

更具体的可以看MyBatis-Plus官网更新日志:mybatis-plus/CHANGELOG.md at 3.0 · baomidou/mybatis-plus · GitHub

二、MyBatis-Plus入门案例🍭

1、新建项目🍉

image.png

只选择MySQL Driver(暂时不使用SpringWeb),MyBatis-Plus配置文件需要自己手动添加。


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

并且不再需要导入 mybatis和mybatis整合spring的jar包:

image.png

还有一个druid jar包:


<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

2、连接数据库🍉


# 配置数据库的连接字符串
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/ku2022?characterEncoding=utf8
    username: root
    password: "123456"
    driver-class-name: com.mysql.cj.jdbc.Driver

所使用的库中需要有与user实体类名字相同的表:

image.png

3、UserDao接口🍉

之前的Mapper需要写方法:


package com.example.ssmdemo1.mapper;
import com.example.ssmdemo1.entity.Userinfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper//需要添加 @Mapper 注解
public interface UserMapper {
    Userinfo getUserById(Integer id);
}

MyBatis-Plus之后:


package com.example.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.domain.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserDao extends BaseMapper<User> {
}

点进BaseMapper中去,可以看到它自带了非常多的方法:


//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.baomidou.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
public interface BaseMapper<T> extends Mapper<T> {
    int insert(T entity);
    int deleteById(Serializable id);
    int deleteByMap(@Param("cm") Map<String, Object> columnMap);
    int delete(@Param("ew") Wrapper<T> queryWrapper);
    int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    int updateById(@Param("et") T entity);
    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
    T selectById(Serializable id);
    List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
    T selectOne(@Param("ew") Wrapper<T> queryWrapper);
    Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
    List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
    List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
    <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}

就是这么简单,可以看到我什么都没写却仍然有很多方法可以使用:

image.png

4、单元测试🍉


package com.example.mybatisplus;
import com.example.dao.UserDao;
import com.example.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class MybatisPlusApplicationTests {
    @Autowired
    private UserDao userDao;
    @Test
    void textGetAll() {
        List<User> list=userDao.selectList(null);
        System.out.println(list);
    }
}

输出数据库中的两条数据:

image.png

从上面入门案例我们可以很清楚了解到MyBatisPlus的方便性

三、标准数据层CRUD制作🍭

下面这些方法差不多将我们日常的需求都给覆盖了,而在MybatisPlus中也都有对应的方法,只不过换了个名字而已。

功能 自定义接口 MP接口
新增 boolean save(T t) int insert(T t)
删除 boolean delete(int id) int deleteById(Serializable id)
修改 boolean update(T t) int updateById(T t)
根据id查询 getById(int id) T selectById(Serializable id)
查询全部 List getAll() List selectList()
分页查询 PageInfo getAll(int page,int size) IPage selectPage(IPage page)
按条件查询 List getAll(Condition condition) IPage selectPage(Wrapper<T〉 queryWrapper)

1、新增数据🍉


@Test
    void textSave(){
        User user=new User();
        user.setName("张三");
        user.setPassword("123456");
        user.setAge(19);
        user.setTel("123456789");
        userDao.insert(user);
    }

添加成功,只不过id是它给你指点的一个id,这样子是能够添加用户进去的。

image.png

2、删除数据🍉


@Test
    void testDelete(){
        userDao.deleteById(1694537075610619906L);
    }

王五的数据就被删除了

image.png

3、更新数据🍉


@Test
    void testUpdate(){
        User user=new User();
        user.setId(1L);
        user.setName("张三");
        userDao.updateById(user);
    }

将id为1的name更新为张三,但是我们可以发现其他没有赋值的数据都没有发生改变,不是为空

image.png

image.png

4、查找数据🍉

入门案例中的就是查找数据,这不过是全部查询出来,那能不能查询单个数据?


@Test
    void testSelect(){
        User user=userDao.selectById(1L);
        System.out.println(user);
    }

可以发现也是可以的:

image.png


相关文章
|
消息中间件 物联网 网络性能优化
MQTT常见问题之mqtt 连接一直显示 Not authorized to connect如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
9月前
|
缓存 JSON 算法
利用携程API获取地方美食列表数据
本文详解如何通过携程开放平台API获取指定区域的美食POI数据,涵盖认证授权、请求参数构建、响应解析及分页处理等核心流程,并探讨数据缓存、速率限制与合规使用等关键技术要点,助力旅游类应用高效集成高质量餐饮信息。
1898 0
|
6月前
|
人工智能 自然语言处理 算法
企业如何把智能客服系统用好?(2026年2月)
瓴羊Quick Service是阿里旗下新一代AI智能客服,深度融合大模型与业务场景,具备深度语义理解、动态知识图谱、情感感知、全渠道协同、对话数据分析及低代码配置六大能力,让客服真正“会思考、懂业务、有温度”,助力企业提升服务效能与客户价值。(239字)
|
数据采集 测试技术 API
小白必看!电商 API 开发避坑指南:签名错误、权限申请全解决
本文总结电商API开发常见问题与解决方案,涵盖京东、淘宝、拼多多的签名规则、权限申请、频率限制等核心踩坑点,结合实战案例,助你高效避坑,提升开发效率90%。
|
8月前
|
存储 缓存 安全
阿里云8核云服务器价格解析:详解8核16G、8核32G、8核64G收费标准与活动价格参考
阿里云8核CPU的云服务器多少钱?我们常用的云服务器一般是2核、4核、8核这几个类型,部分企业用户可能会选择16核32核等更高的配置。本文为大家解析阿里云8核云服务器的价格体系,涵盖8核16G、8核32G、8核64G三种主流配置的收费标准与当前活动价格,以供参考和选择。
1762 3
阿里云8核云服务器价格解析:详解8核16G、8核32G、8核64G收费标准与活动价格参考
|
JSON Java 数据格式
一文彻底搞懂 @RequestBody 和 @RequestParam 的区别(附实战示例)
本文深入解析Spring Boot中@RequestBody和@RequestParam的区别,通过实战示例详解两者在数据来源、格式、使用场景及验证处理上的差异,帮助开发者正确选择参数绑定方式,提升开发效率与系统安全性。
1687 0
mybatis-plus从3.1升级到3.4.2
mybatis-plus从3.1升级到3.4.2
596 0
|
存储 缓存 API
电商行业中 API 接口的常见问题和解决方法
本文探讨了电商行业中API接口的常见问题及解决方法。涵盖数据准确性(如数据不一致、数据缺失)、性能问题(如响应时间过长、吞吐量不足)、安全问题(如身份认证与授权、数据泄露风险)和兼容性问题(如接口版本兼容性、系统兼容性)。通过优化数据同步机制、缓存策略、网络配置、服务器负载均衡、代码逻辑,以及采用安全的身份认证方式和加密技术,结合实际代码示例,帮助开发者提升API接口的稳定性和安全性,确保电商业务顺利运行。
805 11
|
算法 Java 测试技术
mybatis-plus雪花算法生成Id使用详解
mybatis-plus雪花算法生成Id使用详解
6321 0
mybatis-plus雪花算法生成Id使用详解