• MyBatis学习总结—实现关联表查询


    1、数据库表结构

    CREATE TABLE teacher(
        t_id INT PRIMARY KEY AUTO_INCREMENT, 
        t_name VARCHAR(20)
    );
    CREATE TABLE class(
        c_id INT PRIMARY KEY AUTO_INCREMENT, 
        c_name VARCHAR(20), 
        teacher_id INT
    );
    ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);    
    
    INSERT INTO teacher(t_name) VALUES('teacher1');
    INSERT INTO teacher(t_name) VALUES('teacher2');
    
    INSERT INTO class(c_name, teacher_id) VALUES('class_a', 1);
    INSERT INTO class(c_name, teacher_id) VALUES('class_b', 2);

    2、定义实体

      2.1 TeacherEntity类,TeacherEntity类是teacher表对应的实体类。

    package com.test.model;
    
    //Teacher实体类
    public class TeacherEntity {
        private int tid;
        private String tname;
        private ClassEntity classEntity;
    
        public void setTid(Integer tid) {
            this.tid = tid;
        }
    
        public Integer getTid() {
            return tid;
        }
    
        public void setTname(String tname) {
            this.tname = tname;
        }
    
        public String getTname() {
            return tname;
        }
    
        public void setClassEntity(ClassEntity classEntity) {
            this.classEntity = classEntity;
        }
    
        public ClassEntity getClassEntity() {
            return classEntity;
        }
    }

      2.2 ClassEntity类,ClassEntity类是class表对应的实体类。

    package com.test.model;
    
    //Class实体类
    public class ClassEntity {
        private int cid;
        private String cname;
        private int teacherid;
    
        public void setCid(Integer cid) {
            this.cid = cid;
        }
    
        public Integer getCid() {
            return cid;
        }
    
        public void setCname(String cname) {
            this.cname = cname;
        }
    
        public String getCname() {
            return cname;
        }
    
        public void setTeacherid(Integer teacherid) {
            this.teacherid = teacherid;
        }
    
        public Integer getTeacherid() {
            return teacherid;
        }
    }

      这里需要注意的是,在TeacherEntity类里申明ClassEntity实体

    3、定义sql映射文件TeacthMapper.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.test.dao.TeacherMapper" >
    
        <resultMap type="com.test.model.TeacherEntity" id="resultTeacherList">
         <!-- 用id属性来映射主键字段 -->
    <id property="tid" column="t_id"/>
    <!-- 用result属性来映射非主键字段 -->

    <result property="tname" column="t_name"/>
            <association property="classEntity" javaType="com.test.model.ClassEntity">
                <id property="cid" column="c_id"/>
                <id property="cname" column="c_name"/>
                <id property="teacherid" column="teacher_id"/>
            </association>
        </resultMap>
    
        <select id="getList" resultType="com.test.model.TeacherEntity" resultMap="resultTeacherList">
          select t.t_id,t.t_name,c.c_id,c.c_name,c.teacher_id from teacher t,class c where t.t_id=c.teacher_id
        </select>
    </mapper>

    MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下:

      1、resultMap > type 是TeacherEntity实体类

      2、resultMap > id属性,要和下面select > resultMap对应

      3、resultMap 下的id标签对应sql语句查询teacther表的字段

      4、association > property的值是TeacherEntity里申明的ClassEntity的属性

      5、association > javaType的值是ClassEntity实体类

      6、association 下的 id标签是对应sql语句查询class表的字段

      补充说明:

    • property:对象属性的名称
    • javaType:对象属性的类型
    • column:所对应的外键字段名称
    • select:使用另一个查询封装的结果

    4、定义TeacthMapper.java查询实现接口

    package com.test.dao;
    
    import com.test.model.TeacherEntity;
    
    import java.util.List;
    
    public interface TeacherMapper {
        List<TeacherEntity> getList();
    }

    5、编写单元测试代码

    package com.test.controller;
    
    import com.test.dao.TeacherMapper;
    import com.test.model.TeacherEntity;
    import net.sf.json.JSONArray;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import java.util.List;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:dispatcher-servlet.xml"})
    public class test {
        @Autowired
        TeacherMapper teacherMapper;
    
        @Test
        public void demo(){
    
          List<TeacherEntity> teacherList =teacherMapper.getList();
          System.out.println(JSONArray.fromObject(teacherList));
        }
    }

    6、查询结果

    [{
        "tname": "teacher1",
        "classEntity": {
            "teacherid": 1,
            "cname": "class_a",
            "cid": 1
        },
        "tid": 1
    }, {
        "tname": "teacher2",
        "classEntity": {
            "teacherid": 2,
            "cname": "class_b",
            "cid": 2
        },
        "tid": 2
    }]
  • 相关阅读:
    Delphi 与 C/C++ 数据类型对照表
    JAVA中堆和栈的区别
    关于Column '*' not found 解决方案 Hibernate使用SQL查询返回实体类型,即返回某个类,或实体类
    Oracle笔记
    oracle时间运算
    struts2中iterator标签的相关使用
    url传中文,转码
    表格的css,细线表格
    使用struts 2 获取服务器数据 ongl表达式 标签
    struts 2 Commons FileUpload文件上传
  • 原文地址:https://www.cnblogs.com/hanmian4511/p/10874693.html
Copyright © 2020-2023  润新知