作为一名长期奋战在Java开发一线的老码农,我深知传统MyBatis在单表CRUD操作中的繁琐。今天要介绍的MyBatisPlus(简称MP)正是解决这一痛点的利器。它作为MyBatis的增强工具,在保持MyBatis灵活性的同时,大幅简化了单表操作代码量。根据我的项目经验,使用MP后单表操作代码量能减少70%以上。
MP的核心价值在于:
适合人群:
在SpringBoot项目中引入MP非常简单,但有几个细节需要注意:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
重要提示:不要同时引入mybatis和mybatis-plus的starter,这会导致冲突。MP的starter已经包含了MyBatis核心依赖。
建议配合Lombok使用,可以进一步简化实体类代码:
xml复制<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
虽然MP可以零配置运行,但我建议至少配置以下两项:
yaml复制mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志
global-config:
db-config:
id-type: assign_id # 使用雪花算法生成ID
实体类定义遵循MP的默认约定可以极大简化配置:
java复制@Data // Lombok注解
public class User {
private Long id;
private String username;
private String password;
private String phone;
private Integer balance;
private String info; // JSON格式的扩展信息
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
Mapper接口只需继承BaseMapper即可获得全套CRUD方法:
java复制public interface UserMapper extends BaseMapper<User> {
// 无需任何方法声明
}
以下是经过实战检验的完整测试用例:
java复制@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void testInsert() {
User user = new User();
user.setUsername("Lucy");
user.setPassword("123");
user.setPhone("18688990011");
user.setBalance(200);
user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
int rows = userMapper.insert(user); // 返回影响行数
Assertions.assertEquals(1, rows);
}
@Test
void testSelectById() {
User user = userMapper.selectById(5L);
System.out.println(user);
Assertions.assertNotNull(user);
}
@Test
void testBatchSelect() {
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
Assertions.assertEquals(3, users.size());
}
@Test
void testUpdate() {
User user = new User();
user.setId(5L);
user.setBalance(20000);
int rows = userMapper.updateById(user);
Assertions.assertEquals(1, rows);
}
@Test
void testDelete() {
int rows = userMapper.deleteById(5L);
Assertions.assertEquals(1, rows);
}
}
当数据库表与实体类不匹配时,MP提供了强大的注解支持:
java复制@TableName("sys_user") // 指定表名
@Data
public class User {
@TableId(type = IdType.AUTO) // 自增主键
private Long userId;
@TableField("user_name") // 字段映射
private String username;
@TableField(exist = false) // 非数据库字段
private String tempData;
}
对于企业级应用,我推荐这些配置:
yaml复制mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml # XML映射文件位置
type-aliases-package: com.example.entity # 实体类包别名
configuration:
map-underscore-to-camel-case: true # 自动驼峰转换
cache-enabled: false # 关闭二级缓存
症状:报错提示表不存在
解决方案:
症状:主键重复错误
解决方案:
症状:查询结果字段为null
解决方案:
经过多个项目实践,我总结出这些优化经验:
java复制List<User> userList = ...;
userMapper.insertBatchSomeColumn(userList); // 批量插入
java复制QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "username");
userMapper.selectList(wrapper);
java复制LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
wrapper.eq(User::getUsername, "Lucy");
userMapper.selectOne(wrapper);
在实际项目中,MP确实大幅提升了开发效率。特别是在原型开发阶段,几乎可以不用编写任何SQL就能完成基础功能。不过需要注意的是,对于复杂查询和多表操作,还是应该回归传统的MyBatis方式,保持代码的可维护性。