Mybatis-Plus的使用
- 一、核心特性
- 二、基础配置
-
- [2.1 依赖配置](#2.1 依赖配置)
- [2.2 yml文件配置](#2.2 yml文件配置)
- 三、实际使用
-
- [3.1 添加配置类](#3.1 添加配置类)
- [3.2 创建实体类](#3.2 创建实体类)
- [3.3 创建Mapper接口](#3.3 创建Mapper接口)
- [3.4 创建Service层](#3.4 创建Service层)
- [3.5 创建Service实现层](#3.5 创建Service实现层)
- [3.6 创建Controller](#3.6 创建Controller)
- [3.7 用配置类里面的操作,完善Service实现层(使用Lambda方法)](#3.7 用配置类里面的操作,完善Service实现层(使用Lambda方法))
一、核心特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响
- 损耗小:启动即会自动注入基本CURD,性能基本无损耗
- 强大的CRUD操作:内置通用Mapper、通用Service
- 支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件
- 支持主键自动生成:支持多达4种主键策略
- 支持ActiveRecord模式:支持ActiveRecord形式调用
- 支持自定义全局通用操作:支持全局通用方法注入
- 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码
- 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作
- 内置性能分析插件:可输出SQL语句以及其执行时间
二、基础配置
2.1 依赖配置
java
复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2.2 yml文件配置
java
复制代码
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# MyBatis Plus配置
mybatis-plus:
configuration:
# 日志输出
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 驼峰命名转换
map-underscore-to-camel-case: true
global-config:
db-config:
# 主键类型
id-type: auto
# 逻辑删除字段
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
# Mapper XML文件位置
mapper-locations: classpath*:/mapper/**/*.xml
三、实际使用
3.1 添加配置类
java
复制代码
package cn.itwy.studydemo1;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("cn.itwy.studydemo1")
public class MyBatisPlusConfig {
// 分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
// 自动填充处理器
public MetaObjectHandler mataObjectHandler() {
return new MetaObjectHandler(){
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", java.util.Date.class, new java.util.Date());
this.strictInsertFill(metaObject, "updateTime", java.util.Date.class, new java.util.Date());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", java.util.Date.class, new java.util.Date());
}
};
}
}
3.2 创建实体类
java
复制代码
package cn.itwy.studydemo1;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String email;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic
private Integer deleted;
}
3.3 创建Mapper接口
java
复制代码
package cn.itwy.studydemo1;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper extends BaseMapper<User> {
/**
* 根据用户名查询用户
*/
@Select("SELECT * FROM user WHERE username = #{username}")
User selectByUsername(@Param("username") String username);
}
3.4 创建Service层
java
复制代码
package cn.itwy.studydemo1;
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService<User> {
User selectByUsername(String username);
}
3.5 创建Service实现层
java
复制代码
package cn.itwy.studydemo1;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User selectByUsername(String username) {
return baseMapper.selectByUsername(username);
}
}
3.6 创建Controller
java
复制代码
package cn.itwy.studydemo1;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/all")
public List<User> listAllUsers() {
return userService.list();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getById(id);
}
@PostMapping("/creatUser")
public boolean createUser(@RequestBody User user) {
return userService.save(user);
}
@PostMapping("/changeUser/{id}")
public boolean changeUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
return userService.updateById(user);
}
@DeleteMapping("/delete/{id}")
public boolean deleteUser(@PathVariable Long id) {
return userService.removeById(id);
}
@GetMapping("/page")
public IPage<User> page(@RequestParam(defaultValue = "1") Integer current, @RequestParam(defaultValue = "10") Integer size) {
return userService.page(new Page<>(current, size));
}
}
3.7 用配置类里面的操作,完善Service实现层(使用Lambda方法)
java
复制代码
package cn.itwy.studydemo1;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User selectByUsername(String username) {
return baseMapper.selectByUsername(username);
}
public List<User> searchUsers(String username, Integer minAge, Integer maxAge) {
return lambdaQuery()
.like(StringUtils.isNotBlank(username), User::getUsername, username)
.ge(minAge != null, User::getAge, minAge)
.le(maxAge != null, User::getAge, maxAge)
.orderByDesc(User::getCreateTime)
.list();
}
// 分页查询
public IPage<User> pageUsers(Integer current, Integer size, String keyword) {
return lambdaQuery()
.like(StringUtils.isNotBlank(keyword), User::getUsername, keyword)
.or()
.like(StringUtils.isNotBlank(keyword), User::getEmail, keyword)
.orderByDesc(User::getCreateTime)
.page(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(current, size));
}
// 更新操作
public boolean updateUser(Long id, Integer age) {
return lambdaUpdate()
.eq(User::getId, id)
.set(User::getAge, age)
.update();
}
}