MyBatis多表查询

案例一:查询所有账单信息 关联用户信息
首先准备好数据库account表 创建好account表
CREATE TABLE account (
ID int(11) NOT NULL COMMENT '编号',
UID int(11) default NULL COMMENT '用户编号',
MONEY double default NULL COMMENT '金额',
PRIMARY KEY (ID),
KEY FK_Reference_8 (UID),
CONSTRAINT FK_Reference_8 FOREIGN KEY (UID) REFERENCES user (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
编写相应的sql语句进行测试以下 这里涉及到多表查询

查询结果:

编写账户实体类 并且给出相应的setter和getter方法
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表中不存在的列 一个账户对应一个用户 这里我们可以采取重新定义一个pojo类来进行接收最后的返回结果
定义一个AccountUser来进行接收:
public class AccountUser extends Account implements Serializable {
private String username;
private String address;

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;
}

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

}
接下来就是和原来相同的步骤了
1、新建一个持久层接口类iaccountdao 在里面添加相应的方法 比如说我们要查询所有账户
public interface IAccountDao {
public List findAll();
}
2、然后我们需要建立相应的映射配置文件IAccountDao.xml 在里面进行如下的配置

3、然后在主配置文件中进行映射文件的配置

4、最后编写相应的测试类

5、测试结果
Account{id=1, uid=41, money=1000.0}AccountUser{username='老王', address='北京'}
Account{id=2, uid=45, money=1000.0}AccountUser{username='二王', address='南京'}
Account{id=3, uid=41, money=2000.0}AccountUser{username='老王', address='北京'}
总结:一对一的多表查询一般是定义一个新的pojo类来对返回的结果进行封装

方法二:可以使用resultMap来建立用于映射一对一的查询结果
首先 修改AccountS实体类 里面添加一个User属性 并且给定相应的setter和getter方法 这样我们就可以用这个account来封装最后的查询结果
另外 我们在持久层接口中的相应的方法也需要进行修改
public List findAll();
修改相应的映射配置文件

建立数据库和实体类一对一的对应关系
最后编写相应的测试类

测试结果:
Account{id=1, uid=41, money=1000.0, user=User{id=1, username='老王', sex='null', birthday=null, address='北京'}}
Account{id=2, uid=45, money=1000.0, user=User{id=2, username='二王', sex='null', birthday=null, address='南京'}}
Account{id=3, uid=41, money=2000.0, user=User{id=3, username='老王', sex='null', birthday=null, address='北京'}}
一对多也是相同的处理方法
假如我们查询的是所有用户以及他们关联的账户信息 一个用户可能对应多个账户 所以是一对多的关系
编写相应的sql语句

测试查询结果:

可以在user中添加一个account类的集合
在用户持久层添加相应的方法
public List findAllUser();
在映射配置文件中进行相应的配置


添加测试类的方法

测试结果:
User{id=41, username='老王', sex='男', birthday=Tue Feb 27 17:47:08 CST 2018, address='北京', accounts=[Account{id=41, uid=41, money=1000.0, user=null}]}
User{id=43, username='小王', sex='女', birthday=Sun Mar 04 11:34:34 CST 2018, address='深圳', accounts=[Account{id=43, uid=null, money=null, user=null}]}
User{id=45, username='二王', sex='男', birthday=Sun Mar 04 12:04:06 CST 2018, address='南京', accounts=[Account{id=45, uid=45, money=1000.0, user=null}]}
User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津', accounts=[Account{id=46, uid=null, money=null, user=null}]}

posted @ 2019-11-29 10:14  菜鸟phantom卡卡  阅读(146)  评论(0编辑  收藏  举报