StudentMapper:(接口很简单需要返回一个List)
package com.Li.dao;import com.Li.pojo.Student;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface StudentMapper {//查询所有学生的信息,以及对应的老师的信息.难点在于写出对的sqlpublic List getStudent();
}
StudentMapper.xml:(难点:嵌套查询,association是对对象的处理,相当于查询了两次之后拼接在了一起)
测试类增加的内容:
@Testpublic void testStudent(){SqlSession sqlSession = MybatisUtils.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List studentList = mapper.getStudent();for (Student student : studentList) {System.out.println(student);}sqlSession.close();}
成功!
第二种方式的接口:
public List getStudent2();
StudentMapper.xml:详解可以看里面的注释。
在这里做一个小小的修改就可以测试了。
成功!
个人感觉第二种方式比较易于理解,并且方便使用。
如果第一种方式要连接5个表的话,还需要多写5个select分散的语句再将他们连起来。
在做一件事的时候一定是分工明确的。sql就写sql,对应关系就搞对应关系,分工明确。实现高内聚。这样分块之后,可读性强,而且易于修改。
问题:我没有查询老师的id为什么结果会有老师的id???
这两种对应两种sql查询方式:
子查询
联表查询
配置基础环境:很简单。
创建moudule之后,复制06的这几个内容。pom.xml只需要导入一个lombox包就OK了
修改实体类,变为一对多。以下分别是Student和Teacher
package com.Li.pojo;import lombok.Data;@Data
public class Student {private int id;private String name;private int tid;
}
package com.Li.pojo;import lombok.Data;import java.util.List;@Data
public class Teacher {private int id;private String name;//一个老师拥有多个学生private List students;
}
编写这个
这个方式是我最喜欢的处理方式。
注意看注释的内容。里面有解析。
创建测试文件:
@Testpublic void Test(){SqlSession sqlSession = MybatisUtils.getSqlSession();TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher(1);System.out.println(teacher);sqlSession.close();}
测试成功!
第二种方式:(个人不推荐)
接口代码:
//子查询的方式实现Teacher getTeacher2(@Param("tid") int id);
TeacherMapper.xml:
测试代码:
@Testpublic void Test2(){SqlSession sqlSession = MybatisUtils.getSqlSession();TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher2(1);System.out.println(teacher);sqlSession.close();}
成功!
小结:
javaType:实体类中属性的类型。也就是参数的数据类型
ofType:泛型中才会出现。值为泛型中的数据类型。如List<某某某>,那么ofType的值就是某某某。
面试高频: