一个老师拥有多个学生
对于老师而言,就是一对多的关系
- 搭建环境,和刚才一样
实体类
package com.mybatis.pojo;
import lombok.Data;
@Data
class Student {
private int id;
private String name;
private int tid;
}
package com.mybatis.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
//一个老师拥有多个学生
private List<Student> students;
}
按照查询嵌套处理
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration核心配置文件-->
<mapper namespace="com.mybatis.dao.TeacherMapper">
<!--按照查询嵌套处理-->
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from mybatis.teacher where id = #{tid}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<result property="id" column="id"/>
<result property="name" column="name"/>
<collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from mybatis.student where tid = #{tid}
</select>
</mapper>
按照结果嵌套处理
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--configuration核心配置文件-->
<mapper namespace="com.mybatis.dao.TeacherMapper">
<!--按照结果嵌套查询-->
<!-- <select id="getTeacher" resultType="Teacher">
select * from mybatis.teacher
</select>-->
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid ,s.name sname , t.name tname ,t.id tid
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>
</mapper>
测试
import com.mybatis.dao.TeacherMapper;
import com.mybatis.pojo.Teacher;
import com.mybatis.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class MyTest {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher2(1);
System.out.println(teacher);
//Teacher teacher = mapper.getTeacher();
//System.out.println(teacher);
sqlSession.close();
}
}
小结
1.关联- association 【多对一】
2.集合- collection 【一对多】
3.javaType & ofType
1.javaType
用来指定实体类中属性的类型
2.ofType
用来指定映射到List或集合中的pojo类型,泛型中的约束类型
注意点:
- 保证sql的可读性,尽量保证通俗易懂
- 注意一对多和多对一中,属性名和字段的问题
- 如果问题不好排查错误,可以使用日志,建议使用log4J
面试高频
- Mysql引擎
- InnoDb底层原理
- 索引
- 索引优化