要想在Mybatis中使用多表查询,一般有如下几个步骤:

  • 创建表的实体类,根据一对一还是多对多还是一对多,在实体类中对另一实体的对象或者集合进行引用
  • 创建映射配置文件,或者使用注解,指明结果集的封装策略

在本篇文章中,我们主要来看如何在DAO文件中指明结果集的封装策略

1.一对一

/**
 * 查询所有账户,及每个账户下对应的用户信息
 * @return
 */
@Select("select * from account")
@Results(id="accountMap", value={
        // 封装Account数据
        @Result(id=true, column = "id", property = "id"),
        @Result(column = "uid", property = "uid"),
        @Result(column = "money", property = "money"),

        //封装user数据,不使用左外连接的方式,colum表示用哪个字段去查,select表示用什么方法查,
        @Result(property = "user", column = "uid", one = @One(select = "com.eastnotes.dao.IUserDao.findById", fetchType = FetchType.EAGER))
})
List<Account> findAll();

在xml的方式中,我们使用的是sql语句的左外连接来获取最终的数据,然后再进行封装,而在注解的方式中是先把账户都查出来,然后根据uid去查询用户的数据,在最后一个@Result标签中,property指定的是account实体类引用的User对象属性名,colum表示按照account的哪个列去查询User数据,select表示使用哪个函数去查询数据,fetchType指定的是加载方式,EAGER表示立即加载,LAZY表示延迟加载。

2.多对多

首先在User实体类中添加Account的集合引用,然后在IUserDAO的接口中配置封装策略:

/**
 * 查询所有用户,及对应的所有的账户信息
 * @return
 */
@Select("select * from user")
@Results(id = "userMap",value={
        //封装User数据
        @Result(id=true, column = "id", property = "userId"),
        @Result(column = "username", property = "userName"),
        @Result(column = "address", property = "userAddress"),
        @Result(column = "sex", property = "userSex"),
        @Result(column = "birthday", property = "userBirthday"),

        //封装Account数据
        @Result(property = "accounts", column = "id", many = @Many(select = "com.eastnotes.dao.IAccountDao.findAccountById", fetchType = FetchType.LAZY))
})
List<User> findAll();

使用多对多的时候,使用的是@Many的标签,一对多或多对多的时候使用的加载策略一般是延迟加载。