mybatis-plus自定义多表分页查询

2023-05-16

mybati-plus多表分页查询

首先编写VO类,VO类包含了要查询的字段值,现在有如下几个表

blog表

@Data
public class Blog {
    @TableId(value = "blog_id", type = IdType.AUTO)
    private long blog_id; // 主键
    private String blog_title;
    private Timestamp blog_date;
    private String  blog_content;
    private String blog_cover;
    private String blog_description;
    private long user_id;
    private boolean blog_show;
}

blogData表

@Data
@TableName("blogdata")
public class BlogData {
    private long blog_id; // blog表的主键
    private int blog_likes;
    private int blog_browse;
}

CategoryBlog表

@Data
public class CategoryBlog {
    private int category_id;
    private long blog_id; // blog表的主键
}

label表

@Data
public class labelBlog {
    private int label_id;
    private long blog_id; // blog表的主键
}

现在我的需求就是查询blog的内容、标签、分类、点赞量和浏览量,这些数据分别村放在4个表中,那么我就需要将这4个表重新整合成一个类,那么新建一个NewBlogVo类

@Data
public class NewBlogVo {
    private long blog_id;
    private String blog_title;
    private Timestamp blog_date;
    private String  blog_content;
    private String blog_cover;
    private String blog_description;
    private long user_id;
    private boolean blog_show;

//    private BlogData blogData;
    // blogData
    private int blog_likes;
   private int blog_browse;
    // category


    private int category_id;

    // label

     private int label_id;

    // md markdown格式

     private String md_content;

}

xml编写 其中select中的 ID可以自己命名,resultype是NewBlogVo所在的位置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.user.Controller.Mapper.BlogVoMapper">
   
    <select id="selectBlogByPage" resultType="com.user.Vo.NewBlogVo">
        select b.blog_id,
               b.blog_title,
               b.blog_date,
               b.blog_content,
               b.blog_cover,
               b.blog_description,
               b.user_id,
               b.blog_show,
               bd.blog_likes,
               bd.blog_browse,
               lb.label_id,
               cb.category_id,
               md.md_content
        from blog b,category_blog cb,label_blog lb,blogdata bd,md md
        where b.blog_id = cb.blog_id and b.blog_id = lb.blog_id and b.blog_id = bd.blog_id and b.blog_id = md.md_id

</select>
</mapper>

在application.yml中添加xml文件扫描的位置,我的xml是放在resources下的Mapper下面

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false # 这个地方把我搞苦了

  mapper-locations: classpath:/Mapper/*.xml

mapper编写

@Mapper
public interface BlogVoMapper extends BaseMapper<NewBlogVo> {

    // 方法名要和xml中的ID相同
    IPage<NewBlogVo> selectBlogByPage(IPage<NewBlogVo> blogVoIPage);
}

实现类

@Service
public class BlogVoServiceImpl extends ServiceImpl<BlogVoMapper, NewBlogVo> implements BlogVoService {
    @Autowired
    private BlogVoMapper blogVoMapper;
    @Override
    public IPage<NewBlogVo> selectBlogByPage(int page, int size) {
        Page<NewBlogVo> blogVoPage = new Page<>(page,size,false);
        IPage<NewBlogVo> blogVoIPage;
        blogVoIPage = blogVoMapper.selectBlogByPage(blogVoPage);
        return blogVoIPage;
    }
}

controller

   @Autowired
    private BlogVoService blogVoService; 
    @GetMapping("/getBlog/{page}/{size}")
    public Result getBlogByPage(@PathVariable Integer page,@PathVariable Integer size) {
      
      return  result.ok(blogVoService.selectBlogByPage(page,size));
    }

小插曲

在配置完成多表分页查询之后,我发现SQL语句能正常执行,控制台也能输出正确SQL语句,但是数据就是拿不到,我一直以为是我的分页查询写的不对,前前后后找bug找了5个小时,恁是没有找到bug。然后我就尝试着去先一个表一个表查,查到的结果放到一个VO类中,虽然这样子比较麻烦。

但是,就在这个时候,发生了不可思议的事情,我使用mybatis-plus自带的list查询查出来的结果是空数据,不过size却不等于0,然后之前我测试通过的接口查出来的数据也为空,我突然就想到了我好像在application.yml的时候把mybatis-plus的驼峰命名删除了,导致实体类额数据库中的字段不匹配,然后我连忙将不使用驼峰命名打开,结果奇迹出现了,我今天下午找了一个下午的bug的多表分页查询有行了

mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false #取消驼峰命名

未取消驼峰命名前 这个失误浪费了我5个小时的时间找bug

{
    "success": true,
    "data": {
        "records": [
          null
        ],
        "total": 0,
        "size": 10,
        "current": 1,
        "orders": [],
        "optimizeCountSql": true,
        "hitCount": false,
        "countId": null,
        "maxLimit": null,
        "searchCount": false,
        "pages": 0
    },
    "message": null
}

取消驼峰命名后

{
    "success": true,
    "data": {
        "records": [
            {
                "blog_id": 9,
                "blog_title": "vue使用md-editor",
                "blog_date": 1678512797000,
                "blog_content": "",
                "blog_cover": "202303111331369b53f976ee414749b04822347b9119a2.jpg",
                "blog_description": "vue中使用markdown编辑器",
                "user_id": 1,
                "blog_show": true,
                "blog_likes": 0,
                "blog_browse": 0,
                "category_id": 9,
                "label_id": 9,
                "md_content": ""
            }
        ],
        "total": 0,
        "size": 10,
        "current": 1,
        "orders": [],
        "optimizeCountSql": true,
        "hitCount": false,
        "countId": null,
        "maxLimit": null,
        "searchCount": false,
        "pages": 0
    },
    "message": null
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis-plus自定义多表分页查询 的相关文章

  • 洛谷 P1233 木棍加工

    题目描述 一堆木头棍子共有n根 xff0c 每根棍子的长度和宽度都是已知的 棍子可以被一台机器一个接一个地加工 机器处理一根棍子之前需要准备时间 准备时间是这样定义的 xff1a 第一根棍子的准备时间为1分钟 xff1b 如果刚处理完长度为

随机推荐