• 07_关于联表多对一、一对多的处理


    1、多对一的处理

      a) 数据库表的设计

     学生表student与老师表teacher

      b) 实体类

      c)编写映射文件student.mapper.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="cn.sxt.entity.student.mapper">
        <!-- 对于多对一处理有两种方式1、按结果嵌套处理2、按查询嵌套处理 -->
        <select id="getStudents" resultMap="StudentTeacher">
            select s.id sid,s.name sname,s.tid stid,t.id tid,t.name tname from student s,teacher t where s.tid = t.id
        </select>
        <resultMap type="Student" id="StudentTeacher">重点在这一块
            <id column="sid" property="id"/>
            <result column="sname" property="name"/>
            <association property="teacher" javaType="Teacher">
                <id column="tid" property="id"/>
                <result column="tname" property="name"/>
            </association>
        </resultMap>
    </mapper>

        第二种方式:按查询嵌套处理,有两种写法(这种方式相当于做了两次查询) 

    one

     这种方式student.mapper.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="cn.sxt.entity.student.mapper">
        <!-- 对于多对一处理有两种方式1、按结果嵌套处理2、按查询嵌套处理 
        <select id="getStudents" resultMap="StudentTeacher">
            select s.id sid,s.name sname,s.tid stid,t.id tid,t.name tname from student s,teacher t where s.tid = t.id
        </select>
        <resultMap type="Student" id="StudentTeacher">
            <id column="sid" property="id"/>
            <result column="sname" property="name"/>
            <association property="teacher" javaType="Teacher">
                <id column="tid" property="id"/>
                <result column="tname" property="name"/>
            </association>
        </resultMap>
        -->
        <select id="getStudents" resultMap="StudentTeacher">
            select * from student
        </select>
        <resultMap type="Student" id="StudentTeacher">
            <association property="teacher" column="tid" javaType="Teacher" select="cn.sxt.entity.teacher.mapper.getTeacher"></association>
        </resultMap>
    </mapper>

     teacher.mapper.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="cn.sxt.entity.teacher.mapper">
        <select id="getTeacher" resultType="Teacher">
            select * from teacher where id=#{id}
        </select>
    </mapper>

     另外还需要在mybatis.cfg.xml中添加配置

    two

    然后在mybatis.cfg.xml配置文件里面只写一个

     2、一对多的处理

    a) 数据库表和上面设计的一样不用改(数据库表的设计不受java代码两个实体之间关系的影响)

    b) 实体类要修改

    Student.java

    Teacher.java

    c) 编写映射文件 teacher.mapper.xml

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

    第二种方式:按查询嵌套处理,有两种写法(这种方式相当于做了两次查询)

     两种写法,和多对一第二种方式表达的两种写法的意思是一样的,只不过是把另一个mapper.xml映射文件中的查询放到了一个文件中了,所以此处只写一种

    teacher.mapper.xml

    student.mapper.xml

    package cn.sxt.dao;
    import java.io.IOException;
    import java.util.List;
    
    import org.apache.ibatis.session.SqlSession;
    
    import cn.sxt.entity.Student;
    import cn.sxt.entity.Teacher;
    import cn.sxt.util.MyBatisUtil;
    public class TeacherDao {
        public Teacher getTeacher(int id) throws IOException{
            SqlSession session = MyBatisUtil.getSession();
            Teacher teacher = session.selectOne("cn.sxt.entity.teacher.mapper.getTeacher",id);
            session.close();
            return teacher;    
        }
    }

    测试代码及结果

  • 相关阅读:
    vue过滤器filters
    vue指令
    java命令
    mysql的information_schema表
    es6 Object的keys values entries方法
    mysql information_schema.INNODB_TRX
    流动相似性例子
    【转】time 模块详解(时间获取和转换)
    查找——平衡二叉树的实现(代码超详细注释)
    py中变量名的“秘密”
  • 原文地址:https://www.cnblogs.com/djlindex/p/11386306.html
Copyright © 2020-2023  润新知