一,初始 MyBatis-Plus
@
目次
1. MyBatis-Plus 的概述
学习 MyBatis -Plus 之前,我们可以先来简单的,轻微的,回顾一下,MyBatis 框架的一些问题:
这里只是简单的回顾,关于MyBatis 的更多具体内容各人可以移步至:✏️✏️✏️ MyBatis_ChinaRainbowSea的博客-CSDN博客
我们来简单思考一下,MyBatis 框架的开发效率怎么样?
开发效率也就是我们使用这款框架开发的速度快不快,是否简单好用易上手。从这个角度思考,每当我们需要编写一个SQL需求的时间,我们需要做几步:
- Mapper 接口提供一个抽象方法。
- Mapper 接口对应的映射设置文件提供对应的标签和SQL语句
- 在 Service 中依赖 Mapper 实例对象
- 调用 Mapper 实例中的方法
- 在Controller 中依赖 Service 实例对象
- 调用 Service 实例中的方法
通过上面的发现,对于一个SQL需求,无论是单表照旧多表,我们是需要完成如上几步,才气实现SQL需求的开发。
但是在开发中,有一些操纵是通过逻辑,这些通用逻辑是可以被简化的,比方:
- 对于 dao ,是否可以由框架帮我们提供好单表的 Mapper 抽象方法,和对应的SQL实现,不需要程序员去实现这些。
- 对于 service,使用可以有框架直接帮我们提供好一些 serivce 的抽象方法,和对应的实现,不需要程序员去实现这些。
- 一些别的的企业开发中所需要的操纵
分析到这里我们发现,其实核心框架并没有发生变化,依赖照旧 Mybatis,只不外我们希望对于 MyBatis 进行一些封装和优化,让他更加的好用,更加的易用。
以是:MyBatis Plus 它就来了,它是 MyBatis 的一款增强工具。
MybatisPlus,从名称上来看,我们就发现,他和Mybatis长得很像,其实MybatisPlus就是Mybatis的孪生兄弟。学习MyBatis-Plus 首先,我们来看看它的官网地点是:https://baomidou.com/
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
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 的框架结构:
什么是Mybatis框架呢,他是一个持久层框架,目的是简化持久层的开发。在这里我们就使用springboot整合Mybatis,实现Mybatis框架的搭建。
特别说明:这里这个是 IDEA 2021 创建项目的操纵步调:
我们首先创建一个空的工程
工程名称是mp
创建springboot模块
这里我们选择springboot2.7.8的版本,并不勾选依赖,随后通过pom.xml手动添加
特别说明:下面这个是:IDEA 2024 的操纵设置
2. 入门设置第一个 MyBatis-Plus 案例
第一步: 创建数据库 mybatisplus
这些测试表,是来自于 MyBatis-Plus 官网教学的内容,各人也可以移步去看看:✏️✏️✏️ https://baomidou.com/getting-started/
现有一张 User 表,其表结构如下:
idnameageemail1Jone18test1@baomidou.com2Jack20test2@baomidou.com3Tom28test3@baomidou.com4Sandy21test4@baomidou.com5Billie24test5@baomidou.com其对应的数据库 Schema 脚本如下:- DROP TABLE IF EXISTS `user`;
- CREATE TABLE `user`
- (
- id BIGINT NOT NULL COMMENT '主键ID',
- name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
- age INT NULL DEFAULT NULL COMMENT '年龄',
- email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
- PRIMARY KEY (id)
- );
复制代码 其对应的数据库 Data 脚本如下:- DELETE FROM `user`;
- INSERT INTO `user` (id, name, age, email) VALUES
- (1, 'Jone', 18, 'test1@baomidou.com'),
- (2, 'Jack', 20, 'test2@baomidou.com'),
- (3, 'Tom', 28, 'test3@baomidou.com'),
- (4, 'Sandy', 21, 'test4@baomidou.com'),
- (5, 'Billie', 24, 'test5@baomidou.com');
复制代码
第二步: 引入相关依赖,在 pom.xml 文件当中设置我们所需要的 jar 依赖。
特别说明:这里我们,将 Spring boot 改为:2.5.3 版本的。
在:MyBatis-Plus 当中是包含了MyBatis 的依赖的。以是,引入了 MyBatis-Plus 也就引入了MyBatis了。
第三步: 编写该项目/模块的场景启动器:
第四步: 根据数据表创建对应的实体类:
- package com.rainbowsea.bean;
- import lombok.AllArgsConstructor;
- import lombok.Data;
- import lombok.NoArgsConstructor;
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public class User {
- private Long id;
- private String name;
- private Integer age;
- private String email;
- }
复制代码 第五步: 切换数据库连接池为 Druid 。这里我们编写设置类的方式,切换数据库连接池。
- 在 resoucre 类路径下,创建名为 applicaiton.yaml 的设置文件,其中编写连接数据库的设置信息。
- spring:
- datasource:
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
- username: root
- password: MySQL123
复制代码- package com.rainbowsea.config;
- import com.alibaba.druid.pool.DruidDataSource;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import javax.sql.DataSource;
- /**
- * 配置切换,Druid 数据库连接池
- */
- @Configuration // 标志配置类
- public class DruidDataSourceConfig {
- @Bean // 被 Spring ioc 容器管理起来
- @ConfigurationProperties(value = "spring.datasource")
- public DataSource getDataSource() {
- DruidDataSource druidDataSource = new DruidDataSource();
- return druidDataSource;
- }
- }
复制代码特别说明:关于spring boot 中切换数据库连接池的具体内容,各人可以移步至:✏️✏️✏️ 十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能-CSDN博客
测试:看看我们是否成功切换为了 Druid 数据库连接池。
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Resource
- private JdbcTemplate jdbcTemplate;
- @Test
- void contextLoads() {
- System.out.println(jdbcTemplate.getDataSource().getClass());
- }
- }
复制代码
第六步: 背面的都是对应 MyBatis-Plus 的内容上的重点内容。
编写 Mapper接口
- package com.rainbowsea.mapper;
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.rainbowsea.bean.User;
- import org.apache.ibatis.annotations.Mapper;
- @Mapper // 被Spring Boot 扫描到
- public interface UserMapper extends BaseMapper<User> {
- }
复制代码
我们的自己编写的 Mapper 接口 extends(继续) BaseMapper 接口就会拥有了其该接口下的方法。
第七步: 编写 Service 接口
- package com.rainbowsea.service;
- import com.baomidou.mybatisplus.extension.service.IService;
- import com.rainbowsea.bean.User;
- import java.util.List;
- public interface UserService extends IService<User> {
- // 当 IService 当中提供的方法,不能满足我们的业务需要的时候,
- // 我们可以自定义方法。
- // 自定义的方法
- List<User> selectAll();
- }
复制代码
第八步: 编写ServiceImpl
- package com.rainbowsea.service.Impl;
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import javax.annotation.Resource;
- import java.util.Collections;
- import java.util.List;
- @Service
- public class UserServiceImpl extends ServiceImpl<UserMapper,User>
- implements UserService {
- //@Resource
- @Autowired // 自动装配
- private UserMapper userMapper;
- // 对自定义方法的,重写实现
- @Override
- public List<User> selectAll() {
- return userMapper.selectList(null);
- }
- }
复制代码
它们之间的关系结构如下:
第九步:编写Controller 控制器:
- package com.rainbowsea.controller;
- import com.rainbowsea.bean.User;
- import com.rainbowsea.service.UserService;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
- import javax.annotation.Resource;
- import java.util.List;
- @RestController
- public class UserController {
- @Resource
- private UserService userService;
- @GetMapping(value = {"/selectList"})
- public List<User> selectList() {
- return userService.selectAll();
- }
- }
复制代码 第十一步 :打开浏览器运行测试。
3. 补充说明:
3.1 通用 Mapper 接口先容
有关于 Mapper 接口,之前我们已经看到了,我们自己编写的Mapper接口继续 自己 BaseMapper 接口,由 BaseMapper 接口提供了很多单表的增删改查 相关的操纵方法,在入门案例种,我们测试了查询所有的操纵。我们先容一些简单的Mapper 接口中的方法,主要是感觉一下。Mapper接口中对于单表的增删改查的操纵都有涉及,更加高级的一些操纵。
3.1.1 Mapper 接口的 “增删改查”
3.1.1.1 查询所有记录
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Resource
- private UserMapper userMapper;
- // 查询所有
- @Test
- void selectList() {
- List<User> users = userMapper.selectList(null);
- for (User user : users) {
- System.out.println(user);
- }
- }
- }
复制代码 3.1.1.2 插入一条数据
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Resource
- private UserMapper userMapper;
- // 简单添加
- @Test
- void insert() {
- User user = new User();
- user.setId(6L);
- user.setAge(18);
- user.setName("Lihua");
- user.setEmail("test6@baomidou.com");
- userMapper.insert(user);
- }
- }
复制代码 3.1.1.3 删除一条数据
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Resource
- private UserMapper userMapper;
- // 简单删除
- @Test
- void deleteOne() {
- userMapper.deleteById(4L);
- }
- }
复制代码 3.1.1.4 更新一条数据
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Resource
- private UserMapper userMapper;
- // 简单更新
- @Test
- void updateById() {
- User user = new User();
- user.setId(2L);
- user.setAge(18);
- user.setName("李华");
- user.setEmail("lihua@baomidou.com");
- userMapper.updateById(user);
- }
- }
复制代码 3.1.1.5 查询一条数据
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Resource
- private UserMapper userMapper;
- // 简单查询
- @Test
- void selectById() {
- User user = userMapper.selectById(6L);
- System.out.println(user);
- }
- }
复制代码 3.2 通用 service接口先容
除了Mapper接口,MybatisPlus还提供了IService接口和对应的实现类ServiceImpl,该实现类已经提供好了一些对应的Service相关的方法,在某些场景下,我们可以直接使用ServiceImpl提供的方法,实现对应的功能。
IService接口
IService接口中包含了service相关的一些增删改查方法
ServiceImpl实现类
ServiceImpl实现类提供了service相关的增删改查方法的实现
UserService接口继续自IService接口
UserServiceImpl类继续ServiceImpl
注入UserService对象,测试相关方法
3.2.1 Service 接口的“增删改查”
3.2.1.1 添加一条记录
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Autowired
- private UserService userService;
-
- // UserService 添加
- @Test
- void insertService() {
- User user = new User();
- user.setId(7L);
- user.setAge(18);
- user.setName("Tom");
- user.setEmail("Tom@baomidou.com");
- userService.save(user);
- }
- }
复制代码 3.2.1.2 删除一条记录
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Autowired
- private UserService userService;
- // UserService 删除
- @Test
- void deleteServie() {
- userService.removeById(2L);
- }
- }
复制代码 3.2.1.3 修改一条记录
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Autowired
- private UserService userService;
- // userService 修改
- @Test
- void updateService() {
- User user = new User();
- user.setId(3L);
- user.setAge(22);
- userService.updateById(user);
- }
- }
复制代码 3.2.1.4 查询一条记录
- import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Autowired
- private UserService userService;
- // UserService 查询
- @Test
- void selectService() {
- List<User> users = userService.selectAll();
- for (User user : users) {
- System.out.println(user);
- }
- }
- }
复制代码 3.3 自界说方法
MybatisPlus除了给我们提供了这些丰富的接口方法以外,对于我们自己的需求,也可以编写自界说的接口方法,我们通过自己编写SQL语句的形式,实现想要的SQL需求
3.3.1 自界说Mapper接口方法
Mapper接口中提供抽象方法
- package com.rainbowsea.mapper;
- import com.baomidou.mybatisplus.core.mapper.BaseMapper;
- import com.rainbowsea.bean.User;
- import org.apache.ibatis.annotations.Mapper;
- @Mapper // 被Spring Boot 扫描到
- public interface UserMapper extends BaseMapper<User> {
- // 自定义方法
- User selectByName(String name);
- }
复制代码 提供映射设置文件,提供对应的SQL语句
注意:对应的映射的 SQL 设置文件的路径/包要同等,以及名称也要同等,才行。
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper
- PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="com.rainbowsea.mapper.UserMapper" >
- <select id="selectByName" resultType="com.rainbowsea.bean.User" parameterType="string">
- select id,age,name,email
- from user
- where name = #{value}
- </select>
- </mapper>
复制代码 测试自界说的Mapper接口方法
 - import com.rainbowsea.bean.User;
- import com.rainbowsea.mapper.UserMapper;
- import com.rainbowsea.service.UserService;
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.jdbc.core.JdbcTemplate;
- import javax.annotation.Resource;
- import java.util.List;
- @SpringBootTest(classes = Mp02Application.class) // Spring Boot 当中的测试,必须要有 项目的启动场景,不然无法测试报错
- class Mp02ApplicationTests {
- @Resource
- private UserMapper userMapper;
- // 测试自定义方法
- @Test
- void myMethod() {
- User tom = userMapper.selectByName("Lihua");
- System.out.println(tom);
- }
- }
复制代码 4. 总结:
6. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上罗致了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |