多对一:
多个学生对应一个老师
对于学生这边而言:(关联)多个学生关联一个老师【多对一】
建表:CREATE DATABASE mybatis;
use mybatis;
CREATE TABLE teacher(
id int(10) not null,
name VARCHAR(30) DEFAULT NULL,
PRIMARY KEY(id)
)DEFAULT CHARSET=utf8
INSERT INTO teacher(id ,name) VALUES(1,"小鑫老师");
CREATE TABLE student(
id int(10) not null,
name VARCHAR(30) DEFAULT NULL,
tid int(10) DEFAULT null,
PRIMARY KEY(id),
KEY fktid (tid),
CONSTRAINT fktid FOREIGN KEY (tid) REFERENCES teacher (id)
)DEFAULT CHARSET=utf8
INSERT INTO student(id ,name,tid) VALUES(1,"小顾",1);
INSERT INTO student(id ,name,tid) VALUES(2,"小鑫",1);
INSERT INTO student(id ,name,tid) VALUES(3,"小孟",1);
INSERT INTO student(id ,name,tid) VALUES(4,"小董",1);
步骤:
1.导入lombok
2.新建实体类Teacher,Student
3.建立Mapper接口
4.建立Mapper.xml文件
5.在核心配置文件中绑定注册Mapper的接口或者文件
6.测试查询是否成功
第一种:按照查询结果嵌套处理
<!-- 思路:
1.先查出全体学生
2.根据查询出来的学生的tid寻找对应的老师(类似于子查询)
-->
public List<Student> getstudent();
Teacher getTeacher(@Param("tid") int id);
<select id="getstudent" resultMap="StudentTeacher">
select * from mybatis.student ;
</select>
<resultMap id="StudentTeacher" type="student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!-- 复杂的属性需要单独处理
对象:association
集合:collection
-->
<association property="teacher" column="tid" javaType="teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="teacher">
select *from mybatis.teacher where id=#{id}
</select>
</mapper>
@Test
public void testStudent(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> studentList = mapper.getstudent();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
第二种:按照结果嵌套处理
public List<Student> getstudent1();
Teacher getTeacher1(@Param("tid") int id);
<select id="getstudent1" resultMap="StudentTeacher1">
select s.id sid, s.name sname, t.id tid,t.name tname
from mybatis.student s,
mybatis.teacher t
where s.tid = t.id;
</select>
<resultMap id="StudentTeacher1" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
@Test
public void testStudent1(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> studentList = mapper.getstudent1();
for (Student student : studentList) {
System.out.println(student);
}
sqlSession.close();
}
一对多
一个老师拥有多个学生
对于老师而言:(集合)一个老师,有很多个学生【一对多】
第一种:
<!--按照结果嵌套查询-->
private List<Student> students;
Teacher getteacher(@Param("tid") int id);
<select id="getteacher" resultMap="TeacherStudent">
select s.id sid, s.name sname, t.id tid, t.name tname
from mybatis.student s,
mybatis.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"/>
<!-- 集合用collection
javaType="" 指定属性的类型
ofType用来映射到List(或制定集合中)的泛型(pojo)信息
-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="id" column="tid"/>
</collection>
</resultMap>
@Test
public void test(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher getteacher = mapper.getteacher(1);
System.out.println(getteacher);
sqlSession.close();
}
第二种:子查询(没有教师tid,建议第一种)
Teacher getteacher2(@Param("tid") int id);
<select id="getteacher2" resultMap="TeacherStudent2">
select *from mybatis.teacher where id = #{tid};
</select>
<resultMap id="TeacherStudent2" type="teacher">
<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>
@Test
public void test1(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher getteacher = mapper.getteacher2(1);
System.out.println(getteacher);
sqlSession.close();
}
关于Spring的多表查询(多对一,一对多)
猜你喜欢
转载自blog.csdn.net/m0_74135466/article/details/127991169
今日推荐
周排行