总结mybatis多表查询(注解方式,注解详细说明)

总结mybatis多表查询(注解方式)

前言

在之前的总结mybatis多表查询(xml方式)的博客中,已经对多表查询做了一定的介绍,而且总结了基于xml的mybatis多表查询,一些通用的技术点可以翻阅上一篇博客。这次我们总结基于注解的mybatis多表查询。多对多查询的xml和注解方式我会再写个博客。

数据库表及关系

为了方便查看,这里再次给出user和account表
在这里插入图片描述
在这里插入图片描述

一对多查询

首先和xml方式一样,我们要在User实体类中添加List accounts的集合成员变量,表示一对多映射关系,主表实体含有从表实体的集合引用。

public class User implements Serializable {
    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;
    //一对多映射关系,主表实体含有从表实体的集合引用
    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

由于采用注解方式,所以我们不需要再配置xml,直接在dao接口中进行注解。
可以发现其实注解进行封装映射配置和xml配置非常类似,注解和xml标签可以对应上。

public interface IUserDao {
    /**
     * 查询所有用户并携带账户信息
     *
     * @return
     */
    //select注解用于查询操作,内容为查询语句
    @Select("select * from user")
    //用于封装user
    @Results(id = "userMap",value = {
            //id表示主键
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "username",property = "username"),
            @Result(column = "address",property = "address"),
            @Result(column = "sex",property = "sex"),
            @Result(column = "birthday",property = "birthday"),
            //定义一对多的关系映射,实现对account的封装
            //        @Many注解用于一对多或多对多查询使用
            //        select属性指定内容:查询用户的唯一标识
            //        column属性指定内容:用户根据id查询账户是所需要的参数
            //        fetchType属性指定内容:指定延时查询FetchType.LAZY或立即查询FetchType.EAGER
            @Result(property = "accounts",column = "id",many = @Many(select = "com.cc.dao.IAccountDao.findByUid",fetchType = FetchType.LAZY))
    })
    List<User> findAll();
      /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    @Select("select * from user where id = #{id}")
    User findById(Integer id);
}

这里对注解详细说明一下
@select注解,我们需要查询时用到的注解,里面放查询语句。我们可以点开源码看一下,它只有一个value属性,所以我们不需要写属性名。

在这里插入图片描述
可以发现我们注解配置查询语句相比于xml配置简单了很多,这是为什么?
我们画张图来解释一下,见图就懂。
在这里插入图片描述

@Results注解,这个注解其实功能相当于xml配置中的resultMap标签,我们也可以点开源码看一下。id相当于resultMap的id标签,@result注解相当于resultMap下的result标签。

在这里插入图片描述

最后@result注解,属性和result标签很类似,这里说明两个属性。@one和@many,其实也就相当于association标签和collection标签,表示一对一和一对多映射。

在这里插入图片描述
点开@one注解和@many注解发现属性都是一样的。
select属性指定内容:查询用户的唯一标识
fetchType属性指定内容:指定延时查询FetchType.LAZY或立即查询FetchType.EAGER。还有一个默认FetchType.DEFAULT,默认是立即查询。
在这里插入图片描述
然后我们就可以测试了,测试代码和结果和总结mybatis多表查询(xml方式)博客中的一样,这里就不再给出了。

多对一及一对一查询

和xml配置一样,首先我们在account实体类中加入user成员变量表示一对一映射。

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    //从表实体应该包含一个主表实体的对象引用
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}

然后配置在accountDao接口中注解,注解解释在上面已经给出。

public interface IAccountDao {
    /**
     * 查询所有账户,并携带用户信息
     * @return
     */
    @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(property = "user",column = "uid",one = @One(select = "com.cc.dao.IUserDao.findById",fetchType = FetchType.EAGER))
    })
    List<Account> findAll();

    /**
     * 根据用户id查询账户
     * @param uid
     * @return
     */

    @Select("select * from account where uid = #{uid}")
    List<Account> findByUid(Integer uid);
}

测试当然也是相同,这里也不再给出,大家可以点开头连接。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值