通过mybatis-puls查询学生在校成绩的排名情况,问题分析:
- 涉及多表进行查询
- 涉及mysql中的复合函数(AVG())
- 涉及sql相关的排序
解决方案:
- 可以通过@select注解,写相关的sql语句。来获取学生在校的平均成绩的排名
- 也可以通过xml,写相关的sql语句。来获取学生在校的平均成绩的排名
方法一:
@select注解
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.Map;
@Mapper
public interface ScoreMapper {
@Select("select rank from\n" +
"(select (@ranknum:=@ranknum+1) as 'rank',avgScore,id,name\n" +
"FROM(\n" +
"select AVG(score.scores) as avgScore ,user.id ,`user`.`name`\n" +
"from score left join user on score.user_id=user.id \n" +
"GROUP BY `user`.id HAVING SUM(score.scores))a ,(select (@ranknum :=0) ) b ORDER BY avgScore DESC )ab\n" +
"where `name`=#{name}")
Map select(String name);
}测试:
@SpringBootTest
class Test01ApplicationTests {
@Autowired
private ScoreMapper scoreMapper;
@Test
void contextLoads() {
String name="小树";
Map map=scoreMapper.select(name);
int rank=new Double((double)map.get("rank")).intValue();
System.out.println(name+"在校的平均成绩排名是:第"+rank+"名");
}
}

方法二:
xml
<?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.example.mapper.ScoreMapper">
<select id="select1" parameterType="string" resultType="map">
select rank from
(select (@ranknum:=@ranknum+1) as 'rank',avgScore,id,name
FROM(
select AVG(score.scores) as avgScore ,user.id ,`user`.`name`
from score left join user on score.user_id=user.id
GROUP BY `user`.id HAVING SUM(score.scores))a ,(select (@ranknum :=0) ) b ORDER BY avgScore DESC )ab
where `name`=#{name}
</select>
</mapper>数据库:

总结:
1.mybatis-plus中,lambda表达式没有某些复合函数(AVG等);
2.在书写sql语句的时候可以现在sql可视化器中先书写、运行,减少错误的产生。
版权声明:本文为abby_yaya原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。