当前位置: 首页 > news >正文

mybatis--多对一处理/一对多处理

多对一处理(association)

  • 多个学生对一个老师

  • 对于学生这边,关联:多个学生,关联一个老师[多对一]

  • 对于老师而言,集合,一个老师有多个学生【一对多】

SQL:

测试环境搭建

1.导入依赖文件并编写配置文件

pom.xml

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.34</version>
    </dependency>
</dependencies>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--   映入外部配置文件-->

    <properties resource="db.properties"/>
    <settings>
<!--        标准的日志工厂实现-->
        <setting name="logImpl" value="stdout_logging"/>
    </settings>
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>
    <mappers>
        <mapper class="com.lyc.mapper.StudentMapper"/>
        <mapper class="com.lyc.mapper.TeacherMapper"/>
    </mappers>
</configuration>

db.properties

driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username = root
password = 211314

2.新建实体类

student

package com.lyc.pojo;

import lombok.Data;
import org.apache.ibatis.type.Alias;

@Data
@Alias("student")
public class Student {
    private int id;
    private String name;
    //学生要关联一个老师
    private Teacher teacher;
}

Teacher

package com.lyc.pojo;

import lombok.Data;
import org.apache.ibatis.type.Alias;

@Data
@Alias("teacher")
public class Teacher {
    private int id;
    private String name;
}

3.编写Mybatis工具包

package com.lyc.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {
    public SqlSession getsqlSession() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream stream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
        return sqlSessionFactory.openSession(true);
    }
}

4.建立Mapper接口,建立Mapper.xml

studentMapper.java

package com.lyc.mapper;

import com.lyc.pojo.Student;

import java.util.List;

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

teacherMapper.java

package com.lyc.mapper;

import com.lyc.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface TeacherMapper {
//    @Select("select * from mybatis.teacher where id = #{tid}")
    Teacher getTeacher(@Param("tid") int id);
}

5.在核心配置文件中绑定注册我们的Mapper映射文件

<mappers>
        <mapper class="com.lyc.mapper.StudentMapper"/>
        <mapper class="com.lyc.mapper.TeacherMapper"/>
    </mappers>

按照查询嵌套处理

studentmapper.xml

 <mapper namespace="com.lyc.mapper.StudentMapper">
 <!--    思路:
 1.查询所有的学生信息
 2.根据查询出来的学生的tid查询到老师信息
  -->
     <select id="getStudent" resultMap="student-teacher">
         select *
         from mybatis.student;
     </select>
     <resultMap id="student-teacher" type="com.lyc.pojo.Student">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
 <!--        复杂的属性,我们需要单独处理
             对象:association
             集合:collection-->
         <association property="teacher" column="tid" javaType="com.lyc.pojo.Teacher" select="getTeacher"/>
     </resultMap>
     <select id="getTeacher" resultType="com.lyc.pojo.Teacher">
         select * from mybatis.teacher where id = #{id}
     </select>
 </mapper>

按照结果嵌套查询

studentmapper.xml

<!--    按照结果嵌套处理-->
     <select id="getStudent2" resultMap="student-teacher2">
         select student.id,student.name,teacher.name as teacherName
         from mybatis.student,mybatis.teacher
         where student.tid = teacher.id
     </select>
     <resultMap id="student-teacher2" type="com.lyc.pojo.Student">
         <result property="id" column="id"/>
         <result property="name" column="name"/>
         <association property="teacher" javaType="com.lyc.pojo.Teacher">
             <result property="name" column="teacherName"/>
         </association>
     </resultMap>

注:单表查询时,当执行到tid时去调用映射,映射又去子查询,所以#{}里面自动填充了cloum的值,所以#{}的值可以随便添,记住,是单表查询时

回顾MySQL多对一查询方式:

  • 子查询

  • 联表查询

一对多处理(collection)

环境搭建: 与上文一致

实体类:

public class Student {
     private int id;
     private String name;
     //学生要关联一个老师
    private int tid;
 }
 public class Teacher {
     private int id;
     private String name;
     //一个老师有多个老师
     private List<Student> students;
 }

mapper类:

teacherMapper.java

package com.lyc.mapper;

import com.lyc.pojo.Teacher;
import com.lyc.pojo.Teacher;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface TeacherMapper {
//    List<Teacher> selectTeacher();
    //获取指定老师下的所有学生及老师信息
    Teacher selectTeacher(@Param("tid") int id);
    Teacher selectTeacher2(@Param("tid") int id);
}

按照查询嵌套处理

TeacherMapper.xml

   <select id="selectTeacher2" resultMap="teacher-student2">
     select * from mybatis.teacher where id = #{tid};
     </select>
     <resultMap id="teacher-student2" type="com.lyc.pojo.Teacher">
         <collection property="students" javaType="ArrayList" ofType="com.lyc.pojo.Student" select="getStudent" column="id"/>
     </resultMap>
     <select id="getStudent" resultType="com.lyc.pojo.Student">
         select * from mybatis.student where tid = #{tid}
     </select>
 </mapper>

按照结果嵌套查询

TeacherMapper.xml

 <select id="selectTeacher" resultMap="teacher-student">
     select s.id sid,s.name sname,t.id tid,t.name tname
     from mybatis.teacher t
         join mybatis.student s on
             t.id = s.tid and t.id = #{tid};
 </select>
 ​
 <resultMap id="teacher-student" type="com.lyc.pojo.Teacher">
     <result property="id" column="tid"/>
     <result property="name" column="tname"/>
     <!--        复杂的属性,我们需要单独处理
         对象:association
         集合:collection
         javaType:
         指定属性的类型,集合中的泛型信息,我们使用ofType获取-->
     <collection property="students" ofType="com.lyc.pojo.Student">
         <result property="id" column="sid"/>
         <result property="name" column="sname"/>
         <result property="tid" column="tid"/>
     </collection>
 </resultMap>

小结

  1. 关联 association

  2. 集合:collection

  3. javaType & ofype

    1. javaType用来指定实体类中属性的类型

    2. ofType 用来指定映射到List或者集合中的实体类,反省中的约束类型

注:

  • 保证SQL的可读性,精良保证通俗易懂

  • 注意一对多和多对一中 属性名和字段名的问题如果问题不好排查,可以使用日志,建议使用log4j

希望对大家有所帮助! 

相关文章:

  • 数据库的种类及常见类型
  • L3-027 可怜的复杂度(纯暴力)
  • 供应链管理:供应链管理的边界
  • HTTP协议 --- 超文本传输协议 和 TCP --- 传输控制协议
  • 什么是端点日志监控
  • spark中,shuffle read和shuffle write的先后顺序是什么
  • 测试知识点总结
  • 记录学习的第二十五天
  • 自动化三维扫描:CASAIM外观尺寸智能检测
  • Makefile教程
  • 论文学习:《EVlncRNA-net:一种双通道深度学习方法,用于对实验验证的lncRNA进行准确预测》
  • 操做系统----第二章:多进程图像之CPU管理
  • PTA | 实验室使用排期
  • Arduino Uno R3连接HC-03
  • MVC 模式深度解析与 Spring 框架实践研究
  • Python运算符
  • MySQL存过
  • VirtualBox 无法枚举 USB 设备的问题
  • 力扣刷题HOT100——438.找到字符串中所有字母异位词
  • DAY 44 leetcode 28--字符串.实现strStr()
  • 世界免疫周丨专家呼吁加快HPV疫苗纳入国家免疫规划进程
  • 习近平对双拥工作作出重要指示
  • 全球最大车展在上海启幕,解放日报头版头条:“看懂上海车展,就能预判未来”
  • 中国全国政协-越南祖国阵线中央暨边境省份组织第三次友好交流活动在南宁开幕
  • 日方炒作中国社会治安形势不佳,外交部:政治操弄意图明显
  • 三江购物:因自身商业需要,第二大股东阿里泽泰拟减持不超3%公司股份