Mybatis联合查询详解

关联关系反应到数据库中是主外键关系,外键肯定是定义在多方的,某个表中有外键,一定和某个表存在主外键关系,也就是充当着多方。
1、多对一的处理
  • 多对一的理解

            多个学生对应着一名老师
            从学生的角度,学生关联一个老师

老师学生实体类
public class student {
    private int id;
    private String name;
    private teacher teachers;
}
public class teacher {
    private int tid;
    private String tname;
}
学生dao层(接口)
public interface studentDao {
    List<student> getstudents();
}
学生mapper文件:
在这里实体取别名的方式处理字段相同,被覆盖的情况
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.com.Ycy.mybatsi.dao.studentDao">
        <select id="getstudents" resultMap="student_teacher">
            SELECT stu.id,stu.name,teacher.name AS teacher_name,teacher.id AS teacher_id FROM student stu,teacher
            WHERE stu.tid = teacher.id
        </select>
        <resultMap id="student_teacher" type="cn.com.Ycy.mybatsi.domain.student">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <association property="teachers" javaType="cn.com.Ycy.mybatsi.domain.teacher">
                <id column="teacher_id" property="tid"/>
                <result column="teacher_name" property="tname"/>
            </association>
        </resultMap>
</mapper>
代码分析:
namespace:接口的绑定 就是namespace的包名要和接口的包名一致
resultMap:结果集映射,值随便取,但是要与下前的resultMap的id值相同一致
type:说明结果集的类型时student类
<association property="teachers" javaType="cn.com.Ycy.mybatsi.domain.teacher">
    <id column="teacher_id" property="tid"/>
    <result column="teacher_name" property="tname"/>
</association>
property:是在类属性名
javaType:teacher的类型
因为这个是学生的配置文件(也可以叫接口的实现类,由之前的类转为xml文件)
<id column="id" property="id"/>
<result column="name" property="name"/>
<association property="teachers" javaType="cn.com.Ycy.mybatsi.domain.teacher">
    <id column="teacher_id" property="tid"/>
    <result column="teacher_name" property="tname"/>
</association>
上面的关联属性对应着下面的类的属性
public class student {
    private int id;
    private String name;
    private teacher teachers;
}
id是主键属性关联,result是非主键关联 column是表中的名称,property是类中属性名称(相对应的)
测试类:
    @Test
    public void test03(){
        SqlSession sqlSession = mybatisUtils.getSqlSession();
        studentDao mapper = sqlSession.getMapper(studentDao.class);
        List<student> students = mapper.getstudents();
        for (student student : students) {
            System.out.println(student);
        }
        sqlSession.close();
    }

2、一对多的处理
一对多的理解

            一个老师有多名学生
            从老师的角度,一个老师拥有一个群学生(集合)

public class teacher {
    private int tid;
    private String tname;
    private Set<student>Students;
}
public class student {
    private int id;
    private String name;
}
接口中:
public interface teacherDao {
    List<teacher> getTeachers();
}
teacherDao.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.com.Ycy.mybatsi.dao.teacherDao">
    <select id="getTeachers" resultMap="teacher_student">
        SELECT t.*,stu.id as teacher_id,stu.name as teacher_name FROM teacher t,student stu
        WHERE t.id=stu.tid
    </select>
    <resultMap id="teacher_student" type="cn.com.Ycy.mybatsi.domain.teacher">
        <id column="id" property="tid"/>
        <result column="name" property="tname"/>
        <collection property="Students" ofType="cn.com.Ycy.mybatsi.domain.student">
            <id column="teacher_id" property="id"/>
            <result column="teacher_name" property="name"/>
        </collection>
    </resultMap>
</mapper>
测试类
   @Test
    public void test02(){
        SqlSession sqlSession = mybatisUtils.getSqlSession();

        teacherDao mapper = sqlSession.getMapper(teacherDao.class);
        List<teacher> teachers = mapper.getTeachers();
        for (teacher teacher : teachers) {
            System.out.println(teacher);
        }
        sqlSession.close();
    }
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值