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
}
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
修改相应的映射配置文件
建立数据库和实体类一对一的对应关系
最后编写相应的测试类
测试结果:
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
在映射配置文件中进行相应的配置
添加测试类的方法
测试结果:
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}]}