1.(讲师接口)多条件组合查询带分页
一般用VO对象来封装查询条件,用该对象传递到接口中去。封装一个TeacherQuery对象用于封装条件。
@ApiModel(value = "Teacher查询对象", description = "讲师查询对象封装")
@Data
public class TeacherQuery implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "教师名称,模糊查询")
private String name;
@ApiModelProperty(value = "头衔 1高级讲师 2首席讲师")
private Integer level;
@ApiModelProperty(value = "查询开始时间", example = "2019-01-01 10:10:10")
private String begin;//注意,这里使用的是String类型,前端传过来的数据无需进行类型转换
@ApiModelProperty(value = "查询结束时间", example = "2019-12-01 10:10:10")
private String end;
}
注 :条件值拼接问题可以使用mbp中的wrapper和动态sql,我觉得使用还是使用动态sql比较好,对mybatis的书写加深印象。
在mapper映射文件EduTeacherMapper.xml中加入一个条件查询语句拼接条件。
首先是resultType和resultMap的区别
resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。
resultMap配置表和类名一一对应。就算字段名和属性名不一样也能映射出来。
<select id="pageQuery" resultType="com.lys.eduservice.entity.EduTeacher" >
SELECT *
FROM edu_teacher t
where 1 = 1
<if test="teacherQueryVo != null">
<if test="teacherQueryVo.name != null">
AND t.name LIKE concat('%',#{teacherQueryVo.name},'%')
</if>
<if test="teacherQueryVo.level != null">
AND t.level = #{teacherQueryVo.level}
</if>
<if test="teacherQueryVo.begin != null and teacherQueryVo.begin != '' and teacherQueryVo.end != null and teacherQueryVo.end != ''">
BETWEEN #{teacherQueryVo.begin} AND #{teacherQueryVo.end}
</if>
LIMIT #{page},#{limit}
</if>
</select>
今天一个下午在写一个接口,踩了各种坑,如果是接口的问题还好说,但连环境都没配好,我真的哭辽。
1.首先第一个是Mapper文件一直没绑定成功,如图所示
解决方法:
解决方法 ① 因为idea编译器的问题,在java文件下的mapper文件中xml不会进行编译,所以在相应的模块pom文件中加入
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
解决方法 ② 直接xml放在Resource文件夹下
2.此方法过后仍然没有解决,我觉得依然是配置文件的问题如下
解决方法:使用MBP相对应的mapper映射文件要对应好
3.最后终于解决过后,虽然接口出了问题,但已经过了一个下午了,能出现接口的问题基本问题都已经解决了,真的哭辽.(原因很简单,对mybatis运用不熟练)
4.最后一个问题很严重,出现了null值
解决:发现EduTeacherVo为空,所以在xml映射文件中加入if判断是否为空,,这样还是无法解决为空值问题。并且where后面1=1查询出了所有讲师
where 1= 1也可以用where标签
<select id="pageQuery" resultType="com.lys.eduservice.entity.EduTeacher" >
SELECT *
FROM edu_teacher t
where 1 = 1
<if test="teacherQueryVo != null">
<if test="teacherQueryVo.name != null">
AND t.name LIKE concat('%',#{teacherQueryVo.name},'%')
</if>
<if test="teacherQueryVo.level != null">
AND t.level = #{teacherQueryVo.level}
</if>
<if test="teacherQueryVo.begin != null and teacherQueryVo.begin != '' and teacherQueryVo.end != null and teacherQueryVo.end != ''">
BETWEEN #{teacherQueryVo.begin} AND #{teacherQueryVo.end}
</if>
LIMIT #{page},#{limit}
</if>
</select>
其实最大问题出现在这里,在参数列表中如果加入了@RequestBody,则接口不能用@GetMapping而是要用@PostMapping,不然其后的对象就为空值了。
那么来讲一下@RequestBody和@ResponseBody的区别
① @Responsebody 表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中
一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中
注解用于@Controller方法中,将结果用以Json数据格式返回。
② @RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
注:当使用该注解的时候相应的Mapping接口应该是PostMapping
@GetMapping("pageTeacherCondition/{page}/{limit}")
public R pageQuery(
@PathVariable Long page,
@PathVariable Long limit,
@RequestBody(required = false) TeacherQueryVo teacherQueryVo
){
//将当前页,和当前页的个数封装到page对象中
List<EduTeacher> records = eduteacherService.pageEduTeacherQuery(page,limit,teacherQueryVo);
long total = records.size();
return R.ok().data("records",records).data("total",total);
}