可以看到最后一行有一段是sql 条件语句

在这里插入图片描述

结果运行就报红了

在这里插入图片描述

原因:主要是因为在多行注释中嵌套了#注释的原因,只要在#注释前面加个\转义符号就好了

StudentMapper.java
public interface StudentMapper {
    /**
     * 查询所有的学生信息,以及对应的老师的信息
     * @return
     */
    public List<Student> getStudent();
}
StudentMapper.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="com.kuang.dao.StudentMapper">

    <!--
        这里的resultType是在核心配置里面设置了别名,所以是Student
        思路:
            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"/>
        <!--
            复杂的属性:我们需要单独处理
                不能像普通属性单单这样写,是错误的!!(这里举的例子是之前结果集映射时候的)
                <result property="password" column="pwd"/>
            如果Student类的属性是一个对象: association 关联的意思
            如果Student类的属性是一个集合: collection 集合的意思
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
        解析:为什么后面要跟一个javaType 和 select呢?
            javaType:
                因为我们知道这个属性(property="teacher")是一个引用类型(Teacher)
                所以就是说明这个属性是什么类型的,因为这个成员变量teacher是一个对象
                所以要给这个对象设置一个类型
            select:
                我们的目的是什么?就是将teacher的信息给查询出来,那么就需要根据column的值即tid的值
                就是获得学生类里的tid然后用这个tid去老师表里再查返回一个teacher对象

           和子查询很像mysql子查询(in)的实现
           #SELECT * from student s ,teacher t WHERE s.tid in (SELECT t.id from  teacher t)
        -->
        <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="Teacher">
        /*
        一种解析(有错误的):
        1.student中有teacher成员变量,而teacher不是基本类型,因此需要告诉mybatis这个对象从哪来(就是怎么才能查到并且初始化一个对象)
        2.在查询学生的语句中,写上resultMap来告诉mybatis我的teacher成员变量来自名为studentTeacher的结果映射
        3.在StudentTeacher结果映射中,我们需要写出teacher怎么来的,property写出teacher成员变量,select告诉mybatis我是通过下边的getTeacher获得teacher
        4.column标识getTeacher中缺省参数casual 值的来源是student表中的tid (ps:casual是随便的意思,你想填什么名字都可以)
        另一种解析(这说的没毛病):前面写的tid没用,都没给getTeacher传参不信你把 where id=\#{id}去掉照样能查出来,因为他建的表只有一个老师 看不出来
         */
        select * from mybatis.teacher where id=#{id}
    </select>
</mapper>

MyTest类

public class MyTest {
    @Test
    public void testStudent(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        List<Student> student = mapper.getStudent();
        for (Student stu : student) {
            System.out.println(stu);
        }
        sqlSession.close();
    }
}
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐