多对一和一对多是站的角度不同,班级和学生是典型的一对多关系。
        在数据库二维表中,无论是一对多还是多对一都是在多的方建一列引用一的方的主键值。
        而在面向对象的世界里面,是在一的方建多的方的容器型属性。该容器可以是数组、List、Set,在Mybatis中规定的是用List。

public class BanJi {
    private int id;
    private String name;
    private List<Student> stus;

    public List<Student> getStus() {
        return stus;
    }

    public void setStus(List<Student> stus) {
        this.stus = stus;
    }
 }

BanJiDao.java

public interface BanJiDao {
    //只查询班级
    List<BanJi> searchAll();
    //查询出班级以及其对应的多个学生
    List<BanJi> searchAll2();

}

BanJiDao.xml:

<select id="searchAll" resultType="entity.BanJi">
    select * from banji
    </select>
    <select id="searchAll2" resultMap="BjAndStu">
      select bj.id as bjid,bj.name as bj_name,s.* from  banji as bj left join  student as s on s.bj_id=bj.id
    </select>
    
    <resultMap id="BjAndStu" type="entity.BanJi">
        <id column="bjid" property="id"/>
        <result column="bj_name" property="name"/>
        <collection property="stus" ofType="entity.Student">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="gender" property="gender"/>
            <result column="age" property="age"/>
        </collection>
    </resultMap>

测试类:

public class TestOne {
    public static void main(String[] args) {
        SqlSession session = MybatisSqlSession.getSqlSession();
        BanJiDao bjDao = session.getMapper(BanJiDao.class);
        List<BanJi> list=bjDao.searchAll2();
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getId() + " " + list.get(i).getName());
            List<Student> stus = list.get(i).getStus();
            if (stus != null) {
                for (Student s : stus) {
                    System.out.println(s.getName());
                }
            }
        }
    }
}

        在MyBatis中,多对多,站在任何一方看,其实都是一对多的关系,所以对于实体的多对多关系,仍旧使用一对多的处理方案,而不像Hibernate和JPA有专门的处理方式。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐