在这一天的课程中,我们将深入学习 MyBatis-Plus 框架,并集成它到我们的 Spring Boot 项目中。我们将使用 MyBatis-Plus 提供的强大功能,包括条件构造器、分页查询、Lambda 表达式等,最终完善我们的 RESTful API,实现增、删、改、查的操作。
创建 Day 6 子模块:进入项目根目录:cd springboot60days
创建 Day 6 子模块:
mkdir day6-mybatis-plus-journey
cd day6-mybatis-plus-journey
在 Day 5 子模块的基础上,创建 Day 6 子模块。在父模块的 pom.xml 中添加 Day 6 子模块的配置:
<!-- springboot60days/pom.xml -->
<modules>
<module>day4-database-magic</module>
<module>day5-mybatis-mystery</module>
<module>day6-mybatis-plus-journey</module>
</modules>
Day 6 子模块 pom.xml 配置:
子模块 pom.xml 配置<!-- springboot60days/day6-mybatis-plus-journey/pom.xml -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.icoderoad.springboot60days</groupId>
<artifactId>springboot60days</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>day6-mybatis-plus-journey</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- Lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Spring Boot Starter Web (Assuming you need web support) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- mybatis-Plus Starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4.1</version>
</dependency>
<!-- H2 Database (for testing) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建配置文件:
在 src/main/resources 目录下创建 application.properties :
# springboot60days/day6-mybatis-plus-journey/src/main/resources/application.properties
# Spring Boot 应用程序名称
spring.application.name=day6-mybatis-plus-journey
# 数据库配置
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYsql
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.show-SQL=true
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
# MyBatis-Plus 配置
mybatis-plus.mapper-locations=classpath:mapper/*.xml
# 分页插件配置
mybatis-plus.configuration.plugins=com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor
mybatis-plus.configuration.plugins.pagination.type=com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor
实体类 User.java
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/model/User.java
package com.icoderoad.springboot60days.day6.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName(value = "my_user")
public class User implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "username")
private String username;
@TableField(value = "email")
private String email;
@TableField(value = "age")
private Integer age;
}
Mapper 接口 UserMapper.java
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/mapper/UserMapper.java
package com.icoderoad.springboot60days.day6.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.icoderoad.springboot60days.day6.model.User;
public interface UserMapper extends BaseMapper<User> {
}
Service 类 UserService.java
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/service/UserService.java
package com.icoderoad.springboot60days.day6.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.icoderoad.springboot60days.day6.mapper.UserMapper;
import com.icoderoad.springboot60days.day6.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
public interface UserService extends IService<User> {
public List<User> getAllUsers();
}
Service Impl 类 UserServiceImpl.java
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/service/impl/UserServiceImpl.java
package com.icoderoad.springboot60days.day6.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.icoderoad.springboot60days.day6.mapper.UserMapper;
import com.icoderoad.springboot60days.day6.model.User;
import com.icoderoad.springboot60days.day6.service.UserService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
public List<User> getAllUsers() {
// 使用条件构造器,构建查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 示例:添加查询条件,年龄大于等于 18 岁的用户
queryWrapper.ge("age", 18);
// 分页查询,每页显示 10 条数据,查询第 1 页
Page<User> page = new Page<>(1, 10);
// 使用 Lambda 表达式进行查询
IPage<User> userPage = this.page(page, queryWrapper);
// 返回查询结果
return userPage.getRecords();
}
}
在 UserServiceImpl 类中,使用了 QueryWrapper 构建了查询条件,通过 ge 方法表示年龄大于等于 18 岁的用户。然后,我使用 Page 对象表示分页查询,每页显示 10 条数据,查询第 1 页。
在 MyBatis-Plus 中,QueryWrapper、Page 和 Lambda 表达式是非常实用的功能,能够简化 SQL 查询和提供更灵活的查询方式。以下是对它们的详细用法说明:
QueryWrapper详细用法QueryWrapper 是 MyBatis-Plus 提供的查询条件构造器,用于构建条件查询。以下是一些常见的用法:
等值查询QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25); // 等于 age = 25
模糊查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("username", "Tom"); // 模糊查询 username 包含 "Tom"
多条件查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25).like("username", "Tom");
// age = 25 且 username 包含 "Tom"
更多的条件构造器的用法可以查看 MyBatis-Plus 文档:QueryWrapper
Page详细用法Page 用于分页查询,提供了分页信息的封装。
创建 Page 对象Page<User> page = new Page<>(1, 10); // 查询第一页,每页显示10条数据
使用 Page 进行分页查询
IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
List<User> userList = userPage.getRecords(); // 获取查询结果
获取分页信息
long total = userPage.getTotal(); // 获取总记录数
long current = userPage.getCurrent(); // 获取当前页码
long size = userPage.getSize(); // 获取每页显示条数
更多关于 Page 的用法可以查看 MyBatis-Plus 文档。
Lambda 表达式详细用法Lambda 表达式是 MyBatis-Plus 提供的一种更简洁的方式进行条件查询。
使用 Lambda 表达式进行等值查询LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getAge, 25); // 等于 age = 25
使用 Lambda 表达式进行模糊查询
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getUsername, "Tom"); // 模糊查询 username 包含 "Tom"
多条件查询
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getAge, 25).like(User::getUsername, "Tom");
// age = 25 且 username 包含 "Tom"
Controller 类 UserController.java
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/controller/UserController.java
package com.icoderoad.springboot60days.day6.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.icoderoad.springboot60days.day6.model.User;
import com.icoderoad.springboot60days.day6.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
// 获取所有用户信息
@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
List<User> users = userService.getAllUsers();
return ResponseEntity.ok(users);
}
// 分页查询所有用户信息
@GetMapping("/paged")
public ResponseEntity<Page<User>> getUsersWithPagination(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
Page<User> usersPage = userService.page(new Page<>(page, size));
return ResponseEntity.ok(usersPage);
}
// 根据ID获取用户信息
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
User user = userService.getById(id);
return ResponseEntity.ok(user);
}
// 添加用户
@PostMapping
public ResponseEntity<Void> addUser(@RequestBody User user) {
userService.save(user);
return ResponseEntity.ok().build();
}
// 根据ID更新用户
@PutMapping("/{id}")
public ResponseEntity<Void> updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.saveOrUpdate(user);
return ResponseEntity.ok().build();
}
// 根据ID删除用户
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.removeById(id);
return ResponseEntity.ok().build();
}
}
初始化类 DatabaseInitializer
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/init/DatabaseInitializer.java
package com.icoderoad.springboot60days.day6.init;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.jdbc.core.JdbcTemplate;
@Component
public class DatabaseInitializer implements CommandLineRunner {
private final JdbcTemplate jdbcTemplate;
public DatabaseInitializer(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void run(String... args) throws Exception {
// 初始化数据库表
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS my_user ("
"id INT AUTO_INCREMENT PRIMARY KEY,"
"username VARCHAR(255),"
"email VARCHAR(255),"
"age INT"
")");
}
}
配置类 MyBatisPlusConfig.java
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/config/MyBatisPlusConfig.java
package com.icoderoad.springboot60days.day6.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.icoderoad.springboot60days.day6.mapper"})
public class MyBatisPlusConfig {
/**
* 分页插件,自动识别数据库类型
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
应用程序启动类 Day6Application.java
// springboot60days/day6-mybatis-plus-journey/src/main/java/com/icoderoad/springboot60days/day6/Day6Application.java
package com.icoderoad.springboot60days.day6;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Day6Application {
public static void main(String[] args) {
SpringApplication.run(Day6Application.class, args);
}
}
Mapper 文件 UserMapper.xml
<!--springboot60days/day6-mybatis-plus-journey/src/main/java/resource/mapper/UserMapper.xml-->
<?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.icoderoad.springboot60days.day6.mapper.UserMapper">
<resultMap id="userResultMap" type="com.icoderoad.springboot60days.day6.model.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="email" property="email"/>
<!-- 其他字段 -->
</resultMap>
</mapper>
启动应用程序:
在 day6-mybatis-plus-journey 子模块的根目录下,执行以下命令启动 Spring Boot 应用程序:
mvn spring-boot:run
测试功能实现:
在 Postman 中测试 RESTful API 的增、删、改、查操作,你可以使用以下命令:
获取所有用户信息(GET请求)
添加用户(POST请求)
根据ID获取用户信息(GET请求)
更新用户信息(PUT请求)
删除用户(DELETE请求)
请确保你的应用程序已经启动,并且端口号等配置与实际项目一致。根据实际的业务需求和接口设计,可以适当修改请求体中的 JSON 数据。
通过今天的学习,我们不仅掌握了 MyBatis-Plus 的核心功能,还能够运用这些知识来构建强大的数据库交互系统。在接下来的学习中,我们将继续深入,为我们的全栈工程师之路铺设更加坚实的基石。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved