用mybatis多表查询有两种方式:建立一个新的实体类,不建立实体类
一个新的实体类:
例子是联合两个表查询:第一个表是用户表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>