比如:一个老师拥有多个学生!
对于老师而言就是一对多的关系!
实体类
Student
package com.kuang.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//学生需要关联一个老师
private int tid;
}
Teacher
package com.kuang.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
接口
package com.kuang.dao;
import com.kuang.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface TeacherMapper {
List<Teacher> getTeacher();
//一对多 一个老师对应多个学生
//结果嵌套查询
Teacher getTeacherStudent(@Param("tid") int id);
//嵌套子查询
Teacher getTeacherStudent2(@Param("tid") int id);
}
结果集嵌套映射
<!--结果嵌套映射-->
<select id="getTeacherStudent" resultMap="STselect">
SELECT s.id sid,s.`name` sname, t.id tid, t.`name` tname from student s,teacher t WHERE s.tid=t.id AND t.id=#{tid}
</select>
<resultMap id="STselect" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
子查询嵌套
<!-- 子查询嵌套 -->
<select id="getTeacherStudent2" resultMap="getTeacherStu">
select * from mybatis.teacher where id =#{tid}
</select>
<resultMap id="getTeacherStu" type="Teacher">
<result property="id" column="id"/>
<collection property="students" javaType="ArrayList" ofType="Student" select="stu" column="id"></collection>
</resultMap>
<select id="stu" resultType="Student">
select * from mybatis.Student where tid =#{tid}
</select>
测试类
package com.kuang.dao;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void getTest(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
List<Teacher> teacher = mapper.getTeacher();
for (Teacher teacher1 : teacher) {
System.out.println(teacher1);
}
sqlSession.close();
}
@Test
public void getST(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacherStudent = mapper.getTeacherStudent(1);
System.out.println(teacherStudent);
sqlSession.close();
}
@Test
public void getST2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacherStudent = mapper.getTeacherStudent2(1);
System.out.println(teacherStudent);
sqlSession.close();
}
}
小结
关联 association 多对一
集合 collection 一对多
JavaType 用来指定实体类中属性的类型
OfType 泛型中的约束类型
注意点:保证SQL的可读性!
注意一对多和多对一中属性名和字段的问题!
如果问题不好排查,建议使用日志 ,建议使用Log4j
避免慢SQL


被折叠的 条评论
为什么被折叠?



