Java Fluent Mybatis 是一个 Mybatis 的扩展项目,它提供了一组高级的 API ,可以让你更加简洁、方便地构建 MyBatis 动态 SQL 查询语句。
Fluent Mybatis 中关于聚合查询的 API 章节是 Fluent-SQL-Query 的一个子集,主要提供了以下三个聚合查询的方法:
- groupBy: 根据列进行分组
- having: 过滤分组后的结果集
- aggregate: 对分组后的结果集执行一些聚合操作
下面将通过两个示例来讲解如何使用 Fluent Mybatis 来执行聚合查询。
示例一:统计课程拥有的学生数量
首先,我们需要定义两个表,一个是 Course 表,一个是 Student 表。
Course 表结构如下:
CREATE TABLE `course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`teacher_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
Student 表结构如下:
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
`course_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
接下来,我们使用 Mybatis Generator 自动生成对应的 Mapper 和 Model 类。
在 Mapper 接口中,我们定义一个聚合查询的方法来统计每个课程下面有多少个学生:
@FluentMybatisMapper
public interface CourseMapper extends FluentMapper<Course> {
@Select("SELECT course.name, COUNT(student.id) as student_count " +
"FROM course " +
"LEFT JOIN student ON course.id = student.course_id " +
"GROUP BY course.id")
@Results(
id = "CourseStudentCountResult", value = {
@Result(column = "name", property = "name", javaType = String.class),
@Result(column = "student_count", property = "studentCount", javaType = Integer.class)
})
List<CourseStudentCount> countStudentsByCourse();
}
上面我们使用了 SELECT 语句来进行查询,其中使用了 LEFT JOIN 将 student 表和 course 表进行了关联,接着使用 GROUP BY 子句,按照课程 id 进行分组,统计每个课程拥有的学生数量。最后通过 @Results 注解来将结果集映射到自定义的 CourseStudentCount 类中。
在 Model 类中,我们定义一个 CourseStudentCount 类,用来表示每个课程拥有的学生数量:
public class CourseStudentCount {
private String name;
private Integer studentCount;
// 省略 getter 和 setter 方法
}
通过以上方式,我们已经可以使用 Fluent Mybatis 来执行聚合查询了。下面将展示另一个示例。
示例二:根据最高成绩筛选学生
我们依然使用上面的 Student 表结构。
在 Mapper 接口中,我们使用聚合查询的方法来筛选每个学生中的最高成绩:
@FluentMybatisMapper
public interface StudentMapper extends FluentMapper<Student> {
@Select("SELECT student.id, student.name, student.age, MAX(score) as max_score " +
"FROM student " +
"GROUP BY student.id " +
"HAVING max_score >= #{minScore}")
@Results(
id = "StudentMaxScoreResult", value = {
@Result(column = "id", property = "id", javaType = Integer.class),
@Result(column = "name", property = "name", javaType = String.class),
@Result(column = "age", property = "age", javaType = Integer.class),
@Result(column = "max_score", property = "maxScore", javaType = Integer.class)
})
List<StudentMaxScore> selectByMaxScore(@Param("minScore") int minScore);
}
上面我们使用了 SELECT 语句进行查询,其中使用了 MAX函数来统计每个学生的最高成绩,接着使用 GROUP BY 子句按照学生 id 进行分组,最后通过 HAVING 子句筛选出最高成绩大于等于 minScore 的学生。同样使用 @Results 注解来映射结果集到自定义的 StudentMaxScore 类中。
在 Model 类中,我们定义一个 StudentMaxScore 类,它表示每个学生的最高成绩:
public class StudentMaxScore {
private Integer id;
private String name;
private Integer age;
private Integer maxScore;
// 省略 getter 和 setter 方法
}
最后,我们可以调用上面定义的 selectByMaxScore 方法来查询最高成绩大于等于 90 分的学生:
List<StudentMaxScore> students = studentMapper.selectByMaxScore(90);
通过以上方式,我们也成功使用 Fluent Mybatis 来执行聚合查询。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Fluent Mybatis 聚合查询与apply方法详解流程篇 - Python技术站