前言
为了使排序更加灵活,建议后端排序可以优化为“谁调用谁排序”。
代码实现
数据库设计
以学生表为例。
前端查询条件为姓名,住址。
Controller
简化后的controller层代码如下:
/**
* queryStudent[查询学生]
* @param name 姓名
* @param address 住址
* @param extendSort 排序
* @param paging 是否分页
* @param page 第几页
* @param size 页大小
* @return java.lang.Object
*/
@RequestMapping(value = "/query",method={RequestMethod.GET,RequestMethod.POST})
public Object queryStudent(
@RequestParam("name")String name,@RequestParam("address")String address,
@RequestParam(value = "extendSort", required = false) String extendSort,
@RequestParam("paging")Boolean paging, @RequestParam("page")Integer page,
@RequestParam("size")Boolean size
) {
if(paging){
PageInfo<Student> pageInfo = studentServer.queryStudentPageInfo(name,address,extendSort,page, size);
return JSON.toJSONString(pageInfo);
}else{
return JSON.toJSONString(studentServer.queryStudent(name,address,extendSort));
}
}
ServiceImpl
简化后的serviceImpl层代码如下:
1.分页查询。
@Override
public PageInfo<Student> queryStudentPageInfo(String name,String address,
String extendSort,Integer page,Integer size) {
PageHelper.startPage(page, size);
// 在此定义排序规则,不在sql中定义,因为有的sql没有必要进行排序,比如count(*).谁调用谁排序
PageHelper.orderBy(stringExtendSort.convertString(extendSort, "a", Student.class));
// 定义查询的Map
Map<String,Object> queryMap = new HashMap<>(16);
queryMap.put("name",name);
queryMap.put("address",address);
return new PageInfo<>(studentMapper.queryStudentByMap(queryMap));
}
2.不分页查询
/**
* queryStudent[查询学生,不分页]
* @param name
* @param address
* @param customSort 自定义排序字段
*/
@Override
public List<Student> queryStudent(String name,String address,String customSort) {
// 定义查询的Map
Map<String,Object> queryMap = new HashMap<>(16);
queryMap.put("name",name);
queryMap.put("address",address);
queryMap.put("customSort",stringExtendSort.convertString(customSort, "a", Student.class));
return studentMapper.queryStudentByMap(queryMap);
}
Mapper.xml
<select id="queryStudentByMap" parameterType="java.util.Map" resultMap="Student">
select a.id,
a.name,
a.address,
a.age
from test_student a
<where>
<if test="id != null">
and a.id = #{id}
</if>
<if test="name != null and name != ''">
and a.name like CONCAT('%', #{name}, '%')
</if>
<if test="address != null and address != ''">
and a.address like CONCAT('%', #{address}, '%')
</if>
<if test="age != null">
and a.age = #{age}
</if>
</where>
<choose>
<when test="customSort !=null and customSort != ''">
order by ${customSort}
</when>
<otherwise>
</otherwise>
</choose>
</select>
·文中提到的"stringExtendSort"属于保密代码,不便公示,请自行编写。
总结
其核心思想就是谁调用,谁排序,增加了代码的灵活性和可持续扩展性质。同时也减少了数据库开销。实际开发时,需要的问题往往更加复杂,建议根据实际情况进行扩充。
【2023-07】