目录
一、集成mybatis-plus
1、引入依赖
2、日志启动
3、实体类与表、主键、字段对应关系
4、配置类
二、集成swagger
1、依赖
2、配置类
3、报错
三、mybatis-plus实现增删改查
1、entity
2、interface
3、service
4、mapper.xml
5、controller
com.baomidou
mybatis-plus-boot-starter
3.5.1
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
package com.example.demo.entity;
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 com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
@TableName(value = "user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String username;
@JsonIgnore
private String password;
private String nickname;
private String email;
private String phone;
private String address;
private String avatarUrl;
private Date createTime;
private String role;
@TableField(exist = false)
private List courses;
@TableField(exist = false)
private List stuCourses;
}
package com.example.demo.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.example.demo.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
mybatis-plus 官网:简介 | MyBatis-Plus
io.springfox
springfox-swagger2
2.9.2
io.springfox
springfox-swagger-ui
2.9.2
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2public
class SwaggerConfig {
@Bean
public Docket restApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("标准接口")
.apiInfo(apiInfo("Springboot使用Swagger2构建Restful APIs","1.0"))
.useDefaultResponseMessages(true)
.forCodeGeneration(false)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo(String title,String version) {
return new ApiInfoBuilder()
.title(title)
.description("swagger实战")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.22.jar:5.3.22]
at java.lang.Iterable.forEach(Iterable.java:75) ~[na:1.8.0_231]
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.22.jar:5.3.22]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) [spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) [spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) [spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) [spring-boot-2.7.3.jar:2.7.3]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) [spring-boot-2.7.3.jar:2.7.3]
at com.czh.swagger.SwaggerDemoApplication.main(SwaggerDemoApplication.java:12) [classes/:na]
Caused by: java.lang.NullPointerException: null
at springfox.documentation.spi.service.contexts.Orderings$8.compare(Orderings.java:112) ~[springfox-spi-2.9.2.jar:null]
at springfox.documentation.spi.service.contexts.Orderings$8.compare(Orderings.java:109) ~[springfox-spi-2.9.2.jar:null]
at com.google.common.collect.ComparatorOrdering.compare(ComparatorOrdering.java:37) ~[guava-20.0.jar:na]
at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[na:1.8.0_231]
at java.util.TimSort.sort(TimSort.java:220) ~[na:1.8.0_231]
at java.util.Arrays.sort(Arrays.java:1438) ~[na:1.8.0_231]
at com.google.common.collect.Ordering.sortedCopy(Ordering.java:855) ~[guava-20.0.jar:na]
at springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider.requestHandlers(WebMvcRequestHandlerProvider.java:57) ~[springfox-spring-web-2.9.2.jar:null]
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper$2.apply(DocumentationPluginsBootstrapper.java:138) ~[springfox-spring-web-2.9.2.jar:null]
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper$2.apply(DocumentationPluginsBootstrapper.java:135) ~[springfox-spring-web-2.9.2.jar:null]
at com.google.common.collect.Iterators$7.transform(Iterators.java:750) ~[guava-20.0.jar:na]
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:47) ~[guava-20.0.jar:na]
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:47) ~[guava-20.0.jar:na]
at com.google.common.collect.MultitransformedIterator.hasNext(MultitransformedIterator.java:52) ~[guava-20.0.jar:na]
at com.google.common.collect.MultitransformedIterator.hasNext(MultitransformedIterator.java:50) ~[guava-20.0.jar:na]
at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:249) ~[guava-20.0.jar:na]
at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:209) ~[guava-20.0.jar:na]
at com.google.common.collect.FluentIterable.toList(FluentIterable.java:614) ~[guava-20.0.jar:na]
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.defaultContextBuilder(DocumentationPluginsBootstrapper.java:111) ~[springfox-spring-web-2.9.2.jar:null]
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.buildContext(DocumentationPluginsBootstrapper.java:96) ~[springfox-spring-web-2.9.2.jar:null]
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:167) ~[springfox-spring-web-2.9.2.jar:null]
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.22.jar:5.3.22]
... 14 common frames omitted
需要在application.properties添加
spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER
项目启动后,swagger地址:http://localhost:9090/swagger-ui.html#/
package com.example.demo.entity;
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 com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
@TableName(value = "user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String username;
@JsonIgnore
private String password;
private String nickname;
private String email;
private String phone;
private String address;
private String avatarUrl;
private Date createTime;
private String role;
@TableField(exist = false)
private List courses;
@TableField(exist = false)
private List stuCourses;
}
package com.example.demo.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.dto.UserDto;
import com.example.demo.dto.UserPasswordDTO;
import com.example.demo.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
/**
*
* 服务类
*
*
* @author cizhu
* @since 2023-11-12
*/
public interface IUserService extends IService {
UserDto login(UserDto userDto);
User register(UserDto userDto);
Page findPage(IPage page, String username, String email, String address);
void updatePassword(UserPasswordDTO userPasswordDTO);
}
package com.example.demo.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.stream.StreamUtil;
import cn.hutool.core.util.StrUtil;
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.example.demo.common.Constants;
import com.example.demo.dto.UserDto;
import com.example.demo.dto.UserPasswordDTO;
import com.example.demo.entity.Menu;
import com.example.demo.entity.User;
import com.example.demo.exception.ServiceException;
import com.example.demo.mapper.RoleMapper;
import com.example.demo.mapper.RoleMenuMapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.IMenuService;
import com.example.demo.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
*
* 服务实现类
*
*
* @author cizhu
* @since 2023-11-12
*/
@Service
public class UserServiceImpl extends ServiceImpl implements IUserService {
@Resource
private RoleMapper roleMapper;
@Resource
private RoleMenuMapper roleMenuMapper;
@Resource
private UserMapper userMapper;
@Autowired
private IMenuService iMenuService;
@Override
public UserDto login(UserDto userDto) {
User one = getUserInfo(userDto);
if (one != null) {
BeanUtil.copyProperties(one, userDto, true);
String token = TokenUtils.genToken(one.getId().toString(), one.getPassword());
userDto.setToken(token);
String flag = one.getRole();
//获取当前角色的菜单
List
package com.example.demo.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
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.example.demo.common.Constants;
import com.example.demo.common.Result;
import com.example.demo.dto.UserDto;
import com.example.demo.dto.UserPasswordDTO;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.IUserService;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
//
// @Autowired
// private UserMapper userMapper;
@Autowired
private IUserService userService;
@PostMapping("/login")
public Result login(@RequestBody UserDto userDto){
String username = userDto.getUsername();
String password = userDto.getPassword();
if (StrUtil.isBlank(username)||StrUtil.isBlank(password)){
return Result.error(Constants.CODE_400,"参数错误");
}
return Result.success(userService.login(userDto));
}
@GetMapping
public Result findAll(){
return Result.success(userService.list());
}
@GetMapping("/role/{role}")
public Result findUserByRole(@PathVariable String role){
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("role",role);
return Result.success(userService.list(queryWrapper));
}
// @GetMapping("/page")
// public Map findPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize,@RequestParam String username){
// pageNum = (pageNum -1)*pageSize;
// Integer total = userMapper.selectTotal(username);
// username = '%'+username+'%';
// List data =userMapper.selectPage(pageNum,pageSize,username);
// Map res = new HashMap<>();
// res.put("data",data);
// res.put("total",total);
// return res;
// }
// @PostMapping
// public Integer save(@RequestBody User user) {
// return userService.save(user);
// }
@PostMapping("/register")
public Result register(@RequestBody UserDto userDto) {
String username = userDto.getUsername();
String password = userDto.getPassword();
if (StrUtil.isBlank(username)||StrUtil.isBlank(password)){
return Result.error(Constants.CODE_400,"参数错误");
}
return Result.success(userService.register(userDto));
}
@GetMapping("/username/{username}")
public Result findOne(@PathVariable String username){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username);
return Result.success(userService.getOne(queryWrapper));
}
@PostMapping
public Result save(@RequestBody User user) {
String username = user.getUsername();
if (StrUtil.isBlank(username)){
return Result.error(Constants.CODE_400,"参数错误");
}
if (user.getId()!=null){
user.setPassword(null);
}else {
user.setNickname(user.getUsername());
if (user.getPassword()==null){
user.setPassword("123");
}
}
return Result.success(userService.saveOrUpdate(user));
}
@PostMapping("/password")
public Result password(@RequestBody UserPasswordDTO userPasswordDTO) {
userService.updatePassword(userPasswordDTO);
return Result.success();
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id){
// return userMapper.deleteById(id);
return Result.success(userService.removeById(id));
}
@PostMapping("/del/batch")
public Result deleteBatch(@RequestBody List ids){
return Result.success(userService.removeBatchByIds(ids));
}
@GetMapping("/page")
public Result findPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize,
@RequestParam String username,@RequestParam String address,@RequestParam String email){
IPage page = new Page<>(pageNum,pageSize);
// QueryWrapper queryWrapper = new QueryWrapper<>();
// if (!"".equals(username)){
// queryWrapper.like("username",username);
// }
// if (!"".equals(address)) {
// queryWrapper.like("address",address);
// }
// if (!"".equals(email)) {
// queryWrapper.like("email",email);
// }
// queryWrapper.orderByDesc("create_time");
return Result.success(userService.findPage(page,username,email,address));
}
@GetMapping("/export")
public void export(HttpServletResponse response) throws Exception {
List list = userService.list();
//通过工具类创建writer,写出到磁盘路径
//ExportWriter writer = ExcelUtil.getWriter(filesuploadPath + "/用户信息.xlsx")
//在内存操作,写出到浏览器
// 通过工具类创建writer,默认创建xls格式
ExcelWriter writer = ExcelUtil.getWriter();
//自定义标题别名
// writer.addHeaderAlias("username","用户名");
// writer.addHeaderAlias("password","密码");
// writer.addHeaderAlias("nickname","昵称");
// writer.addHeaderAlias("email","邮箱");
// writer.addHeaderAlias("phone","电话");
// writer.addHeaderAlias("address","地址");
// writer.addHeaderAlias("createTime","创建时间");
// writer.addHeaderAlias("avatarUrl","头像");
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(list, true);
//设置浏览器响应格式
//response为HttpServletResponse对象
response.setContentType("application/vnd.openxmlformats-officedocument.preadsheetml;charset=utf-8");
//fileName是弹出下载对话框的文件名,不能为中文,中文请自行编码
String fileName = URLEncoder.encode("用户信息","UTF-8");
response.setHeader("Content-Disposition","attachment;filename="+fileName+".xls");
ServletOutputStream out=response.getOutputStream();
writer.flush(out, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
@PostMapping("/import")
public Result imp(MultipartFile file) throws Exception{
InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream);
// 通过JavaBean的方式读取Excel内的对象,要求表头是英文,跟Javabean属性对应起来
// List list = reader.readAll(User.class);
//忽略表头的中文
List>list = reader.read(1);
List users = CollUtil.newArrayList();
for (List