八.多对一处理

1.首先,设计2个表,一个stuent一个teacher,搞里头(偷懒使用了Lombok)


2.建立对应的实体类

package com.why.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @program: Mybatis_annotation
 * @description:
 * @author: @why
 * @create: 2020-08-29 10:25
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
    private  Integer id;
    private  String name;
}
package com.why.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @program: Mybatis_annotation
 * @description:
 * @author: @why
 * @create: 2020-08-29 10:25
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private  Integer id;
    private  String name;
    private  Integer tid;
    //根据tid可以得到每个学生所对应的老师,也就是多对一处理
    private  Teacher teacher;

}

接口

package com.why.Mapper;

import com.why.bean.Student;

import java.util.List;

/**
 * @program: Mybatis_annotation
 * @description:
 * @author: @why
 * @create: 2020-08-29 10:31
 **/
public interface StudentMapper {
    //得到学生信息以及每个学生所对应的老师的信息
    public List<Student> getMsgByStudent();
}

 

3.接着开始写xml 多对一使用的是association

第一种方式:按照结果嵌套处理

就是按照sql语句来进行对应的赋值,接着做结果集映射   ps:最好起一个别名

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.why.Mapper.StudentMapper">
    <select id="getMsgByStudent" resultMap="stuMsg">
select stu.id sid,stu.`name` sname,stu.tid stid,tea.id tid,tea.`name` tname from student stu
join  teacher tea
on stu.tid=tea.id;
    </select>
    <resultMap id="stuMsg" type="student">
        <!--        普通属性 按照别名来一一对应-->
        <result column="sid" property="id"/>
        <result column="sname" property="name"/>
        <result column="stid" property="tid"/>
        <!--         student的属性是有一个是teacher  此时它的类型是Teacher类型-->
        <association property="teacher" javaType="com.why.bean.Teacher">
<!--            开始赋值-->
         <result column="tid" property="id"/>
            <result column="tname" property="name"/>
        </association>
    </resultMap>

</mapper>

第二种:按照查询嵌套处理

我不咋喜欢的一种方式,先直接查询所有的信息,然后再将对应是信息做一个筛选,类似子查询

<?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="com.why.dao.studentMapper">
<!--我们先将所有学生的信息查出来 并将结果映射为一个map-->
<select id="getStudentAndTeacher"  resultMap="stuAndTeacher">
    select  * from student;
</select>
<!--    对学生map的映射-->
<resultMap id="stuAndTeacher" type="student">
    <result property="id" column="id"/> 
    <result property="name" column="name"/>
<!--    给student中的Teacher 属性绑定一个表 这个表的列名为tid 类型为Teacher  再绑定一个对Teacher表的查询 此时就会对另一个表按照对应的tid查询了-->
    <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"> </association>
</resultMap>
<!--对teacher表的查询-->
<select id="getTeacher" resultType="teacher">
    select  * from  teacher where id=#{id};
</select>

</mapper>

 

posted @ 2020-08-29 11:42  why666  阅读(117)  评论(0编辑  收藏  举报