在前面的文章中荔枝梳理了MyBatis及相关的操作,作为MyBatis的增强工具,MyBatis-Plus无需再在xml中写sql语句,在这篇文章中荔枝将梳理MyBatis-Plus的基础知识并基于SpringBoot梳理MyBatis-Plus给出的两个接口:BaseMapper和IServer。希望对有需要的小伙伴有帮助。
前言
一、基本概念
1.1 特性
1.2 支持数据库
1.3 结构
二、SpringBoot整合MP简单使用
2.1 基础环境配置
2.2 简单测试
2.3 自定义功能
三、通用Service
3.1 批量添加功能
3.2 常用注解
@TableName
@TableId
@TableField
@TableLogic 逻辑删除
3.3 雪花算法
总结
MyBatis-PIus简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus提供了通用的mapper和service,可以在不编写任何SQL语句的情况下,快速的实现对单表的CRUD、批量、逻辑删除、分页等操作。MyBatis-Plus官方是这么描述的:我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。说白了,MP只是作为MyBatis开发中的一种增强工具,提高开发效率。
任何能使用MyBatis进行 CRUD, 并且支持标准 SQL 的数据库都可以使用MyBatis-Plus。
MyBatis-Plus实现功能是从扫描实体类开始,通过反射提取实体类中的属性并分析实体类属性和数据库表中对应字段之间的关系,并根据当前调用的方法生成相对应的SQL语句,再把生成的SQL语句注入到MyBatis容器中。
pom.xml
这里mysql版本使用是SpringBoot的内置版本,SpringBoot版本这里使用的是3.1.3。
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.1.3
com.crj
mybatisplus
0.0.1-SNAPSHOT
mybatisplus
mybatisplus
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
com.baomidou
mybatis-plus-boot-starter
3.5.1
org.projectlombok
lombok
true
com.mysql
mysql-connector-j
runtime
org.springframework.boot
spring-boot-maven-plugin
配置数据库连接信息,在SpringBoot中一般配置文件是通过application.xml或application.properties来配置数据源信息
application.xml
spring:
# 配置数据源信息
datasource:
#配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
#配置连接数据库的各个信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false
username: root
password: 123456
#配置日志功能
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
这里的mapper-location默认是在resource下的mapper目录下,如果不进行配置就必须按照要求存放mapper配置文件。
UserMapper.java
package com.crj.mybatisplus_test.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.crj.mybatisplus_test.pojo.User;
import org.springframework.stereotype.Repository;
@Repository
//继承MyBatis-Plus的BaseMapper接口
public interface UserMapper extends BaseMapper {
}
测试类
package com.crj.mybatisplus_test;
import com.crj.mybatisplus_test.mapper.UserMapper;
import com.crj.mybatisplus_test.pojo.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
public class MyBatisPlusTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect(){
//通过MyBatis提供的一个条件构造器查询一个list集合,若没有条件则可以设置为null
List list = userMapper.selectList(null);
list.forEach(System.out::println);
}
}
在主入口中开启mapper扫描功能
package com.crj.mybatisplus_test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//用来扫描指定包下的mapper接口
@MapperScan("com.crj.mybatisplus_test.mapper")
public class MyBatisPlusTestApplication {
public static void main(String[] args) {
SpringApplication.run(MyBatisPlusTestApplication.class, args);
}
}
BaseMapper是MyBati-Plus中提供的一个接口,通过继承该接口得到相应条件构造器,提供了大量操作数据库的方法。
MyBatis-Plus作为MyBatis的一个增强工具,除了其提供的操作数据库的方法之外,还允许我们自定义SQL操作,即允许我们使用MyBatis的方式来自定义操作数据库。
package com.crj.mybatisplus_test.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.crj.mybatisplus_test.pojo.User;
import org.springframework.stereotype.Repository;
import java.util.Map;
import java.util.Objects;
@Repository
//继承MyBatis-Plus的BaseMapper接口
public interface UserMapper extends BaseMapper {
Map selectMapById(Long id);
}
package com.crj.mybatisplus_test;
import com.crj.mybatisplus_test.mapper.UserMapper;
import com.crj.mybatisplus_test.pojo.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;
import java.util.Map;
import java.util.Objects;
@SpringBootTest
public class MyBatisPlusTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect(){
Map map = userMapper.selectMapById(1L);
System.out.println(map);
}
}
前面我们通过继承BaseMapper接口来使用MyBatis-Plus进而操作数据,但是我们查看insert会发现没有批量添加的功能,对此其实MyBatis-Plus提供了另一个API接口给我们使用 —— IService。通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行、remove 删除、list 查询集合、page 分页,前缀命名方式区分 Mapper 层避免混淆。
继承IService接口
package com.crj.mybatisplus_test.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.crj.mybatisplus_test.pojo.User;
import org.springframework.stereotype.Service;
@Service
public interface UserService extends IService {
}
自定义接口实现
package com.crj.mybatisplus_test.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.crj.mybatisplus_test.mapper.UserMapper;
import com.crj.mybatisplus_test.pojo.User;
import com.crj.mybatisplus_test.service.UserService;
public class UserServerImpl extends ServiceImpl implements UserService {
}
测试类
package com.crj.mybatisplus_test;
import com.crj.mybatisplus_test.pojo.User;
import com.crj.mybatisplus_test.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class MyBatisPlusServiceTest {
@Autowired
private UserService userService;
@Test
public void testInsertAll(){
List list = new ArrayList<>();
for (int i = 1;i<10;i++){
User user = new User();
user.setName("lzddl"+i);
list.add(user);
}
userService.saveBatch(list);
}
}
当实体类和数据库表中的表名不一致时,可以通过该注解来指定该实体类映射的数据库表的名字
package com.crj.mybatisplus_test.pojo;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
//使用Lombok简化开发加上无参构造方法、有参构造
@Data
@TableName("t_user")
public class User {
private Long id;
private String name;
private String age;
private String email;
}
当然了,解决该需求还可以通过全局配置的方式来实现,table-prefix可以用来设置实体类所对应表的统一前缀。
#配置日志功能
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
table-prefix: t_
该注解可以将属性所对应的字段设置为主键,从而在MyBatis-Plus中默认使用雪花算法来自动生成赋值。
value属性
而当属性名和字段名无法对应,我们应该在TableId中通过设置value属性值来添加映射关系。比如当数据表中的字段是uid,而属性设置为id时,我们就可以借助该注解来实现映射关系。
@TableId("uid")
private Long id;
type属性
@TableId(value = "uid",type = IdType.AUTO)
private Long id;
属性值(主键生成策略):
主键生成策略的全局配置
@TableField可以用来指定属性所对应的字段名,和@TableId的区别是@TableId指定的是和属性名不一致主键字段,而@TableField指定的是与实体类属性名不一致的普通字段。
@TableLogic
private Integer isDeleted;
当使用了逻辑删除之后,不会直接删除,而是变成一个修改的操作,将当前注解的字段由0变成1,标记的是删除状态。
雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性,比较适合用在分布式架构里面。
核心思想:
优点:
整体上按照时间自增排序,在整个分布式系统中不会产生ID碰撞。
简单了解了MyBatis-Plus的两个接口和基本环境搭建和使用,在接下来的文章中荔枝将会继续梳理有关接口和条件构造器的内容,继续输出~~~
今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~