列入:一个老师,对应多个学生 ; 对于老师而言: 一个老师有很多学生 【一对多】
代码
pojo包下的Student
package com.kuang.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//学生要关联老师;
private Teacher teacher;
}
Teacher
package com.kuang.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
dao 层
StudentMapper
package com.kuang.dao;
import com.kuang.pojo.Student;
import java.util.List;
public interface StudentMapper {
//多对一的关系:
//查询学生的所有信息;以及对应的老师的信息
public List<Student> getStudent();
public List<Student> getStudent2();
}
TeacherMapper
package com.kuang.dao;
import com.kuang.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface TeacherMapper {
//一对多的关系
@Select("select * from teacher where id = #{tid}")
Teacher getTeacher(@Param("tid") int id);
}
xml层
StudentMapper.xml
<?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.kuang.dao.StudentMapper">
<!--方式一 按照查询嵌套处理 -->
<!--思路:
1:查询所有的学生;
2:根据查询后的tid,寻找他们的老师; 子查询
-->
<select id="getStudent" resultMap="StudentTeacher">
select * from student
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--复杂的属性,要单独处理 association:对象 collection:集合-->
<!--javaType 用来指定实体类中的属性-->
<!--ofType用来指定映射到List或者pojo类型,泛型中的约束类型-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
select * from teacher where id = #{id}
</select>
<!--方式二 按照结果嵌套处理 联表查询-->
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid = t.id;
</select>
<resultMap id="StudentTeacher2" type="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<!--JavaType用来指定实体类中的属性-->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>
TeacherMapper.xml
<?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.kuang.dao.TeacherMapper">
</mapper>
绑定Mapper接口
<!--绑定接口-->
<mappers>
<mapper class="com.kuang.dao.TeacherMapper"/>
<mapper class="com.kuang.dao.StudentMapper"/>
</mappers>
测试
package com.kuang.dao;
import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void getTeacher(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(1);
System.out.println(teacher);
sqlSession.close();
}
//多对一
@Test
public void getStudent(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> student = mapper.getStudent();
for (Student student1 : student) {
System.out.println(student1);
}
sqlSession.close();
}
@Test
//多对一的方式二
public void getStudent2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> student2 = mapper.getStudent2();
for (Student student : student2) {
System.out.println(student);
}
sqlSession.close();
}
}
多对一:多个学生对应一个老师
package com.kuang.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//学生要关联一个老师;
private int tid;
}
Teacher
package com.kuang.pojo;
import lombok.Data;
import java.util.List;
@Data
public class Teacher {
private int id;
private String name;
//一个老师对应多个学生;
private List<Student> students;
}
dao层
StudentMapper
package com.kuang.dao;
import com.kuang.pojo.Student;
import java.util.List;
public interface StudentMapper {
}
TeacherMapper
package com.kuang.dao;
import com.kuang.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface TeacherMapper {
//获取老师;
// List<Teacher> getTeacher();
//获取指定老师下的所有的学生及老师的信息;
Teacher getTeacher(@Param("id") int id);
Teacher getTeacher2(@Param("id") int id);
}
xml层
StudentMapper.xml
<?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.kuang.dao.StudentMapper">
</mapper>
TeacherMapper.xml
<?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.kuang.dao.TeacherMapper">
<!--按照结果嵌套处理-->
<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
</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>
<!--==================================-->
<!--按照查询嵌套处理-->
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from mybatis.teacher where id = #{id}
</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>
</mapper>
绑定接口
<!--绑定接口-->
<mappers>
<mapper class="com.kuang.dao.TeacherMapper"/>
<mapper class="com.kuang.dao.StudentMapper"/>
</mappers>
测试
package com.kuang.dao;
import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void test(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(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();
}
@Test
public void getTeacher2(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher2 = mapper.getTeacher2(1);
System.out.println(teacher2);
sqlSession.close();
}
}
小结
1:关联 association【多对一】
2:集合 collection【一对多】
3:javaType 和 ofType
JavaType用来指定实体类中的属性;
ofType用来指定映射到List或者集合中pojo类型,泛型中的约束类型
注意点;
- 保证SQL的可读性,尽量通俗易懂;
- 注意一对多和多对一,属性名和字段的问题;
- 如果问题不好排查错误,可以使用日志,建议使用Log4j;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/71796.html