使用mybatisplus快速开发springboot项目(一)-CSDN博客
在上一篇博客,我们进行了项目初始化。现在我们开始构建dao层,service层,entity层,controller层
下面是mybatisplus代码生成器
mybatisplus代码生成器
package com.example.examservice;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.junit.platform.commons.util.StringUtils;
import java.util.ArrayList;
import java.util.Scanner;
public class CodeGenerator {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");//设置代码生成路径
gc.setFileOverride(true);//是否覆盖以前文件
gc.setOpen(false);//是否打开生成目录
gc.setAuthor("liujianchen");//设置项目作者名称
// gc.setIdType(IdType.AUTO);//设置主键策略
gc.setBaseResultMap(true);//生成基本ResultMap
gc.setBaseColumnList(true);//生成基本ColumnList
gc.setServiceName("%sService");//去掉服务默认前缀
gc.setDateType(DateType.ONLY_DATE);//设置时间类型
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.example.examservice");
pc.setMapper("mapper");
pc.setXml("mapper.xml");
pc.setEntity("entity");
pc.setService("service");
pc.setServiceImpl("service.impl");
pc.setController("controller");
mpg.setPackageInfo(pc);
// 策略配置
StrategyConfig sc = new StrategyConfig();
sc.setNaming(NamingStrategy.underline_to_camel);
sc.setColumnNaming(NamingStrategy.underline_to_camel);
sc.setEntityLombokModel(true);//自动lombok
sc.setRestControllerStyle(true);
sc.setControllerMappingHyphenStyle(true);
sc.setLogicDeleteFieldName("is_deleted");//设置逻辑删除
//设置自动填充配置
TableFill gmt_create = new TableFill("create_time", FieldFill.INSERT_UPDATE);
TableFill gmt_createUser = new TableFill("create_user", FieldFill.INSERT);
TableFill gmt_modified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
TableFill gmt_modifiedUser = new TableFill("update_user", FieldFill.INSERT);
ArrayList<TableFill> tableFills=new ArrayList<>();
tableFills.add(gmt_create);
tableFills.add(gmt_createUser);
tableFills.add(gmt_modified);
tableFills.add(gmt_modifiedUser);
sc.setTableFillList(tableFills);
//乐观锁
sc.setVersionFieldName("version");
sc.setRestControllerStyle(true);//驼峰命名
// sc.setTablePrefix("tbl_"); 设置表名前缀
sc.setInclude(scanner("表名,多个英文逗号分割").split(","));
mpg.setStrategy(sc);
// 生成代码
mpg.execute();
}
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
}
运行这个类,在命令行输入表名即可生成对应的mapper(dao)层,service层,entity层,controller层。
*需要我们在mysql里面创好对应的表
输入
然后得到
现在生成的几个类都有些问题需要修改,
entity类
改为
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
-
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
: 这个注解指定了LocalDateTime
类型在序列化为JSON字符串时的格式,即日期时间格式为"yyyy-MM-dd HH:mm:ss"。 -
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
: 这个注解指定了在反序列化JSON字符串为LocalDateTime
对象时所使用的自定义反序列化器,这里指定了LocalDateTimeDeserializer.class
,用于将JSON字符串转换为LocalDateTime
对象。 -
@JsonSerialize(using = LocalDateTimeSerializer.class)
: 这个注解指定了在序列化LocalDateTime
对象为JSON字符串时所使用的自定义序列化器,这里指定了LocalDateTimeSerializer.class
,用于将LocalDateTime
对象转换为JSON字符串。 -
@TableField(fill = FieldFill.INSERT_UPDATE)
: 这个注解是MyBatis Plus中的注解,指定了该字段在插入和更新操作时自动填充。FieldFill.INSERT_UPDATE
表示在插入和更新时填充该字段的值,一般用于记录数据的创建和修改时间。
mapper类
加上@Mapper注解
现在进行简单CRUD业务编写
Service类
package com.example.examservice.service;
import com.example.examservice.common.R;
import com.example.examservice.entity.Posts;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 服务类
* </p>
*
* @author liujianchen
* @since 2024-04-01
*/
public interface PostsService extends IService<Posts> {
R savePosts(Posts posts);
R pagePosts(int page, int pageSize, String name);
R getPostsById(Long id);
R deletePosts(Long id);
R updatePosts(Posts posts);
}
ServiceImpl类
package com.example.examservice.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.examservice.common.CustomException;
import com.example.examservice.common.R;
import com.example.examservice.entity.Course;
import com.example.examservice.entity.Posts;
import com.example.examservice.mapper.PostsMapper;
import com.example.examservice.service.PostsService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author liujianchen
* @since 2024-04-01
*/
@Service
public class PostsServiceImpl extends ServiceImpl<PostsMapper, Posts> implements PostsService {
@Override
public R savePosts(Posts posts) {
if (posts.getId() != null){
throw new CustomException("id重复");
}
posts.setIsDeleted(0);
this.save(posts);
return R.ok().message("成功生成帖子");
}
@Override
public R pagePosts(int page, int pageSize, String name) {
// 构造分页构造器
Page pageInfo = new Page(page, pageSize);
// 构造条件构造器
LambdaQueryWrapper<Posts> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(Posts::getIsDeleted, 0)
.like(StringUtils.checkValNotNull(name), Posts::getTitle, name);
this.page(pageInfo, queryWrapper);
return R.ok().data("page",pageInfo);
}
@Override
public R getPostsById(Long id) {
LambdaQueryWrapper<Posts> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(Posts::getIsDeleted, 0).eq(Posts::getId, id);
return R.ok().data("one",this.getOne(queryWrapper));
}
@Override
public R deletePosts(Long id) {
// 逻辑删除
LambdaUpdateWrapper<Posts> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(Posts::getId,id)
.set(Posts::getIsDeleted,1);
this.update(updateWrapper);
return R.ok().message("删除帖子成功");
}
@Override
public R updatePosts(Posts posts) {
this.updateById(posts);
return R.ok().message("修改帖子成功");
}
}
Controller类
package com.example.examservice.controller;
import com.example.examservice.common.R;
import com.example.examservice.entity.Course;
import com.example.examservice.entity.Posts;
import com.example.examservice.service.PostsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 前端控制器
* </p>
*
* @author liujianchen
* @since 2024-04-01
*/
@RestController
@RequestMapping("/posts")
public class PostsController {
@Autowired
private PostsService postsService;
/**
* 分页查询帖子信息
* @Param [page, pageSize, name]
* @return
*/
@GetMapping
public R page(int page, int pageSize, String name){
return postsService.pagePosts(page, pageSize, name);
}
/**
* 根据id查询帖子信息
* @Param [id]
* @return
*/
@GetMapping("/{id}")
public R getById(@PathVariable Long id){
return postsService.getPostsById(id);
}
/**
* 添加帖子信息
* @Param [posts]
* @return
*/
@PostMapping
public R save(@RequestBody Posts posts){
return postsService.savePosts(posts);
}
/**
* 更新帖子信息
* @Param [posts]
* @return
*/
@PutMapping
public R update(@RequestBody Posts posts){
return postsService.updatePosts(posts);
}
/**
* 删除帖子信息
* @Param [id]
* @return
*/
@DeleteMapping("/{id}")
public R delete(@PathVariable Long id){
return postsService.deletePosts(id);
}
}
结尾
到这里使用mybatisplus代码生成器,到编写实体类的简单增删查改所有操作就完成了。只要是单表操作,都可以一直按这个格式完成所有增删查改的业务流程。改个类名和实体类就是另一个实体类的增删查改~
下一篇讲使用Vue2和axios完成前后端请求发送和如何通信问题~