什么是DTO

DTO(Data Transfer Object) :数据传输对象, Service 或 Manager 向外传输的对象
是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索的数据。数据传输对象与数据交互对象或数据访问对象之间是一个不具备有任何行为除了存储和检索的数据。

普通的关联查询

表关系
对于DTO的理解和利用DTO做的查询优化
student学生表

    private Integer id;
    private String name;
    private Integer age;
    private String gender;
    private String cid;

    private Class aClass;

class班级表

    private Integer Id;
    private String name;
    private Integer num;

    private List<Student> stuList;

平时我们在进行一对一,一对多,多对多的关联查询的时候会在查询的方法上配置映射关系,通过关联的字段来配置方法路径进行映射。

 /**
     * 查询所有学生
     * @return
     */
    @Select("select * from student")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "name",column = "name"),
            @Result(property = "age",column = "age"),
            @Result(property = "gender",column = "gender"),
            @Result(property = "cid",column = "cid"),
             @Result(property = "aClass",column = "cid",one = @One(select = "cn.com.witsystem.dao.ClassMapper.findClassById",
                    fetchType = FetchType.LAZY)),
    })
    })
    public List<Student> findAll();

这就是一般我们关联时的配置。

对于DTO的理解和利用DTO做的查询优化
执行查询所有方法后发现,查询语句会执行许多条SQL。可以通过配置mybatis日志在控制台来查看执行的SQL语句。第一条是我们本身会执行的查询(findAll这个方法执行的查询),后面几条就是我们关联的方法执行的查询(findClassById这个方法执行的查询),用户越多,执行的SQL语句就越多。此时的数据量小,查询一般不会受太大影响,但是如果有几万条,几十万条数据,查询SQL语句是所占用的内存消耗会变得很大,因为每一个用户都会去额外的执行一条SQL,这个查询量是很庞大的。所以我们要对此时的查询进行优化。

查询优化

先看我们需要查询哪些字段,如果都需要可以都查询,然后把这些字段封装成一个dto,假设此时我们需要查询学生表中的id,姓名,性别,班级表中的id,班级名。创建studentDto类,封装数据。

@Data
public class StudentDto {
    private Integer id;
    private String name;
    private String gender;
    private Integer cid;
    private String className;
}

这里我们使用了lombok插件来封装数据。

 @Select("select s.id,s.name,s.gender,c.id as i,c.name as n from student s ,class c where s.cid = c.id")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "name",column = "name"),
            @Result(property = "gender",column = "gender"),
            @Result(property = "cid",column = "i"),
            @Result(property = "className",column = "n"),
    })
    List<StudentDto> findStuAndClass();

通过SQL语句来实现关联,因为班级类里面有些字段名和学生类的字段名一样,所以给字段取了别名,通过别名来映射属性。然后再调用接口。
对于DTO的理解和利用DTO做的查询优化
此时执行的SQL语句就只有一条了。极大的减少了内存的消耗。

相关文章: