MyBatis Plus是一个增强版的MyBatis工具,旨在简化数据库操作并提高开发效率。本文详细介绍了MyBatis Plus的核心功能、优势及环境搭建步骤,包括基本CRUD操作、动态SQL使用和自定义逻辑扩展等内容。MyBatis Plus教程涵盖了从环境准备到实际操作的全过程,帮助开发者快速上手并提升开发效率。
MyBatis Plus 是一个 MyBatis 的增强工具。它在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了许多便捷的方法,使得在使用 MyBatis 进行数据库操作时更加方便快捷。
MyBatis Plus 相对于 MyBatis 的主要优势如下:
MyBatis Plus 的核心功能主要包括以下几点:
save
、updateById
、deleteById
等。QueryWrapper
或 LambdaQueryWrapper
可以构建复杂的查询条件。PageHelper
分页插件,支持分页查询。BaseEntity
类实现。SqlInjector
接口。Insert
和 Update
方法。在开始使用 MyBatis Plus 之前,首先需要准备好开发环境。开发环境主要包括 Java 开发工具(如 IntelliJ IDEA 或 Eclipse)、数据库(如 MySQL)、以及构建工具(如 Maven 或 Gradle)。
接下来,创建一个新的 Maven 项目。以下是创建步骤:
pom.xml
文件中添加必要的依赖和配置。在 pom.xml
文件中,添加 MyBatis Plus 的依赖。示例如下:
<dependencies> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <!-- Spring Boot Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.5.4</version> </dependency> <!-- MySQL Connector --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> <!-- Spring Boot JPA --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.5.4</version> </dependency> </dependencies>
在 application.properties
或 application.yml
文件中,配置数据库连接信息。示例如下:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis-plus.mapper-locations=classpath:mapper/*.xml mybatis-plus.mapper-scan-package=com.example.demo.mapper
实体类定义一个简单的实体类 User
。示例如下:
package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") public class User { @TableId(value = "id") private Long id; private String name; private Integer age; private String email; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
定义一个对应的 Mapper 接口 UserMapper
。示例如下:
package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; public interface UserMapper extends BaseMapper<User> { }
接下来,我们将使用 MyBatis Plus 进行基本的 CRUD 操作。
插入一条用户记录。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public boolean addUser(User user) { return this.save(user); } }
查询用户记录。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public User getUserById(Long id) { return this.getById(id); } }
更新用户记录。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public boolean updateUser(User user) { return this.updateById(user); } }
删除用户记录。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public boolean deleteUser(Long id) { return this.removeById(id); } }
条件构造器提供了强大的查询条件构建能力。以下是一个示例,展示如何使用 QueryWrapper
构建查询条件。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public List<User> getUsersByName(String name) { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name", name); return this.list(wrapper); } }
分页查询可以通过内置的 Page
类实现。以下是一个示例,展示如何进行分页查询。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public List<User> getUsersByPage(int currentPage, int pageSize) { Page<User> page = new Page<>(currentPage, pageSize); return this.page(page, new QueryWrapper<>()).getRecords(); } }
计算字段和 SQL 片段可以通过 resultMap
和 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.example.demo.mapper.UserMapper"> <select id="getUserAgeSum" resultType="java.lang.Integer"> SELECT SUM(age) AS ageSum FROM user </select> </mapper>
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.mapper.UserMapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Service; @Service public class UserService extends ServiceImpl<UserMapper, User> { public int getUserAgeSum() { return this.getBaseMapper().getUserAgeSum(); } }
逻辑删除通过 BaseEntity
类实现,只需要设置 isDelete
字段即可。
package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") public class User { @TableId(value = "id", type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; @TableLogic private Boolean isDelete; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Boolean getIsDelete() { return isDelete; } public void setIsDelete(Boolean delete) { this.isDelete = delete; } }
自定义逻辑更新可以通过扩展 IService
接口实现。
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import org.springframework.stereotype.Service; @Service public class UserService extends IService<User> { public boolean updateUserInfo(User user) { user.setIsDelete(false); return this.updateById(user); } }
自定义 SQL 插入操作可以通过 @SelectProvider
注解实现。
package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; import org.apache.ibatis.annotations.SelectProvider; public interface UserMapper extends BaseMapper<User> { @SelectProvider(type = UserSqlProvider.class, method = "insertUser") int insertUser(User user); }
package com.example.demo.mapper; import com.example.demo.entity.User; public class UserSqlProvider { public String insertUser(User user) { return "INSERT INTO user (name, age, email) VALUES ('" + user.getName() + "', " + user.getAge() + ", '" + user.getEmail() + "')"; } }
常见的错误及解决方案如下:
找不到实体类的映射关系:
@Table
和 @TableId
注解正确配置。mybatis-plus.mapper-scan-package
是否配置正确。BaseMapper
接口。插入数据失败:
@TableId
和 @TableField
注解。查询数据失败:
更新数据失败:
常见的优化技巧如下:
缓存机制:
@CacheConfig
和 @CacheResult
注解。分页查询:
PageHelper
进行分页查询。currentPage
和 pageSize
。延迟加载:
@TableField(fill = FieldFill.INSERT)
注解实现延迟加载。@TableField(fill = FieldFill.INSERT_UPDATE)
。saveBatch
和 updateBatchById
方法进行批量操作。batchSize
参数。MyBatis Plus 的调试技巧如下:
启用 SQL 语句打印:
mybatis-plus.global-config.db-config.print-sql=true
配置属性。调试 Mapper 接口:
日志输出:
DEBUG
或 INFO
。Mockito
或 PowerMockito
进行模拟测试。通过以上步骤,可以有效地使用 MyBatis Plus 进行数据库操作,并解决常见的错误和优化性能。