一对多:集合collection,一个老师有多个学生
多对一:关联association,多个学生关联一个老师
student表
teacher表
sql语句查询学生和关联的老师
select s.sid, s.sname,t.tname from mybatis_study.student s,mybatis_study.teacher t where s.tid=t.tid
1.多对一
pojo层
@Data public class Student { private int sid; private String sname; private Teacher teacher; }
@Data public class Teacher { private int tid; private String tname; }
mybatis-config.xml
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--mybatis的主配置文件--> <configuration> <!--导入外部配置文件,properties必须放在最上边--> <properties resource="db.properties"> <!--里面可以继续写属性,但是没外部文件的优先级高--> <property name="username" value="root"/> </properties> <!--日志--> <settings> <!-- <setting name="logImpl" value="STDOUT_LOGGING"/>--> <setting name="logImpl" value="LOG4J"/> </settings> <!--可以给实体类起别名--> <typeAliases> <typeAlias type="pojo.Teacher" alias="Teacher"></typeAlias> <typeAlias type="pojo.Student" alias="Student"></typeAlias> </typeAliases> <!--配置环境--> <environments default="development"> <!--环境变量--> <environment id="development"> <!--事务管理器--> <transactionManager type="jdbc"/> <!--数据源(连接池)--> <dataSource type="pooled"> <!--配置连接数据库的四个基本信息--> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--绑定接口--> <mappers> <mapper class="mapper.TeacherMapper"></mapper> <mapper class="mapper.StudentMapper"></mapper> </mappers> </configuration>
StudentMapper.java接口
List<Student> getStudent(); List<Student> getStudent2();
映射配置StudentMapper.xml
- 按照查询嵌套处理
<mapper namespace="mapper.StudentMapper"> <!-- 查询所有的学生 根据查询出来的学生的tid,寻找对应的老师 --> <select id="getStudent" resultMap="StudentTeacher"> select * from student </select> <select id="getTeacher" resultType="Teacher"> select * from teacher where tid = #{tid} </select> <resultMap id="StudentTeacher" type="Student"> <result property="sid" column="sid"></result> <result property="sname" column="sname"></result> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"></association> </resultMap> </mapper>
- 按照结果嵌套处理
<!--根据结果嵌套处理--> <select id="getStudent2" resultMap="StudentTeacher2"> select s.sid,s.sname,t.tname from student s,teacher,t where s.tid = t.tid; </select> <resultMap id="StudentTeacher2" type="Student"> <result property="sid" column="sid"></result> <result property="sname" column="sname"></result> <association property="teacher" javaType="Teacher"> <result property="tname" column="tname"></result> </association> </resultMap>
测试类
@Test public void getStudent2(){ SqlSession session = MybatisUtil.getSqlSession(); StudentMapper mapper = session.getMapper(StudentMapper.class); List<Student> student = mapper.getStudent(); for (Student student1 : student) { System.out.println(student1); } session.close(); }
2.一对多
sql语句查询
select s.sid,s.sname,t.tname,t.tid from teacher t,student s where t.tid = s.tid
pojo层
import lombok.Data; @Data public class Student { private int sid; private String sname; private int tid; } //Teacher.java @Data public class Teacher { private int tid; private String tname; private List<Student> students; }
接口TeacherMapper.java
public interface TeacherMapper { //根据指定老师查他的信息和学生 Teacher getTeacher1(@Param("tid") int tid); }
TeacherMapper.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="mapper.TeacherMapper"> <!--按结果嵌套处理--> <select id="getTeacher1" resultMap="TeacherStudent"> select s.sid,s.sname,t.tname,t.tid from teacher t,student s where t.tid = s.tid and t.tid = #{tid} </select> <resultMap id="TeacherStudent" type="Teacher"> <result property="tid" column="tid"></result> <result property="tname" column="tname"></result> <!--集合:collection 关联:association javaType:指定属性的类型,集合中的泛型信息,用ofType获取 --> <collection property="students" ofType="Student"> <result property="sid" column="sid"></result> <result property="sname" column="sname"></result> <result property="tid" column="tid"></result> </collection> </resultMap> </mapper>
- 按照查询嵌套处理
<!--按照查询嵌套处理--> <select id="getTeacher2"> select * from teacher where tid = #{tid} </select> <resultMap id="TeacherStudent2" type="Teacher"> <!--表字段和类属性名相同的可以省略不写--> <collection property="students" javaType="ArrayList" ofType="Student"></collection> </resultMap> <select id="getStudentByTeacherId" resultType="Student"> select * from student where tid = # {tid} </select>
Test
@Test public void getTeacher1(){ SqlSession session = MybatisUtil.getSqlSession(); TeacherMapper mapper = session.getMapper(TeacherMapper.class); Teacher teacher = mapper.getTeacher1(1); System.out.println(teacher); session.close(); }
Teacher(tid=1, tname=张老师, students=
[Student(sid=1, sname=小何, tid=1),
Student(sid=2, sname=小李, tid=1),
Student(sid=3, sname=小张, tid=1)])
小结
1.关联-association 【多对一】
2.集合-collection 【一对多】
3.JavaType 和 ofType
- JavaType:指定实体类属性的类型;
- ofType:指定映射到List集合中的pojo类型,泛型中的约束类型
个人推荐使用:按照结果嵌套处理