Day 6: 封神之路:MyBatis-Plus的终极征程

Day 6: 封神之路:MyBatis-Plus的终极征程

首页角色扮演封神之路更新时间:2024-04-29

Day 6: 封神之路:MyBatis-Plus的终极征程

在这一天的课程中,我们将深入学习 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