一对多关联查询指的是在查询一方对象的时候同时把跟他所关联的多方对象也查询出来,这里以篮球队和篮球运动员为例,一个篮球队关联着多个篮球队员。
创建数据库表
创建球队的表,里面有两个字段:
id:主键
name:球队名称
CREATE TABLE `t_team` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
创建球员的表,有三个字段:
id:主键
name:球员姓名
tid:所在球队的主键id
CREATE TABLE `t_player` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`tid` INT NULL,
PRIMARY KEY (`id`));
创建javabean
创建篮球运动员的类Player:
package com.monkey1024.bean;
/** * 篮球队员 */
public class Player {
private int id;
private String name;
public Player(String name) {
this.name = name;
}
public Player() {
}
@Override
public String toString() {
return "Player{" + "id=" + id + ", name='" + name + '\'' + '}';
}
//省略setter和getter
}
创建球队的类Team,这里将球员数据全部放到一个List集合中:
package com.monkey1024.bean;
import java.util.List;
/** * 篮球队 */
public class Team {
private int id;
private String name;
private List<Player> playerList;
@Override public String toString() {
return "Team{" + "id=" + id + ", name='" + name + '\'' + ", playerList=" + playerList + '}'; }
//省略setter和getter
}
需要注意的是若定义的类是双向关联,即双方的属性中均有对方对象作为域属性出现,那么它们在定义各自的 toString()方法时需要注意,只让某一方可以输出另一方即可,不要让双方的 toString()方法均可输出对方。这样会造成栈内存溢出的错误。
创建TeamMapper.xml映射文件:
此时涉及到两张表的操作,即使你的字段名和bean属性名一致也要编写resultMap来进行关联。
上面sql语句中的collection标签可以表示集合类型,其中:
- property中填写集合在Team这个bean中的属性名称,此时是playerList
- ofType中填写集合的泛型
在collection标签中填写的内容关联的是Player中的属性。
创建dao
这里创建一个TeamDao的接口,里面添加一个方法:
创建测试类
创建一个测试类用来执行上面的sql语句,注意不要忘了SqlSession和TeamDao对象的获取:
在执行成功后,可以看到查询出的数据只有一个Team对象,在该对象中的list属性里面存放了多个Player对象数据。