Mybatis注解开发 多表查询

发布于 2021-03-01  959 次阅读


@Results 注解

代替的是标签<resultMap>
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(),@Result()})或@Results(@Result())

@Result 注解

代替了 <id> 标签和<result> 标签
@Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))

@One 注解(一对一)

代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用的 来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。。
使用格式:
@Result(column=" ",property="",one=@One(select=""))

@Many 注解(多对一)

代替了<Collection> 标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType
(一般为 ArrayList)但是注解中可以不定义;
使用格式:
@Result(property="",column="",many=@Many(select=""))

一对一关联映射

查询所有的账户以及他关联的用户信息,一个账户只能对应一个唯一的用户

在Account实体类中加入User

@Data
public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    //一个账户只可能对应一个用户
    private User user;
}

定义Account的mapper

public interface AccountMapper {

    //采用延迟加载
    @Select("select * from account")
    @Results(id = "accountMap",
            value = {
                    @Result(id = true, column = "id", property = "id"),
                    @Result(column = "uid", property = "uid"),
                    @Result(column = "money", property = "money"),
                    @Result(column = "uid",property = "user",one = @One(select = "com.it.mapper.UserMapper.findById",fetchType = FetchType.LAZY))
            }
    )
    List< Account> findAll();
}

解析
@Result(column = "uid",property = "user",one = @One(select = "com.it.mapper.UserMapper.findById",fetchType = FetchType.LAZY))

  • @One(select = "com.it.mapper.UserMapper.findById",fetchType = - FetchType.LAZY)) 调用usermapper中的根据id查询的方法,懒加载
  • column = "uid" 将account的uid作为查询参数
  • property = "user" 查到一个user对象的封装到user属性中

usermapper 中用一个通过userid查询user的接口

 @Select("select * from user where id = #{uid}")
    @ResultMap("userMap")
    User findById(Integer userId);

查询情况

@Test
    public void testFindAll(){
        List<Account> accounts = accountMapper.findAll();
    }


欢迎欢迎~热烈欢迎~