用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>