本教程将带领你快速上手 MyBatis-Plus,涵盖其基本功能、常用注解以及插件的使用。我们将通过代码实例一步步展示如何在实际项目中应用 MyBatis-Plus。
1. 快速开始
1.1 添加依赖
在 pom.xml
中添加以下依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
1.2 配置数据源
在 application.yml
中配置 MySQL 数据源信息,并启用 MyBatis 日志打印:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: 111111
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
1.3 创建启动类
在启动类中添加 @MapperScan
注解,指定 Mapper 接口所在包:
@SpringBootApplication
@MapperScan("com.java.mybatisplus.mapper")
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
1.4 定义实体类与 Mapper 接口
创建 User
实体类与 UserMapper
接口:
package com.java.mybatisplus.dao;
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;
}
package com.java.mybatisplus.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.java.mybatisplus.dao.User;
public interface UserMapper extends BaseMapper<User> {
}
1.5 编写测试代码
通过 JUnit 测试 UserMapper
的基本查询功能:
package com.java.mybatisplus;
import com.java.mybatisplus.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testSelect() {
userMapper.selectList(null).forEach(System.out::println);
}
}
2. 基本增删改查
MyBatis-Plus 提供了强大的 BaseMapper
接口,用于实现 CRUD 操作。我们可以直接在 UserMapper
中继承 BaseMapper<User>
来获得这些基本功能。
2.1 插入数据
@Test
public void testInsert() {
User user = new User(null, "张三", 32, "zhangsan@atguigu.com");
int res = userMapper.insert(user);
System.out.println(res);
System.out.println(user.getId()); // 自动生成的 ID
}
2.2 删除数据
通过 ID 删除:
@Test
public void testDeleteById(){
int result = userMapper.deleteById(1826148003704561665L);
System.out.println(result);
}
通过批量 ID 删除:
@Test
public void testDeleteByIds(){
List<Integer> idList = Arrays.asList(1, 2, 3);
int result = userMapper.deleteBatchIds(idList);
System.out.println(result);
}
2.3 更新数据
@Test
public void testUpdateById(){
User user = new User(1826149526211735553L,"李四",32,"zhangsan@atguigu.com");
int result = userMapper.updateById(user);
System.out.println(result);
}
2.4 查询数据
通过 ID 查询:
@Test
public void testSelectById(){
User user = userMapper.selectById(1826149526211735553L);
System.out.println(user);
}
通过条件查询:
@Test
public void testSelectList(){
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
3. 常用注解
MyBatis-Plus 提供了一系列注解来简化数据库表与实体类之间的映射。
3.1 @TableName
当数据库表名与实体类名不一致时,可以使用 @TableName
注解指定表名:
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
3.2 @TableId
当数据库表的主键字段名与实体类中的字段名不一致时,可以使用 @TableId
注解指定主键:
@TableId(value = "uid", type = IdType.ASSIGN_ID)
private Long id;
3.3 @TableField
当数据库字段与实体类属性名不一致时,可以使用 @TableField
注解:
@TableField("username")
private String name;
3.4 @TableLogic
使用 @TableLogic
注解实现逻辑删除功能:
@TableLogic(value = "0", delval = "1")
private Integer isDeleted;
4. 条件构造器
MyBatis-Plus 提供了强大的条件构造器(Wrapper)用于构建复杂的查询条件。
4.1 QueryWrapper
QueryWrapper
用于构建查询条件:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("username", "张")
.between("age", 20, 30)
.isNotNull("email");
List<User> users = userMapper.selectList(queryWrapper);
4.2 UpdateWrapper
UpdateWrapper
用于构建更新条件:
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper.set("age", 19)
.set("email", "test@atguigu.com")
.like("username", "张三")
.and(i -> i.gt("age", 20).or().isNull("email"));
int result = userMapper.update(null, userUpdateWrapper);
System.out.println(result);
4.3 LambdaQueryWrapper 和 LambdaUpdateWrapper
LambdaQueryWrapper
和 LambdaUpdateWrapper
可以使用 Lambda 表达式来避免硬编码字段名:
@Test
public void testLambdaQueryWrapper() {
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getName, "张")
.orderByDesc(User::getAge);
List<User> users = userMapper.selectList(lambdaQueryWrapper);
users.forEach(System.out::println);
}
@Test
public void testLambdaUpdateWrapper() {
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.set(User::getAge, 30)
.eq(User::getName, "张三");
userMapper.update(null, lambdaUpdateWrapper);
}
5. 插件
MyBatis-Plus 提供了分页插件等功能,通过简单配置即可使用。
5.1 分页插件
在配置类中添加分页插件:
package com.java.mybatisplus.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.java.mybatisplus.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
5.2 分页查询
使用分页插件进行分页查询:
@Test
public void testSelectPage(){
IPage<User> page = new Page<>(1, 2);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 20);
IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
List<User> userList = userPage.getRecords();
long total = userPage.getTotal();
System.out.println("总数: " + total);
userList.forEach(System.out::println);
}
6.代码生成器
方式一:代码运行
- 添加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
<!-- FreeMarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version> <!-- Use the version compatible with your mybatis-plus version -->
</dependency>
- 执行代码
package com.java.mybatisplus.generator;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.sql.Types;
import java.util.Collections;
/**
* @author DNY
* @create 2024-08-21 19:39
*/
public class CodeGenerator {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "111111";
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> {
builder.author("baomidou") // 设置作者
.enableSwagger() // 开启 swagger 模式
.outputDir("D:\\JavaCode\\java-project-test\\mybatis-plus\\src\\main\\java\\com\\java\\mybatisplus\\generator"); // 指定输出目录
})
.dataSourceConfig(builder ->
builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT) {
// 自定义类型转换
return DbColumnType.INTEGER;
}
return typeRegistry.getColumnType(metaInfo);
})
)
.packageConfig(builder ->
builder.parent("com.java.mybatisplus") // 设置父包名
.moduleName("mybatis-plus") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\JavaCode\\java-project-test\\mybatis-plus\\src\\main\\java\\com\\java\\mybatisplus\\generator")) // 设置mapperXml生成路径
)
.strategyConfig(builder ->
builder.addInclude("t_user") // 设置需要生成的表名
.addTablePrefix("c_") // 设置过滤表前缀
)
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
方式二:MybatisX
结语
本教程涵盖了 MyBatis-Plus 的基本使用方法和一些常用的高级功能。通过这些知识,你可以在项目中更高效地进行数据库操作,并充分利用 MyBatis-Plus 的特性来简化开发工作。希望本教程能为你提供帮助,在实际项目中取得更好的成果。