比如:一个老师有多个学生!
环境搭建(mybatis-06)
1.导入lombok依赖,写配置文件
2.新建实体类Teacher,Student
package com.kwok.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private int tid;
}
package com.kwok.pojo;
import lombok.Data;
import java.util.List;
// 实体类
@Data
public class Teacher {
private int id;
private String name;
/*一个老师拥有多个学生*/
private List<Student> students;
}
3.建立Mapper接口
4.建立Mapper.xml文件
5.在核心配置文件中绑定注册我们的Mapper接口或者文件!【方式很多】
6.测试查询是否能够成功
按照结果嵌套查询(推荐)
// 获取老师信息及所教的所有学生
Teacher getTeacher2(@Param("tid") int id);
<!--按照结果嵌套查询-->
<select id="getTeacher2" resultMap="TeacherStudent">
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="TeacherStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!--复杂的属性,我们需要单独处理 对象:association 集合:collection
javaType指定属性的类型!
集合中的泛型信息,我们使用ofType获取
-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
@Test
public void getTeacher2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher2(1);
System.out.println(teacher);
/*
Teacher(id=1, name=王老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])
*/
sqlSession.close();
}
按照查询嵌套处理
Teacher getTeacher3(@Param("tid") int id);
<!--按照查询嵌套处理-->
<select id="getTeacher3" resultMap="TeacherStudent3">
select * from teacher where id = #{tid}
</select>
<resultMap id="TeacherStudent3" type="Teacher">
<collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherID" column="id"/>
</resultMap>
<select id="getStudentByTeacherID" resultType="Student">
select * from student where tid = #{tid}
</select>
@Test
public void getTeacher3(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher3(1);
System.out.println(teacher);
/*
Teacher(id=1, name=王老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])
*/
sqlSession.close();
}
小结
1.关联- association 【多对一】
2.集合- colection 【一对多】
3.javaType & ofType
- JavaType 用来指定实体类中属性的类型
- ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!
注意点:
-
保证SQL的可读性,尽量保证通俗易懂
-
注意一对多和多对一中,属性名和字段的问题!
-
如果问题不好排查错误,可以使用日志,建议使用Log4j
-
要避免满SQL