zoukankan      html  css  js  c++  java
  • Mybatis多对一查询

    Mybatis多对一的查询主要有两种 第一种是查询嵌套处理,另一种是按照结果嵌套处理 如今一般第二种较为主流

    首先创建两个表,以教师表和学生表为例

    --教师表
    create table teacher(
        id int(15) primary key default null,
        name varchar(30) default null
        )ENGINE=INNODB DEFAULT CHARSET=UTF8;
        
    insert into teacher (id,name) values (1,‘刘老师’);
    --学生表
    create table student(
        id int(15) primary key default null,
        name varchar(30) default null,
        tid int(10) default null,
        key teacher_id (tid),
        constraint teacher_id foreign key(tid) references teacher (id)
    )ENGINE=INNODB DEFAULT CHARSET=UTF8;
    
    INSERT INTO STUDENT (id,name,tid) values (1,‘小明',1);
    INSERT INTO STUDENT (id,name,tid) values (2,‘小红',1);
    INSERT INTO STUDENT (id,name,tid) values (3,‘小张',1);
    INSERT INTO STUDENT (id,name,tid) values (4,‘小李',1);
    INSERT INTO STUDENT (id,name,tid) values (5,‘小王',1);

    我们在数据库中使用的语句是

    select * from student s,teacher t where s.tid=t.id;

    接下来使用嵌套处理——

    查询嵌套处理

    学生实体类

    package com.mos3y.enity;
    
    public class Student {
        private int id;
        private String name;
    
     //getter setter 无参构造 toString方法

    教师实体类

    public class Teacher {
        private int id;
        private String name;
        //getter setter 无参构造 toString方法
    }

    注意:框架主要是通过反射来获取对象,主要通过以下代码,所以必须声明无参构造,否则就会报错

    Class class1 = Class.forName(className);
    Object o1 = class1.newInstance();//调用无参构造方法生成对象

    接下来设计接口,通过一个集合来获取学生的所有信息及对应的教师

    public interface StudentMapper {
        List<Student> getStudent();
    }

    编写配置文件

    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.mos3y.Mapper.StudentMapper">
        <select id="getStudent" resultMap="studentTeacher">
            select * from student;
        </select>
        <resultMap id="studentTeacher" type="student">
            <result property="id" column="id"/>
            <result property="name" column="name"/>
            <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
        </resultMap>
        <select id="getTeacher" resultType="Teacher">
            select * from teacher where id=#{tid}
        </select>
    </mapper>

    首先创建对应接口的查询 查询学生的所有信息,因为返回值的学生对应一个教师对象 所以这里使用resultMap结果集映射

    在resultMap中设置Student实体类对应的属性类型 因为多个学生关联一个老师,老师对象就是用association来表示,column是对应教师的tid 来传给下一个查询,通过声明

    select="getTeacher"来引用下一个查询

    以上主要通过结果集映射来解决

    • 根据查询所有的学生信息

    • 根据查询出来学生的teacherId,寻找对应的老师

    对于结果集映射 对于普通字段可以通过使用result来解决

     

    但是对于复杂的属性,就需要单独处理 对象使用 association 集合使用connection

    property来表示实体类中的对象,clumn表示数据库中的字段,javaType是表示这个字段的java类型,然后通过查询来获取对象的信息

  • 相关阅读:
    Iaas、Paas、Saas对比分析
    一个不一样的Python教程
    传销的那些年
    availableProcessors is already set to [8], rejecting [8]
    脚本是个好东西
    《设计模式之禅》之桥梁模式
    博文视点之传奇程序员修炼之道观后感
    《设计模式之禅》之享元模式
    《设计模式之禅》之解释器模式
    Git修改commit提交信息
  • 原文地址:https://www.cnblogs.com/mos3y/p/12514139.html
Copyright © 2011-2022 走看看