根据前一篇笔记我们已经实现了最简单的增删改查,现在如果我们对数据库查询有以下需求,
对 age 字段的查询、批量更新或者删除满足某个条件的数据、获取结果按照 age 大小 排序、获取满足条件的总数等等
现在就来一一实现。

实现以上条件用的主要是 生成的 Example 文件,在使用 generator 下拉表结构的时候,在实体类的文件里,(还是使用上一篇笔记中的例子)一共生成两个文件, Student.java 和 StudentExample.java,在 mapper 文件夹里生成了 StudentMapper.java。

Student.java 主要是对表字段的定义,包括 get 和 set 的一些方法,在上一篇笔记中,在创建数据的时候就用到了 对 date 字段数据的格式化。

StudentMapper.java 主要是对函数的定义,这些函数的具体实现方法则在 StudentExample.java 中实现

在我们这篇笔记里要实现的功能都在 StudentExample.java 中被实现。

好,接下来就让我们来实现上面说的那些功能。

1、返回 age 字段 大于 20 的数据,name 字段实现枚举搜索

要实现这个 API,我们先定义两个接口参数,age,name_list
API 代码如下:

package com.tutorial.controller;


import com.sun.org.glassfish.gmbal.ParameterNames;
import com.tutorial.entity.Student;
import com.tutorial.entity.StudentExample;
import com.tutorial.mapper.StudentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
public class StudentController {


    @Autowired
    private StudentMapper studentMapper;


    @PostMapping("getStudentByAgeRange")
    public List<Student> getStudentByAgeRange(
            Integer age,
            @RequestParam(value = "name_list") List<String> name_list
    ){
        StudentExample example = new StudentExample();
        StudentExample.Criteria criteria = example.createCriteria();


        if (age != null) {
            criteria.andAgeLessThanOrEqualTo(age);
        }


        if (name_list != null) {
            criteria.andNameIn(name_list);
        }

        // 按照 age 字段倒序排列
        example.setOrderByClause("-age”);
    
        // 获取 满足条件的总数
        long count = studentMapper.countByExample(example);
        System.out.println(count);

        List<Student> results = studentMapper.selectByExample(example);
        return results;
    }
}

当我们在定义 criteria 之后,对条件进行搜索,键入 criteria.and 之后可以看到后面会联想出很多方法,都是表字段的各种条件,包括 大于、大于等于、等于、包含、Null 的判断 等等。

对于每个字段,系统都帮我们自动生成了该字段的这些方法,可以直接使用。
如果是多个条件,直接 复用 criteria 在后面添加条件即可。

因为是搜索,所以用的是 selectByExample,相应的还有 deleteByExampleupdateByExample 用于对应的 更新和删除。

2、获取的结果按照 age 大小排序

排序则对 example 使用 setOrderByClause 方法,传递参数为 字段名,默认正序,前面添加 - 则为 倒序排列。

example.setOrderByClause("-age");

3、获取搜索条件的总数

在 sql 里就是 count(),在这里的话 就使用 countByExample()。

long count = studentMapper.countByExample(example);

如果需要对 返回的结果进行分页处理,这个处理放在下一篇笔记中。