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

多对一处理(association)

  • 多个学生对一个老师

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

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

SQL:

测试环境搭建

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

pom.xml

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 复制代码
<?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

XML 复制代码
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

java 复制代码
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

java 复制代码
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工具包

java 复制代码
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

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

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映射文件

XML 复制代码
<mappers>
        <mapper class="com.lyc.mapper.StudentMapper"/>
        <mapper class="com.lyc.mapper.TeacherMapper"/>
    </mappers>

按照查询嵌套处理

studentmapper.xml

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

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)

环境搭建: 与上文一致

实体类:

java 复制代码
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

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

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

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

希望对大家有所帮助!

相关推荐
二进制小甜豆2 小时前
网络原理 TCP/IP
java·学习
chirrupy_hamal3 小时前
IntelliJ IDEA 保姆级使用教程
java·intellij idea
D_aniel_3 小时前
Leetcode:回文链表
java·算法·leetcode·链表
软件2055 小时前
【登录流程图】
java·前端·流程图
深度物联网6 小时前
Spring Boot多模块划分设计
java·spring boot·后端
一 乐6 小时前
宿舍报修|宿舍报修小程序|基于Java微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·宿舍报修小程序
武昌库里写JAVA8 小时前
Java 设计模式
java·vue.js·spring boot·课程设计·宠物管理
钢铁男儿8 小时前
Python 函数装饰器和闭包(闭包)
java·网络·python
Clf丶忆笙9 小时前
从零开始搭建第一个Spring Boot应用:从入门到精通
java·spring boot
东坡大表哥9 小时前
【Android】Android签名解析
android·java