多对一处理

生成数据

以学生老师为例

  1. CREATE TABLE `teacher` (
  2. `id` INT(11) NOT NULL,
  3. `name` VARCHAR(30) DEFAULT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=INNODB DEFAULT CHARSET=utf8
  6. INSERT INTO teacher(`id`, `name`) VALUES (1, '李永乐');
  7. CREATE TABLE `student` (
  8. `id` INT(11) NOT NULL,
  9. `name` VARCHAR(30) DEFAULT NULL,
  10. `tid` INT(11) NOT NULL,
  11. PRIMARY KEY(`id`),
  12. KEY `fktid` (`tid`),
  13. CONSTRAINT `fktid` FOREIGN KEY(`tid`) REFERENCES `teacher` (`id`)
  14. ) ENGINE=INNODB DEFAULT CHARSET=utf8
  15. INSERT INTO `student`(`id`, `name`, `tid`) VALUES
  16. (1, '小明', 1),(2, '小红', 1),(3, '小张', 1),(4, '小李', 1),(5, '小王', 1)

测试环境搭建

  1. 导入lombok
    <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.16.18</version>
     <scope>provided</scope>
    </dependency>
    
  1. 新建实体类Teacher,Student
    @Data
    public class Teacher {
     private Integer id;
     private String name;
    }
    
@Data
public class Student {
    private Integer id;
    private String name;
    private Teacher teacher;
}
  1. 建立Mapper接口
    public interface TeacherMapper {
     @Select("select * from teacher where id = #{id}")
     Teacher getTeacher(@Param("id") int id);
    }
    
public interface StudentMapper {
}
  1. 建立Mapper.xml文件 ```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">
    


```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">
<mapper namespace="com.tassel.dao.StudentMapper">

</mapper>
  1. 在核心配置文件中绑定注册我们的Mapper接口或者文件
    <mappers>
     <!-- 每一个mapper配置文件都要在mybatis核心配置文件中注册 -->
     <mapper class="com.tassel.dao.TeacherMapper"/>
    </mappers>
    
  1. 测试
    @Test
    public void test(){
     SqlSession sqlSession = MybatisUtil.getSqlSession();
     TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
     Teacher teacher = mapper.getTeacher(1);
     System.out.println(teacher);
     sqlSession.close();
    }
    

环境搭建成功。

多对一实例

案例:查询所有的学生和对应的老师信息,多个学生对应一个老师:关联

  • association:关联
  • collection:集合

方式一:按照查询嵌套查询

  1. 接口:StudentMapper.java
    // 查询所有的学生和对应的老师信息
    List<Student> getStudents();
    
  1. mapper文件:StudentMapper.xml
    <!--
    思路:
    1. 查询所有的学生信息
    2. 根据查询出来学生信息的tid,查询对应的老师     (子查询)
    -->
    <select id="getStudents" resultMap="StudentTeacher">
     select * from student
    </select>
    <resultMap id="StudentTeacher" type="student">
     <!-- Property:实体属性;column:数据库字段-->
     <id 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" parameterType="_int">
     select * from teacher where id = #{id}
    </select>
    
  1. 核心配置文件中绑定注册StudentMapper
    <!-- 给单独的实体类起别名 -->
    <typeAliases>
     <package name="com.tassel.pojo"/>
    </typeAliases>
    <mappers>
     <!-- 每一个mapper配置文件都要在mybatis核心配置文件中注册 -->
     <mapper class="com.tassel.dao.TeacherMapper"/>
     <mapper class="com.tassel.dao.StudentMapper"/>
    </mappers>
    
  1. 测试:

    @Test
    public void testStudent(){
     SqlSession sqlSession = MybatisUtil.getSqlSession();
    
     StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
     List<Student> students = mapper.getStudents();
     for (Student student : students) {
         System.out.println(student);
     }
     sqlSession.close();
    }
    


8.Mybatis多(一)对一(多) - 图1

方式二:按照结果嵌套查询

 <!-- 按照结果嵌套查询 -->
<select id="getStudents2" 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">
    <id property="id" column="sid"/>
    <result property="name" column="sname"/>
    <!-- 这里mybatis 自动对应Teacher的属性-->
    <association property="teacher" javaType="teacher">
        <result property="name" column="tname"/>
    </association>
</resultMap>

8.Mybatis多(一)对一(多) - 图2

一对多处理

环境搭建

  1. 创建实体类
    @Data
    public class Student {
     private Integer id;
     private String name;
     private Integer tid;
    }
    
@Data
public class Teacher {
    private Integer id;
    private String name;
    private List<Student> students;
}

一对多实例

案例:获取指定老师下的所有学生及老师的信息:一个老师对应多个学生:集合

  • association:关联
  • collection:集合
  1. 接口:TeacherMapper.java
    Teacher getTeacher(@Param("id") int id);
    
  1. mapper配置文件:TeacherMapper.xml ```xml



3. 
测试
```java
@Test
public void test(){
    SqlSession sqlSession = MybatisUtil.getSqlSession();
    TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
    Teacher teacher = mapper.getTeacher(1);
    System.out.println(teacher);
    sqlSession.close();
}


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)])
按照查询嵌套处理类似多对一(子查询)。

小结

  • association:关联 【多对一】
  • collection:集合 【一对多】
  • javaType:指定实体类中属性的类型
  • ofType:用来映射List或集合中的 pojo 类型 (泛型中的约束类型)