SpringBoot整合Mybatis Plus实现基本CRUD的示例代码
作者:JK凯
对数据库的操作是我们公司中必不可少的功能,Mybatis Plus是在Mybatis的基础上的增强,使得我们对一些基本的CRUD使用起来更方便等,这篇文章主要讲讲SpringBoot如何去整合Mybatis Plus,并实现基本的CRUD功能。
一、引入相应的依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency>
引入mybatis-plus
的依赖和mysql
驱动的依赖。
二、进行配置
spring: datasource: url: jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8&serverTimeZone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0
spring.datasource
是对数据库的链接信息的配置
mybatis-plus
:
configuration.log-impl
: 配置打印sql日志id-type
: id主键生成策略,auto为自增logic-delete-field
: 逻辑删除的字段,线上数据库一般要配置逻辑删除logic-delete-value
: 逻辑删除已删除的值logic-not-delete-value
: 逻辑删除未删除的值
三、新建数据库表
这里我新建一张简单的user表
sql如下:
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `age` int(3) NOT NULL, `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, `deleted` int(1) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
可以看到表中有一些建表必须的字段create_time
、update_time
、deleted
,前两个字段我们需要在项目中配置一下Mybatis Plus
让他在我们新增数据,更新数据时自动插入值,deleted
逻辑删除字段因为我们已经在yml中配置了,后续我们都不需要再处理。
四、配置 Mybatis Plus 自动填充
配置 Mybatis Plus
自动填充来实现对create_time
、update_time
的值自动插入和更新。
- 新建
handler.mybatisplus.MyMetaObjectHandler
类 - 该类实现
MetaObjectHandler
接口 - 并重写
insertFille
和updateFill
方法
具体代码实现如下:
handler.mybatisplus.MyMetaObjectHandler:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { setFieldValByName("createTime", new Date(), metaObject); setFieldValByName("updateTime", new Date(), metaObject); } @Override public void updateFill(MetaObject metaObject) { setFieldValByName("updateTime", new Date(), metaObject); } }
五、实现User实体类、UserMapper、UserService
- User实体类
domain.entity.User:
import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor @Accessors(chain = true) @TableName("user") public class User { @TableId private Long id; private String username; private Integer age; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; private Integer deleted; }
@TableName
:指定实体类对应的表名
@TableId
:指定为主键,我们配置的是auto
,即主键自增策略
@TableField
:指定该值使用我们的自动填充策略,INSERT
为插入时填充,INSERT_UPDATE
为插入和更新时填充
- UserMapper
mapper.UserMapper
:
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.jk.domain.entity.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { }
继承Mybatis Plus
提供的BaseMapper
,已经实现了一些基本的CRUD接口
- UserService
service.UserService
:
public interface UserService { }
service.impl.UserServiceImpl
:
import com.jk.service.UserService; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { }
先把对应的service
建好,后面实现controller
时再一并实现。
六、使用Restful风格实现CRUD功能
- 前期准备
因为我们需要在查列表时需要使用分页功能,需要配置一下Mybatis Plus
分页插件
config.MybatisPlus
:
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MybatisPlus { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mybatisPlusInterceptor; } }
另外因为我们需要在新增和更新时是不需要全部的实体字段,需要创建对应的DTO来接收前端数据,返回时也不需要全部字段,需要对应的Vo对返回前端所需字段
domain.dto.AddUserDto
:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class AddUserDto { private String username; private Integer age; }
domain.dto.UpdateUserDto
:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class UpdateUserDto { private Long id; private String username; private Integer age; }
domain.vo.UserVo
:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor public class UserVo { private Long id; private String username; private Integer age; private Date createTime; }
domain.vo.PageVo
:
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class PageVo { private List result; private Long total; }
PageVo
用来处理所有需要分页数据的响应
关于统一响应大家可以看 SpringBoot 中统一响应格式及统一异常处理,你应该这样做
关于Bean拷贝大家可以看SpringBoot 项目中 Bean 拷贝及工具类封装
CRUD
对应的controller
controller.UserController
:
import com.jk.domain.dto.AddUserDto; import com.jk.domain.dto.UpdateUserDto; import com.jk.service.UserService; import com.jk.domain.vo.ResponseResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @PostMapping public ResponseResult addUser(@RequestBody AddUserDto addUserDto) { return userService.addUser(addUserDto); } @PutMapping public ResponseResult updateUser(@RequestBody UpdateUserDto updateUserDto) { return userService.updateUser(updateUserDto); } @DeleteMapping("/{id}") public ResponseResult deleteUser(@PathVariable("id") Long id) { return userService.deleteUser(id); } @GetMapping public ResponseResult getUser(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { return userService.getUser(pageNum, pageSize); } }
CRUD
对应的service
service.UserService
:
import com.jk.domain.dto.AddUserDto; import com.jk.domain.dto.UpdateUserDto; import com.jk.domain.vo.ResponseResult; public interface UserService { ResponseResult addUser(AddUserDto addUserDto); ResponseResult updateUser(UpdateUserDto updateUserDto); ResponseResult deleteUser(Long id); ResponseResult getUser(Integer pageNum, Integer pageSize); }
CRUD
都应service实现类
service.impl.UserServiceImpl
:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jk.domain.dto.AddUserDto; import com.jk.domain.dto.UpdateUserDto; import com.jk.domain.entity.User; import com.jk.domain.vo.UserVo; import com.jk.mapper.UserMapper; import com.jk.service.UserService; import com.jk.domain.vo.PageVo; import com.jk.domain.vo.ResponseResult; import com.jk.utils.BeanCopyUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public ResponseResult addUser(AddUserDto addUserDto) { User user = BeanCopyUtils.copyBean(addUserDto, User.class); userMapper.insert(user); return ResponseResult.okResult(); } @Override public ResponseResult updateUser(UpdateUserDto updateUserDto) { User user = new User(); BeanUtils.copyProperties(updateUserDto, user); userMapper.updateById(user); return ResponseResult.okResult(); } @Override public ResponseResult deleteUser(Long id) { userMapper.deleteById(id); return ResponseResult.okResult(); } @Override public ResponseResult getUser(Integer pageNum, Integer pageSize) { Page<User> userPage = new Page<>(pageNum, pageSize); userMapper.selectPage(userPage, null); List<UserVo> userVos = BeanCopyUtils.copyBeanList(userPage.getRecords(), UserVo.class); PageVo pageVo = new PageVo(userVos, userPage.getTotal()); return ResponseResult.okResult(pageVo); } }
到此这篇关于SpringBoot整合Mybatis Plus实现基本CRUD的示例代码的文章就介绍到这了,更多相关SpringBoot MybatisPlus实现CRUD内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!