mybatis多表查询一对一

用mybatis多表查询有两种方式:建立一个新的实体类,不建立实体类
一个新的实体类:
例子是联合两个表查询:第一个表是用户表user,第二个表是账户表account
用户user表
账户account表
其中账户表的uid字段是用户表的id
分别创建表的实体类:
user

public class User implements Serializable {

    private Integer id;
    private String username;
    private Date birthday;
    private String sex;


    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 Date getBirthday() {
        return birthday;
    }

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

    public String getSex() {
        return sex;
    }

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

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

account:

public class Account implements Serializable {

    private Integer id;
    private Integer uid;
    private double money;

    //从表实体应该包含一个主表实体的对象引用
 
    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 +
                '}';
    }
}

查询需要是user表的用户姓名和生日加上account表的所有信息,查询语句好写select a.*,u.username,u.birthday from account a,user u where u.id = a.uid;
但是难的是结果集如何封装,这个时候我们可以想到建一个新的实体类,将要查询的字段都放进去,然后将查询结果封装到这个实体类里面。
AccountUser:

public class AccountUser extends Account{

    private String username;
    private Date birthday;

    public String getUsername() {
        return username;
    }

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

    public Date getBirthday() {
        return birthday;
    }

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

    @Override
    public String toString() {
        return super.toString()+"    AccountUser{" +
                "username='" + username + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

这个类继承自account所以包含accout的所有属性,并且声明两个生日和用户名字段。
xml文件中:

<!--查询所有同时包含用户名和生日信息-->
    <select id="findAllAccount" resultType="accountuser">
        select a.*,u.username,u.birthday from account a,user u where u.id = a.uid;
    </select>

resultType里面写的是新建立的实体类。
第二种是不建立实体类,在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 super.toString()+"   Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}

这样就可以把结果集封装在这个类中,但是需要在xml中配置对应的字段。

<!--定义封装account和user的resultMap-->
    <resultMap id="AccountUserMap" type="account">
        <id property="id" column="aid"></id> //property对应表中的字段column对应查询语句中的字段并且表中的主键用<id> 其他字段用<result>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--一对一的关系映射:配置封装user的内容-->
        <association property="user" column="uid" javaType="user">
            <id property="id" column="id"></id>
            <result property="username" column="username"></result>
            <result property="birthday" column="birthday"></result>
            <result property="sex" column="sex"></result>
    </association>
    </resultMap>
    <!--查询所有-->
    <select id="findAll" resultMap="AccountUserMap">
        select u.*,a.id as aid,a.uid,a.money from account a,user u where u.id = a.uid;
    </select>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值