今天就跟大家聊聊有关MyBatis Plus实现多表联接、分页查询的方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
代码实现
entity、mapper、service、controller
使用了 MyBatisPlus 的代码生成器,自动生成大部分基础的代码,操作方法见之前的文章:
在 SpringBoot 中引入 MyBatisPlus 之 常规操作
1.实体
① Question
// import 省略
@TableName("t_question")
public class Question implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "问答主键id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "学生外键id")
@TableField("student_id")
private Integer studentId;
@ApiModelProperty(value = "问题内容")
private String content;
@ApiModelProperty(value = "问题发布时间,发布的时候后台自动生成")
private Date date;
@ApiModelProperty(value = "问题悬赏的积分")
private Integer value;
// getter、setter 省略
}
② Student
// import 省略
@TableName("t_student")
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "学生主键id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "学生名称")
private String name;
@ApiModelProperty(value = "学生密码")
private String password;
@ApiModelProperty(value = "学生积分数")
private Integer points;
@ApiModelProperty(value = "学生邮件地址")
private String email;
@ApiModelProperty(value = "学生手机号码")
private String phone;
@ApiModelProperty(value = "学生学号")
private String num;
@ApiModelProperty(value = "学生真实姓名")
@TableField("true_name")
private String trueName;
// getter、setter 省略
}
2.mapper
① StudentMapper
// import 省略
public interface StudentMapper extends BaseMapper<Student> {
}
② QuestionMapper
// import 省略
public interface QuestionMapper extends BaseMapper<Question> {
/**
*
* @param page 翻页对象,可以作为 xml 参数直接使用,传递参数 Page 即自动分页
* @return
*/
@Select("SELECT t_question.*,t_student.`name` FROM t_question,t_student WHERE t_question.student_id=t_student.id")
List<QuestionStudentVO> getQuestionStudent(Pagination page);
}
3、service
① StudentService
// import 省略
public interface StudentService extends IService<Student> {
}
② QuestionService
// import 省略
public interface QuestionService extends IService<Question> {
Page<QuestionStudentVO> getQuestionStudent(Page<QuestionStudentVO> page);
}
4、serviceImpl
① StudentServiceImpl
// import 省略
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements StudentService {
}
② QuestionServiceImpl
// 省略 import
@Service
public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> implements QuestionService {
@Override
public Page<QuestionStudentVO> getQuestionStudent(Page<QuestionStudentVO> page) {
return page.setRecords(this.baseMapper.getQuestionStudent(page));
}
}
5、controller
// 省略 import
@RestController
@RequestMapping("/common")
@EnableSwagger2
public class CommonController {
@Autowired
QuestionService questionService;
@Autowired
StudentService studentService;
@GetMapping("/getAllQuestionByPage/{page}/{size}")
public Map<String, Object> getAllQuestionByPage(@PathVariable Integer page, @PathVariable Integer size) {
Map<String, Object> map = new HashMap<>();
Page<Question> questionPage = questionService.selectPage(new Page<>(page, size));
if (questionPage.getRecords().size() == 0) {
map.put("code", 400);
} else {
map.put("code", 200);
map.put("data", questionPage);
}
return map;
}
@GetMapping("/getAllQuestionWithStudentByPage/{page}/{size}")
public Map<String, Object> getAllQuestionWithStudentByPage(@PathVariable Integer page, @PathVariable Integer size) {
Map<String, Object> map = new HashMap<>();
Page<QuestionStudentVO> questionStudent = questionService.getQuestionStudent(new Page<>(page, size));
if (questionStudent.getRecords().size() == 0) {
map.put("code", 400);
} else {
map.put("code", 200);
map.put("data", questionStudent);
}
return map;
}
}
6、MyBatisPlus 配置
// 省略 import
@EnableTransactionManagement
@Configuration
@MapperScan("com.cun.app.mapper")
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
/**
* 打印 sql
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
//格式化sql语句
Properties properties = new Properties();
properties.setProperty("format", "true");
performanceInterceptor.setProperties(properties);
return performanceInterceptor;
}
}
7、关联查询 VO 对象
// import 省略
public class QuestionStudentVO implements Serializable {
@ApiModelProperty(value = "问答主键id")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty(value = "学生外键id")
@TableField("student_id")
private Integer studentId;
private String name;
@ApiModelProperty(value = "问题内容")
private String content;
@ApiModelProperty(value = "问题发布时间,发布的时候后台自动生成")
private Date date;
@ApiModelProperty(value = "问题悬赏的积分")
private Integer value;
// getter、setter 省略
五、测试接口
1、没有关联的分页查询接口
http://localhost/common/getAllQuestionByPage/1/2
① json 输出
{
"code": 200,
"data": {
"total": 10,
"size": 2,
"current": 1,
"records": [
{
"id": 1,
"studentId": 3,
"content": "唐代,渝州城里,有一个性格开朗、乐观的小伙子,名叫景天。",
"date": 1534497561000,
"value": 5
},
{
"id": 2,
"studentId": 1,
"content": "雪见从小父母双亡,由爷爷唐坤抚养成人。",
"date": 1533201716000,
"value": 20
}
],
"pages": 5
}
}
② sql 执行
2、多表关联、分页查询接口
http://localhost/common/getAllQuestionWithStudentByPage/1/2
① json 输出
{
"code": 200,
"data": {
"total": 10,
"size": 2,
"current": 1,
"records": [
{
"id": 1,
"studentId": 3,
"name": "vv",
"content": "唐代,渝州城里,有一个性格开朗、乐观的小伙子,名叫景天。",
"date": 1534497561000,
"value": 5
},
{
"id": 2,
"studentId": 1,
"name": "cun",
"content": "雪见从小父母双亡,由爷爷唐坤抚养成人。",
"date": 1533201716000,
"value": 20
}
],
"pages": 5
}
}
② sql 执行
六、小结
写本文的原因:
①网上有做法不合时宜的文章(自定义page类、配置版)②官方文档使用的是配置版的,笔者采用注解版的
MyBatis 配置版 | MyBatis 注解版 |
---|
① 动态 sql 灵活、② xml 格式的 sql,可拓展性好 | ① 少一个设置,少一个错误爆发点、② 代码清晰优雅 |
看完上述内容,你们对MyBatis Plus实现多表联接、分页查询的方法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注天达云行业资讯频道,感谢大家的支持。