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;
private int blog_likes;
private int blog_browse;
}
CategoryBlog表
@Data
public class CategoryBlog {
private int category_id;
private long blog_id;
}
label表
@Data
public class labelBlog {
private int label_id;
private long blog_id;
}
现在我的需求就是查询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 int blog_likes;
private int blog_browse;
private int category_id;
private int label_id;
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> {
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(使用前将#替换为@)