当前位置: 首页 > article >正文

MyBatisPlus最实用教程

MybatisPlus教程

一、简介

1.介绍作用

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

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

任何能使用 MyBatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。

  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift
  • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库,优炫数据库,星瑞格数据库

二、入门案例

1.创建SpringBoot工程

​ --选取jdk1.8(现在spring创建不了低版本jdk,可以用17创建项目,但自己进去修改好jdk配置,当然也可以使用17,不过报错的话,可能要考虑用比较新的依赖配置信息了)

​ --maven项目

​ --勾选SQL里面的MySQL Driver 和 MyBatis Framework

2.建好数据库表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for personnel_info
-- ----------------------------
DROP DataBase IF EXISTS `personnel_system`;
CREATE DataBase `personnel_system`;

use personnel_system;


-- 清空元数据
truncate table personnel_info;


DROP TABLE IF EXISTS `personnel_info`;
CREATE TABLE `personnel_info`  (
  `personnelId` bigint(11) AUTO_INCREMENT NOT NULL AUTO_INCREMENT COMMENT '人员ID',
  `personnelName` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人员姓名',
  `personnelSex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人员性别',
  `personnelAge` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人员年龄',
  `personnelDepartment` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人员部门',
  `personnelState` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人员状态',
  `identityName` bigint(11) NOT NULL COMMENT '身份名称 外键引权限表',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`personnelId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of personnel_info
-- ----------------------------
INSERT INTO `personnel_info` (`personnelName`, `personnelSex`, `personnelAge`, `personnelDepartment`, `personnelState`, `identityName`, `remark`)
VALUES 
('张三', '男', '28', '销售部', '0', 1, '测试数据1'),
('李四', '女', '25', '人事部', '0', 2, '测试数据2'),
('王五', '女', '30', '财务部', '0', 3, '测试数据3'),
('赵六', '男', '33', '市场部', '1', 4, '测试数据4'),
('刘七', '女', '29', '技术部', '0', 5, '测试数据5'),
('周八', '男', '27', '采购部', '0', 6, '测试数据6'),
('孙九', '女', '26', '行政部', '0', 7, '测试数据7'),
('钱十', '男', '31', '运营部', '0', 8, '测试数据8'),
('吴十一', '女', '32', '研发部', '0', 9, '测试数据9'),
('郑十二', '男', '24', '售后部', '0', 10, '测试数据10');
SET FOREIGN_KEY_CHECKS = 1;



-- 创建department_info表
CREATE TABLE IF NOT EXISTS `department_info` (
  `departmentId` bigint(11) AUTO_INCREMENT  NOT NULL AUTO_INCREMENT COMMENT '部门编号',
  `departmentName` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '部门名称',
  `departmentLocation` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '部门位置',
  `departmentPhone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '联系电话',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`departmentId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部门信息表' ROW_FORMAT = Dynamic;

-- 向department_info表中插入10条测试数据
INSERT INTO `department_info` (`departmentName`, `departmentLocation`, `departmentPhone`, `remark`)
VALUES 
('销售部', 'A楼5层', '123456789', '测试数据1'),
('人事部', 'B楼3层', '987654321', '测试数据2'),
('财务部', 'C楼2层', '111222333', '测试数据3'),
('市场部', 'D楼6层', '444555666', '测试数据4'),
('技术部', 'E楼8层', '777888999', '测试数据5'),
('采购部', 'F楼1层', '000111222', '测试数据6'),
('行政部', 'G楼4层', '333444555', '测试数据7'),
('运营部', 'H楼9层', '666777888', '测试数据8'),
('研发部', 'I楼7层', '999000111', '测试数据9'),
('售后部', 'J楼10层', '222333444', '测试数据10');
SET FOREIGN_KEY_CHECKS = 1;


-- 创建privilege表
CREATE TABLE IF NOT EXISTS `privilege`  (
  `identityId` bigint(11) AUTO_INCREMENT  NOT NULL COMMENT '身份ID',
  `identityName` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '身份名称',
  PRIMARY KEY (`identityId`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- 向privilege表中插入10条测试数据
INSERT INTO `privilege` (`identityId`, `identityName`)
VALUES 
(1, '管理员'),
(2, '普通员工'),
(3, '财务人员'),
(4, '市场人员'),
(5, '技术人员'),
(6, '采购人员'),
(7, '行政人员'),
(8, '运营人员'),
(9, '研发人员'),
(10, '售后人员');
SET FOREIGN_KEY_CHECKS = 1;
3.配置依赖信息
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.bdqn</groupId>
    <artifactId>MyBatis-Plus-Demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
            <scope>runtime</scope>
        </dependency>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

4.配置项目文件

​ --application.yml文件

#------------------------------------------------
spring:
  datasource:
    #配置数据池类型
    type: com.alibaba.druid.pool.DruidDataSource

    #数据库的连接信息,这里我mysql是8.0.33
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/personnel_system?serverTimezone=UTC
    username: root
    password: lwl1234
  main:
    #关闭Spring的打印标志信息
    banner-mode: off

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

    #关闭MyBatisPlus的打印标志信息
    banner: false

    #配置id自动增长规则
    db-config:
      id-type: assign_id

#------------------------------------------------

5.创建实体类
import lombok.Data;

@Data
@TableName("department_info") //指定数据库表名
public class DepartmentInfo {
    @TableId("departmentId") //指定该属性对应的主键字段,而且在配置文件配置了自动增长 id-type
    private Long departmentId;
    @TableField("departmentName") //指定属性对应的数据库字段
    private String departmentName;
    @TableField("departmentLocation")
    private String departmentLocation;
    @TableField("departmentPhone")
    private String departmentPhone;
    @TableField("remark")
    private String remark;
}

//-------------------------------------------------

import lombok.Data;

@Data
@TableName("personnel_info")
public class PersonnelInfo {
    @TableId("personnelId") //配置文件配置了自动增长 id-type
    private Long personnelId;
    @TableField("personnelName")
    private String personnelName;
    @TableField("personnelSex")
    private String personnelSex;
    @TableField("personnelAge")
    private String personnelAge;
    @TableField("personnelDepartment")
    private String personnelDepartment;
    @TableField("personnelState")
    private String personnelState;
    @TableField("identityName")
    private Long identityName;
    @TableField("remark")
    private String remark;
}


//-------------------------------------------------

import lombok.Data;

@Data
@TableName("privilege")
public class Privilege {
    @TableId("identityId") //配置文件配置了自动增长 id-type
    private Long identityId;
    @TableField("identityName")
    private String identityName;
}
6.创建Mapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Mapper
public interface DepartmentInfoMapper extends BaseMapper<DepartmentInfo> {
    // 此处可以自定义部门信息的数据库操作方法
}

//-------------------------------------------------

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Mapper
public interface PersonnelInfoMapper extends BaseMapper<PersonnelInfo> {
    // 此处可以自定义人员信息的数据库操作方法
}

//-------------------------------------------------

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@Mapper
public interface PrivilegeMapper extends BaseMapper<Privilege> {
    // 此处可以自定义权限信息的数据库操作方法
}
7.测试代码
@SpringBootTest
class MybaitPlusDemo1ApplicationTests {

	//注入指定接口
    @Resource(type = PrivilegeMapper.class)
    private PrivilegeMapper privilege;
    
    @Test
    void contextLoads() {
        //调用继承的 BaseMapper<>类的方法
        List<Privilege> list = privilege.selectList(null);
        list.forEach(s-> System.out.println(s));
    }

}
8.说明信息

​ --环境IDEA2023.2.6

​ --JDK1.8

​ --maven3.6.1 jdk配置1.8 编译版本配置8

​ --依赖直接整个用我的,不然有时候容易出现依赖冲突

三、详细使用

1.标准CRUD使用
–新增语法
//常用语法
int insert(T entity);
–删除语法
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);

// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 ID 删除
int deleteById(Serializable id);
–修改语法
// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);

// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
–查询语法
// 根据 ID 查询
T selectById(Serializable id); 

// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 entity 条件,查询全部记录
//@Param(Constants.WRAPPER)指定只能放WRAPPER类型的子类对象或本类
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

//(这个一般用在映射时,无法映射到实体中时的查询)
//案例:聚合函数查询的列是个数值,而实体类中没有对应属性名接收
===查询语句:'SELECT count(1),personnelState FROM personnel_info GROUP BY personnelState'===
===查询结果:'[{count(1)=9, personnelState=0}, {count(1)=1, personnelState=1}]'===
//这样我们使用Map<String,Object>时,就可以将列名装入String作为key值,查询内容作为value值
//查询出来的样子是[{key = value},{key = value}]
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
2.使用案例
–新增案例
@SpringBootTest
class MybaitPlusDemo1ApplicationTests {

	//注入指定接口
    @Resource(type = PrivilegeMapper.class)
    private PrivilegeMapper privilege;
    
    @Test
    void contextLoads1() {
        Privilege p = new Privilege();
        /*p.setIdentityId();*/
        p.setIdentityName("测试数据1");
        privilege.insert(p);

    }

}
–删除案例
@SpringBootTest
class MybaitPlusDemo1ApplicationTests {

	//注入指定接口
    @Resource(type = PrivilegeMapper.class)
    private PrivilegeMapper privilege;
    
    @Test
    void contextLoads1() {
        Privilege p = new Privilege();
        /*p.setIdentityId();*/
        p.setIdentityName("测试数据1");
        privilege.insert(p);

    }

}
–修改案例
@SpringBootTest
class MybaitPlusDemo1ApplicationTests {

	//注入指定接口
    @Resource(type = PrivilegeMapper.class)
    private PrivilegeMapper privilege;
    
    @Test
    void contextLoads2() {
        //根据id修改 ,新增的12条数据为 “小艾同学2”
        Privilege p1 = new Privilege();
        p1.setIdentityId(12L);
        p1.setIdentityName("小艾同学");
        //根据id更新
        privilege.updateById(p1);


        //根据where条件修改 ,新增的11条数据为 “小AI同学2”
        Privilege p2 = new Privilege();
        /*p.setIdentityId(12L);*/
        p2.setIdentityName("小AI同学2");

        LambdaUpdateWrapper<Privilege> luw = new LambdaUpdateWrapper<>();
        luw.eq(Privilege::getIdentityId,11L);
        privilege.update(p2,luw);
    }

}

–查询语句
@SpringBootTest
class MybaitPlusDemo1ApplicationTests {

	//注入指定接口
    @Resource(type = PrivilegeMapper.class)
    private PrivilegeMapper privilege;
    
    /**
     * @return
     * @desc:查询案例使用
     * @param:
     */
    @Test
    void contextLoads3() {
        // 根据 ID 查询
        //T selectById(Serializable id);
        Privilege privilege1 = privilege.selectById(12);
        System.out.println("根据 ID 查询:" + privilege1);

        // 根据 entity 条件,查询一条记录
        //T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
        LambdaQueryWrapper<Privilege> wa = new LambdaQueryWrapper<>();
        wa.lt(Privilege::getIdentityId, 2);// 查询值必须只能一个,否则报错
        Privilege privilege2 = privilege.selectOne(wa);
        System.out.println("根据 entity 条件,查询一条记录" + privilege2);

        // 查询(根据ID 批量查询)
        //List<T> selectBatchIds (@Param(Constants.COLLECTION) Collection < ? extends Serializable > idList);
        List<Integer> ids = new ArrayList<>();
        ids.add(1);
        ids.add(2);
        ids.add(3);
        ids.add(4);
        List<Privilege> arrList = privilege.selectBatchIds(ids);
        arrList.forEach(s-> System.out.println("查询(根据ID 批量查询):"+s));


        // 根据 entity 条件,查询全部记录
        //List<T> selectList (@Param(Constants.WRAPPER) Wrapper < T > queryWrapper);
        LambdaQueryWrapper<Privilege> lqw = new LambdaQueryWrapper<>();
        lqw.select(Privilege::getIdentityName);//设置展示列,或者内容
        lqw.gt(Privilege::getIdentityId,4);//条件判断
        List<Privilege> privilegesList = privilege.selectList(lqw);
        System.out.println("根据 entity 条件,查询全部记录:"+privilegesList);



        //(这个一般用在映射时,无法映射到实体中时的查询)
        //案例:聚合函数查询的列是个数值,而实体类中没有对应属性名接收
        //===查询语句:'SELECT count(1),personnelState FROM personnel_info GROUP BY personnelState' == =
        //===查询结果:'[{count(1)=9, personnelState=0}, {count(1)=1, personnelState=1}]' == =
        //这样我们使用Map<String,Object>时,就可以将列名装入String作为key值,查询内容作为value值
        //查询出来的样子是[{key = value},{key = value}]
        // 根据 Wrapper 条件,查询全部记录
        //List<Map<String, Object>> selectMaps (@Param(Constants.WRAPPER) Wrapper < T > queryWrapper);

        // 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
        //List<Object> selectObjs (@Param(Constants.WRAPPER) Wrapper < T > queryWrapper);

        // 根据 entity 条件,查询全部记录(并翻页)
        //IPage<T> selectPage (IPage < T > page, @Param(Constants.WRAPPER) Wrapper < T > queryWrapper);

        // 根据 Wrapper 条件,查询全部记录(并翻页)
        //IPage<Map<String, Object>> selectMapsPage
        //(IPage < T > page, @Param(Constants.WRAPPER) Wrapper < T > queryWrapper);

        // 根据 Wrapper 条件,查询总记录数
        //Integer selectCount (@Param(Constants.WRAPPER) Wrapper < T > queryWrapper);

    }

}

http://www.kler.cn/news/273438.html

相关文章:

  • Tomcat(二)
  • 机器学习_聚类(k-means)
  • Bash Shell中双引号中的感叹号问题详解
  • 基于Spring Boot的社区垃圾分类管理平台的设计与实现
  • RediSearch比Es搜索还快的搜索引擎
  • Java实现定时发送邮件(基于Springboot工程)
  • 【NLP9-Transformer经典案例】
  • 放慢音频速度的三个方法 享受慢音乐
  • 【数据挖掘】实验3:常用的数据管理
  • 【Docker】常用命令 docker build
  • 还原wps纯粹的编辑功能
  • VSCode下使用github初步
  • java的成员变量和局部变量
  • 前端面试拼图-实践经验
  • 基础:TCP三次握手做了什么,为什么要握手?
  • 【DataWhale学习笔记-蝴蝶书共读】大语言模型背后
  • CTF题型 Http请求走私总结Burp靶场例题
  • EI Scopus检索 | 第二届大数据、物联网与云计算国际会议(ICBICC 2024) |
  • 苍穹外卖-day09:用户端历史订单模块(理解业务逻辑),商家端订单管理模块(理解业务逻辑),校验收货地址是否超出配送范围(相关API)
  • springboot280基于WEB的旅游推荐系统设计与实现