发布于2026-05-26 阅读(0)
扫一扫,手机访问
说到Ja va后端的持久层框架,MyBatis凭借其灵活性和对SQL的掌控力,一直是许多开发者的心头好。但手动编写大量重复的CRUD代码,也确实是个体力活。这时候,MyBatis-Plus(简称MP)的出现,就恰到好处了。

简单来说,MyBatis-Plus是一个MyBatis的增强工具,它的核心理念是“只做增强,不做改变”。这意味着你可以在保留MyBatis所有特性的基础上,获得一系列开箱即用的便捷功能,目标直指简化开发、提升效率。
那么,MyBatis-Plus具体能带来哪些便利呢?主要有这么几个亮点:
光说不练假把式,下面我们通过一个Spring Boot整合MyBatis-Plus的完整流程,来看看它到底怎么用。
首先,在项目的pom.xml文件中引入必要的依赖。除了MyBatis-Plus的核心启动器,通常还需要数据库驱动、连接池以及Lombok来简化实体类。
com.baomidou mybatis-plus-boot-starter 3.5.2 mysql mysql-connector-ja va org.projectlombok lombok com.alibaba druid-spring-boot-starter 1.2.8
接着,在application.yml中配置数据源和MyBatis-Plus的相关属性。这里以Druid连接池和MySQL为例,并开启了SQL日志输出,方便调试。
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myschool?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
username: root
password: root
druid:
initial-size: 20
min-idle: 20
max-active: 100
max-wait: 10000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: true
test-on-return: false
mybatis-plus:
configuration:
# 开启下划线转驼峰命名映射
map-underscore-to-camel-case: true
# 控制台打印SQL日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-aliases-package: com.yzch.domain
mapper-locations: classpath:/mapper/*Mapper.xml
然后,创建对应的实体类。注意使用@TableName注解指定表名,并使用Lombok简化getter/setter。
package com.yzch.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import ja va.io.Serializable;
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName(value ="t_user")
public class TUser implements Serializable {
private static final long serialVersionUID = 1L;
private Integer userId;
@ExcelProperty("用户名")
private String userName;
@ExcelProperty("年龄")
private Integer userAge;
@ExcelProperty("性别")
private String userSex;
@ExcelProperty("收入")
private Integer userIncome;
@ExcelProperty("省份")
private String province;
@ExcelProperty("城市")
private String city;
@ExcelProperty("职业")
private String userOccupation;
@ExcelProperty("车")
private Integer userIsCar;
}
创建Mapper接口。关键一步是让它继承MyBatis-Plus提供的BaseMapper接口,并传入实体类泛型。这样,基本的CRUD方法就都有了。
package com.yzch.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.yzch.domain.TUser; import org.springframework.stereotype.Repository; @Repository public interface TUserMapper extends BaseMapper{ }
Service层同样有“捷径”。接口继承IService,实现类继承ServiceImpl并指定Mapper和实体类型。
// Service接口 package com.yzch.service; import com.baomidou.mybatisplus.extension.service.IService; import com.yzch.domain.TUser; public interface TUserService extends IService{ }
// Service实现类 package com.yzch.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yzch.domain.TUser; import com.yzch.mapper.TUserMapper; import com.yzch.service.TUserService; import org.springframework.stereotype.Service; @Service public class TUserServiceImpl extends ServiceImplimplements TUserService { }
至此,基础框架就搭建完成了。你可以立刻开始编写业务代码,而无需为单表的增删改查费神。
写个简单的测试方法,注入Service或Mapper,调用其提供的方法,比如查询所有数据,看看效果。
@Autowired
private TUserService tUserService;
@Autowired
private TUserMapper tUserMapper;
public void test(){
// 通过Service查询
List tUsers = tUserService.list();
// 通过Mapper查询
List tUsers1 = tUserMapper.selectList(null);
}
继承IService后,Service层会获得极其丰富的数据操作方法。这里列举一些最常用的,方便快速查阅:
// 新增相关 boolean sa ve(T entity); // 插入单条 boolean sa veBatch(CollectionentityList); // 批量插入 boolean sa veBatch(Collection entityList, int batchSize); // 批量插入(指定批次大小) boolean sa veOrUpdate(T entity); // 存在则更新,否则插入 boolean sa veOrUpdateBatch(Collection entityList); // 批量保存或更新 // 删除相关 boolean remove(Wrapper queryWrapper); // 按条件删除 boolean removeById(Serializable id); // 按ID删除 boolean removeByMap(Map columnMap); // 按Map条件删除 boolean removeByIds(Collection extends Serializable> idList); // 批量ID删除 // 更新相关 boolean update(Wrapper updateWrapper); // 按条件更新 boolean update(T updateEntity, Wrapper whereWrapper); // 按条件更新实体 boolean updateById(T entity); // 按ID更新 boolean updateBatchById(Collection entityList); // 批量ID更新 // 查询单条 T getById(Serializable id); // 按ID查询 T getOne(Wrapper queryWrapper); // 按条件查询一条 T getOne(Wrapper queryWrapper, boolean throwEx); // 查询一条,可控制多结果是否抛异常 Map getMap(Wrapper queryWrapper); // 查询一条为Map // 查询列表 List list(); // 查询所有 List list(Wrapper queryWrapper); // 按条件查询 List listByIds(Collection extends Serializable> idList); // 批量ID查询 List
Mapper层继承BaseMapper后,也拥有类似的基础方法。通常,我们会在单元测试中直接使用Mapper进行快速验证:
// 查询所有用户
@Test
void selectUsers(){
List list = userMapper.selectList(null);
list.forEach(System.out::print);
}
// 新增用户
@Test
void insertUser(){
User u1 = new User();
u1.setName("郭小嘉六号");
u1.setEmail("877224@qq.com");
u1.setAge(88);
int insert = userMapper.insert(u1);
System.out.println(insert);
}
// 根据ID更新用户
@Test
void updateUser(){
User u1 = new User();
u1.setId("100");
u1.setName("张三");
u1.setEmail("877224@qq.com");
u1.setAge(20);
userMapper.updateById(u1);
}
// 根据条件删除用户
@Test
void deleteUserById(){
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.eq("id", "100");
int delete = userMapper.delete(wrapper);
System.out.println(delete);
}
// 批量删除用户
@Test
void deleteBatchUser(){
Collection idList = Arrays.asList(1L, 2L, 3L);
int i = userMapper.deleteBatchIds(idList);
System.out.println(i);
}
对于复杂的SQL操作,MyBatis-Plus完全支持自定义。你只需要在Mapper接口中定义方法,并使用MyBatis的注解(如@Select)或XML文件编写SQL即可。
// 在TUserMapper接口中定义自定义方法
@Select("SELECT t1.*, t2.`address_name` FROM user t1 " +
"INNER JOIN address t2 ON t1.`id` = t2.`user_id`")
List selectUserAddress();
总的来说,MyBatis-Plus通过提供强大的通用CRUD接口和代码生成器,极大地提升了基于MyBatis的开发效率。它既保留了原生MyBatis的灵活性,又通过“约定大于配置”的方式,简化了大部分常规操作。对于快速构建中小型项目或者需要高效完成基础数据层开发的情况,它是一个非常值得考虑的增强工具。从导入依赖、配置、创建实体和Mapper,到使用丰富的内置方法,整个流程清晰而高效,能让开发者更专注于业务逻辑的实现。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8