mybatis多对一关联查询

多对一指的是在查询多方对象的时候,同时将其所关联的一方对象也查询出来。由于在查询多方对象时也是一个一个查询,所以多对一关联查询,其实就是一对一关联查询。即一对一关联查询的实现方式与多对一的实现方式是相同的。

修改javabean

数据库表还是使用之前t_player和t_team,这里要做一对多和一对一查询,所以需要在Player类中添加一个属性Team:

package com.monkey1024.bean;

/**
 * 篮球队员
 */
public class Player {

    private int id;

    private String name;

    private Team team;

    //省略getter和setter
}

创建一对一查询的mapper

这里先演示一对一的查询,创建PlayerMapper.xml文件在里面添加下面内容:

<resultMap id="playerMap" type="Player">
    <!--player中的基本属性-->
    <id column="pid" property="id"/>
    <result column="pname" property="name"/>

    <!--关联属性的映射关系-->
    <association property="team" javaType="Team">
        <id column="teamid" property="id"/>
        <result column="tname" property="name"/>
    </association>
</resultMap>


<select id="selectPlayerById" resultMap="playerMap">
    SELECT t.id teamid,t.name tname,p.id pid,p.name pname
    FROM t_team t , t_player p
    WHERE t.id = p.tid and p.id=#{id}
</select>

其中association标签体现Team和Player的关联关系:

  • property里面填写在Player类中的属性名称
  • javaType里面填写在Player类中的的属性类型

创建dao接口

创建PlayerDao接口,里面添加下面方法:

Player selectPlayerById(int id);

创建测试类

package com.monkey1024.test;

import com.monkey1024.bean.Player;
import com.monkey1024.bean.Team;
import com.monkey1024.dao.PlayerDao;
import com.monkey1024.dao.TeamDao;
import com.monkey1024.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

public class PlayerTest01 {

    private SqlSession sqlSession;

    private PlayerDao playerDao;

    /**
     * 测试时先执行该方法创建StudentDao对象
     */
    @Before
    public void initStudentDao(){
        sqlSession = MyBatisUtil.getSqlSession();
        //通过该方法可以获取TeamDao的对象
        playerDao = sqlSession.getMapper(PlayerDao.class);
    }

    /**
     * 执行完成后需要关闭sqlSession
     */
    @After
    public void closeSession() {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }

    @Test
    public void selectPlayerById() {
        Player player = playerDao.selectPlayerById(1);
        System.out.println(player);
    }



}

在mapper中添加多对一查询

<select id="selectPlayers" resultMap="playerMap">
    SELECT t.id teamid,t.name tname,p.id pid,p.name pname
    FROM t_team t , t_player p
    WHERE t.id = p.tid
</select>

在dao接口中添加方法

List<Player> selectPlayers();

添加测试方法

@Test
public void selectPlayers() {
    List<Player> players = playerDao.selectPlayers();
    System.out.println(players);
}