本文详细介绍了MyBatis Plus项目实战,包括环境搭建、快速入门、高级功能介绍和实战项目演练。通过具体示例展示了MyBatis Plus在项目中的应用,包括基础CRUD操作和高级功能的使用。文中不仅提供了实战项目的编码实现,还详细展示了项目需求分析和分页查询的代码实现,帮助读者更好地理解和掌握MyBatis Plus项目实战。
MyBatis Plus简介 MyBatis Plus是什么MyBatis Plus是一个MyBatis的增强工具,它在MyBatis的基础上提供了包括CRUD操作、数据库层通用操作、分页操作等在内的大量简化功能,使得开发人员可以更快速地完成数据库操作相关的代码编写。
MyBatis Plus与MyBatis的区别- 功能增强:MyBatis Plus在MyBatis的基础上增加了许多功能,如自动填充、逻辑删除、乐观锁、全局数据缓存等,直接减少了开发人员的编码量。
- 简化操作:MyBatis Plus简化了CRUD操作,提供了很多通用的增强功能,例如在编写数据库查询时,MyBatis Plus提供了一套默认的查询语句和返回值处理方式,而不需要开发人员手动写出SQL语句。
- 性能优化:MyBatis Plus内置了分页插件、优化查询、插入、更新等操作,提高了系统的性能表现。
- 强大的CRUD支持:MyBatis Plus提供了大量的简化CRUD操作的方法,如
selectById
、updateById
、deleteById
等,可以快速实现数据库的基本操作。 - 逻辑删除:支持字段级别的逻辑删除,不需要物理删除数据,同时支持多字段级联逻辑删除。
- 乐观锁:支持字段级别的乐观锁,提供了
@Version
注解。 - 全局数据缓存:支持全局的数据缓存,提高了查询性能。
- 自定义SQL支持:除了内置的CRUD方法,MyBatis Plus还支持自定义SQL语句。
- 分页插件:内置了分页插件,支持多模式的分页。
- 自动生成代码:支持自动生成Mapper、Service、Controller等基础代码,极大地方便了项目的快速搭建。
- 开发工具:建议使用IntelliJ IDEA或Eclipse等IDE,这里以IntelliJ IDEA为例。
- 数据库:MySQL 5.7及以上版本或其他支持的数据库。
- 编程语言:Java 8及以上版本。
- 构建工具:Maven或Gradle。
在项目的pom.xml
文件中添加MyBatis Plus和MyBatis的依赖。
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
</dependencies>
数据库连接设置
在项目的application.properties
文件中配置数据库连接信息。
spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
快速入门
创建第一个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
private Long id;
private String name;
private Integer age;
private String email;
// getters and setters
}
创建一个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> {
}
实现基础的CRUD操作
使用UserMapper
接口实现基础的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> {
}
在Controller中使用UserService
。
package com.example.demo.controller;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public void addUser(@RequestBody User user) {
userService.save(user);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.updateById(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.removeById(id);
}
@GetMapping
public List<User> getAllUsers() {
return userService.list();
}
}
使用注解简化代码
使用MyBatis Plus的注解简化代码,例如在实体类中使用@TableId
和@TableName
注解。
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
// getters and setters
}
在Mapper接口中直接继承BaseMapper
接口。
public interface UserMapper extends BaseMapper<User> {
}
高级功能介绍
条件构造器的应用
使用QueryWrapper
或LambdaQueryWrapper
进行条件构造。
package com.example.demo.service;
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> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", name);
return list(queryWrapper);
}
}
Lambda表达式的使用
使用Lambda表达式简化条件构造。
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
public List<User> getUsersByName(String name) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, name);
return list(queryWrapper);
}
自定义SQL的编写
通过@Select
注解编写自定义SQL。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Select;
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> getUsersByAgeGreaterThan(Integer age);
}
自定义查询方法可以在Service中调用。
public List<User> getUsersByAgeGreaterThan(Integer age) {
return userMapper.getUsersByAgeGreaterThan(age);
}
项目实战演练
实战项目需求分析
项目需求
- 用户管理系统
- 用户信息的增删改查
- 分页查询用户列表
- 根据用户名或邮箱模糊查询用户
假设用户表结构如下:
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
`age` INT(11) NOT NULL,
`email` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
实战项目的编码实现
创建实体类
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
// getters and setters
}
创建Mapper接口
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
实现Service
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;
import java.util.List;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public List<User> getUsersByName(String name) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(User::getName, name);
return list(queryWrapper);
}
public List<User> getUsersByEmail(String email) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(User::getEmail, email);
return list(queryWrapper);
}
public List<User> getUsersByPage(Integer page, Integer size) {
Page<User> pagination = new Page<>(page, size);
return page(pagination);
}
}
实现Controller
package com.example.demo.controller;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public void addUser(@RequestBody User user) {
userService.save(user);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.updateById(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.removeById(id);
}
@GetMapping("/name/{name}")
public List<User> getUsersByName(@PathVariable String name) {
return userService.getUsersByName(name);
}
@GetMapping("/email/{email}")
public List<User> getUsersByEmail(@PathVariable String email) {
return userService.getUsersByEmail(email);
}
@GetMapping
public List<User> getAllUsers() {
return userService.list();
}
@GetMapping("/page/{page}/{size}")
public List<User> getUsersByPage(@PathVariable Integer page, @PathVariable Integer size) {
return userService.getUsersByPage(page, size);
}
}
常见问题与解决方案
常见错误及解决方法
- MyBatis Plus找不到Mapper接口:确保Mapper接口继承了
BaseMapper
接口,并且对应的XML配置正确。 - 数据库连接失败:检查数据库连接字符串是否正确,数据库是否启动。
- 批量操作:使用
batch
方法进行批量插入或更新。 - 缓存:启用二级缓存可以提高查询性能。
- 分页插件:使用MyBatis Plus的分页插件实现高效的分页查询。
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.plugins.Pagination;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public List<User> getUsersByPage(Integer page, Integer size) {
Pagination<User> pagination = new Pagination<>(page, size);
return page(pagination);
}
}
MyBatis Plus的调试和日志配置
通过调整配置文件中的日志级别,可以启用MyBatis Plus的SQL语句调试。
mybatis-plus.global-config.db-config.log-impl=ConsoleLog
mybatis-plus.global-config.db-config.sql-show=true
以上配置将开启SQL语句的打印,便于调试和分析SQL执行情况。
共同学习,写下你的评论
评论加载中...
作者其他优质文章