赞
踩
1. 介绍
yBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上增加了大量功能和简化操作,以提高开发效率。
2. 特点
3. MyBatis与MyBatisPlus
特性 | MyBatis | MyBatis-Plus |
---|---|---|
入侵性 | 低 | 低(对现有项目无影响,只做增强) |
依赖性 | 需要 MyBatis | 依赖 MyBatis 和 MyBatis-Spring |
简化 CRUD 操作 | 不提供,需要手动编写 | 提供丰富的 CRUD 接口,自动生成单表 CRUD 代码 |
分页支持 | 需要自行实现 | 提供分页插件,开箱即用 |
动态 SQL | 需要手动编写动态 SQL | 提供更加简化的动态 SQL 支持 |
代码生成器 | 不提供 | 提供代码生成器,可根据数据库表生成实体类、Mapper、Service |
逻辑删除 | 不提供 | 提供逻辑删除注解 |
自动填充 | 不提供 | 提供字段自动填充注解 |
拓展性 | 通过插件实现 | 提供丰富的内置插件,并支持自定义插件 |
性能分析 | 不提供 | 提供性能分析插件 |
字段验证 | 需要手动实现 | 提供校验插件 |
多租户支持 | 需要手动实现 | 提供多租户插件 |
热加载 | 需要手动实现 | 支持热加载,方便开发调试 |
SQL 执行效率分析 | 不提供 | 提供 SQL 执行效率分析插件 |
复杂 SQL 支持 | 强 | 强,但通过条件构造器简化复杂 SQL |
主键生成策略 | 需要手动设置 | 提供多种主键生成策略 |
性能 | 高 | 高 |
1. 配置
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydatabase
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath:/mapper/*.xml
type-aliases-package: com.example.entity
**2.注解 **
MyBatis-Plus通过反射获取实体类信息作为表数据信息。
(1)当实体类命名与数据库表一一对应时:
3. 基本使用CRUD
(1)创建与数据库表对应的实体类
package com.example.entity; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import lombok.Data; @Data @TableName("users") public class User { @TableId(value = "id", type = IdType.AUTO) private Long id; private String name; private String email; private Integer age; private String address; }
(2)创建 Mapper 接口并继承 MyBatis-Plus 提供的 BaseMapper
package com.example.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
(3) 创建 Service 接口和实现类
package com.example.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;
public interface UserService extends IService<User> {
}
package com.example.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
(4)创建 Controller 类来处理请求,基础的增删改查直接调用basemapper里面的函数接口
package com.example.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.entity.User; import com.example.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; @GetMapping public List<User> getAllUsers() { return userService.list(); } @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getById(id); } @PostMapping public void createUser(@RequestBody User user) { userService.save(user); } @PutMapping public void updateUser(@RequestBody User user) { userService.updateById(user); } @DeleteMapping("/{id}") public void deleteUser(@PathVariable Long id) { userService.removeById(id); } }
(一). 条件构造器(Wrapper)
1. 介绍
条件构造器(Wrapper)是 MyBatis-Plus 提供的一个强大的工具,用于简化复杂查询的构造。它通过链式调用的方式生成 SQL 语句,支持多种条件组合。
2.常见方法
3. 示例
// 查询名字为"John"且年龄大于等于18的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John")
.ge("age", 18);
List<User> users = userMapper.selectList(queryWrapper);
4. Lamba表达式
尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码。
(二)自定义sql
1.介绍
MyBatis-Plus 支持在 Mapper 接口中自定义 SQL 语句,主要是处理那些条件构造器无法涵盖的复杂查询、批量操作等场景。
2. 实现方式
(1)XML 文件定义自定义 SQL
<!-- UserMapper.xml --> <mapper namespace="com.example.mapper.UserMapper"> <!-- 根据邮箱查询用户 --> <select id="selectByEmail" resultType="com.example.entity.User"> SELECT * FROM users WHERE email = #{email} </select> <!-- 根据年龄范围查询用户 --> <select id="selectByAgeRange" resultType="com.example.entity.User"> SELECT * FROM users WHERE age BETWEEN #{minAge} AND #{maxAge} </select> <!-- 批量插入用户 --> <insert id="batchInsert"> INSERT INTO users (name, email, age) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}, #{item.email}, #{item.age}) </foreach> </insert> </mapper>
// UserMapper.java package com.example.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.entity.User; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper extends BaseMapper<User> { User selectByEmail(@Param("email") String email); List<User> selectByAgeRange(@Param("minAge") int minAge, @Param("maxAge") int maxAge); int batchInsert(@Param("list") List<User> users); }
注:@Param不要忘记
(2)使用注解定义自定义 SQL
// UserMapper.java package com.example.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.entity.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM users WHERE email = #{email}") User selectByEmail(@Param("email") String email); @Select("SELECT * FROM users WHERE age BETWEEN #{minAge} AND #{maxAge}") List<User> selectByAgeRange(@Param("minAge") int minAge, @Param("maxAge") int maxAge); @Insert({ "<script>", "INSERT INTO users (name, email, age) VALUES ", "<foreach collection='list' item='item' separator=','>", "(#{item.name}, #{item.email}, #{item.age})", "</foreach>", "</script>" }) int batchInsert(@Param("list") List<User> users); }
(3)结合条件构造器与自定义 SQL(将指定id的用户的余额减少200)
List<Long> ids = List.of( 1L,2L,4L);int amount = 200;
//1.构建条件
LambdaQuerywrapper<User> wrapper = new LambdaQuerywrapper<User>( ) .in(User::getId,ids); / 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount) ;
void updateBalanceByIds (@Param("ew") LambdaQueryWwrapperUser> wrapper,@eParam(" amount") int amount);
<update id="updateBalanceByIds">
UPDATE tb_user SET balance - balance - #{amount]${ew.customSqlSegment}</ update>
(三)service接口
1. 介绍
package com.example.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;
public interface UserService extends IService<User> {
}
实现类:
package com.example.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
package com.example.controller; import com.example.entity.User; import com.example.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 boolean addUser(@RequestBody User user) { return userService.save(user); } // 根据ID删除用户 @DeleteMapping("/{id}") public boolean deleteUser(@PathVariable Long id) { return userService.removeById(id); } // 更新用户信息 @PutMapping public boolean updateUser(@RequestBody User user) { return userService.updateById(user); } // 根据ID查询用户 @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getById(id); } // 查询所有用户 @GetMapping public List<User> getAllUsers() { return userService.list(); } }
注:简单的增删改查直接在servi接口调用方法可以,复杂的需要逻辑判断的功能需要在service实现类中自己处理逻辑
(四)MyBatisPlus扩展功能
(1)代码生成器
使用插件生成和数据库表对应的代码,包括controller、service、serviceimpl等。
(2)逻辑删除
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名,字段类型可以是 boolean、integer
logic-delete-value: 1 #逻辑已删除值(默认为1)
logic-not-delete-value: 0#逻辑未删除值(默认为0)
package com.example.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; @TableLogic // 标记逻辑删除字段 @TableField(value = "is_deleted", fill = FieldFill.INSERT) // 指定逻辑删除字段名和填充策略 private Integer deleted; }
(3)枚举处理器
MyBatis-Plus 支持枚举类型的处理,可以将数据库中的枚举值和实体类中的枚举类型进行映射。
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
public enum UserStatus {
ACTIVE(1, "Active"),
INACTIVE(2, "Inactive");
@EnumValue
private final int code;
private final String label;
UserStatus(int code, String label) {
this.code = code;
this.label = label;
}
(4)Json处理器
当数据库存储了Json格式的数据时,需要进行JSON 数据与Java 对象中之间的映射
Data
@TableName(“user”,autoResultMap = true)
public class User{
private Long id;
private String username ;
@TaTableField(typeHandler = JacksonTypeHandler.class)
private UserInfo info ;
}
(5)全局分页插件
1. 配置分页插件属性
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.MySqlDialect; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor () { // 1.初始化核心插件 MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //2添加分页插件 PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType .MYsQL);pageInterceptor.setMaxLimit( 1000L);//设置分页上限 interceptor.addInnerInterceptor(pageInterceptor) ; return interceptor; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。