Mybatis复杂查询环境搭建 (多对一,一对多)

多对一

概念理解

  • 多个学生对应一个老师 ,对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!

数据库设计

在这里插入图片描述

CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师');

CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` 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');

实现步骤

1. 配置环境

先附上目录结构
在这里插入图片描述
注意:有时候找不到XML文件时,可能是包结构的错误,请把各种包按结构展开
在这里插入图片描述

  1. IDEA安装Lombok插件
    在这里插入图片描述

  2. 引入依赖

 <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!--        单元测试依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <!--        能自动插入编辑器(自动创建get/set方法)并构建工具-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
    </dependencies>


    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>  <!--  把main/java下的properties和xml文件导出-->
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>  <!--  把main/resource下的properties和xml文件导出-->
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
  1. 在代码中增加注解
@Data //GET,SET,ToString,有参,无参构造
public class Teacher {
   private int id;
   private String name;
}

@Data
public class Student {
   private int id;
   private String name;
   //多个学生可以是同一个老师,即多对一
   private Teacher teacher;
}
  1. 编写实体类对应的Mapper接口 【两个】
    无论有没有需求,都应该写上,以备后来之需!

public interface StudentMapper {
}

public interface TeacherMapper {
}
  1. 编写 mybatis-config 核心配置类
<?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">

<!--配置JDBC连接-->

<configuration>

    <typeAliases>
      <package name="com.kuang.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/数据库名?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="你的密码"/>
            </dataSource>
        </environment>
    </environments>

    <!--    每一个Mapper.XML都需要在Mybatis核心配置文件中注册-->
    <mappers>
        <mapper resource="com/kuang/dao/StudentMapper.xml"/>
        <mapper resource="com/kuang/dao/TeacherMapper.xml"/>
    </mappers>
</configuration>
  1. 编写Mapper接口对应的 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="com.kuang.mapper.StudentMapper">

</mapper>
<?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.kuang.mapper.TeacherMapper">
</mapper>

2. 编写多对一语句

<?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">
<!--namespace命名空间绑定Dao与Mapper-->
<mapper namespace="com.kuang.dao.StudentMapper">

    <!--
   需求:获取所有学生及对应老师的信息
   思路:
       1. 获取所有学生的信息
       2. 根据获取的学生信息的老师ID->获取该老师的信息
       3. 思考问题,这样学生的结果集中应该包含老师,该如何处理呢,数据库中我们一般使用关联查询?
           1. 做一个结果集映射:StudentTeacher
           2. StudentTeacher结果集的类型为 Student
           3. 学生中老师的属性为teacher,对应数据库中为tid。
              多个 [1,...)学生关联一个老师=> 一对一,一对多
           4. 查看官网找到:association – 一个复杂类型的关联;使用它来处理关联查询
   -->
   <resultMap id="StudentTeacher2" type="Student">
    
         <result property="id" column="sid"/>
         <result property="name" column="sname"/>
         <association property="teacher" javaType="Teacher">
         <!--association关联属性 property 实体类Student中对应的要关联的属性名 javaType解释该属性类型-->
             <result property="name" column="tname"/>
         <!--property 实体类Teacher中的要关联的属性名 column在数据库查询之后返回的表的表中的列名 -->
         </association>
     </resultMap>
     
    <select id="getStudent" resultMap="StudentTeacher2">
        select s.id sid,s.name sname, t.name tname
        from student as s,teacher as t
        where s.tid=t.id
    </select>
     
</mapper>

3.编写测试类

package com.kuang.dao;

import com.kuang.pojo.Student;
import com.kuang.pojo.Teacher;
import com.kuang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class TestDao {
    @Test
  public  void test(){
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        StudentMapper StudentMapper=sqlSession.getMapper(StudentMapper.class);
        List<Student> StudentList= StudentMapper.getStudent();

        for(Student user : StudentList){
            System.out.println(user);
        }
        sqlSession.close();

  }

}

一对多

概念理解

一个老师有多个学生
在这里插入图片描述

数据库设计

同上

实现步骤

1. 配置环境

pojo类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private  int id;
    private  String name;
    //一个老师拥有多个学生
    private List<Student> student;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {

    private  int id;
    private  String name;
    private  int tid;

}

其余同上

2. 编写一对多语句

<?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">
<!--namespace命名空间绑定Dao与Mapper-->
<mapper namespace="com.kuang.dao.TeacherMapper">

    <resultMap id="TeacherStudent" type="Teacher">
        <result property="name" column="tname"/>
        <result property="id" column="tid"/>

        <collection property="student" ofType="Student">
            <result property="name" column="sname"/>
            <result property="id" column="sid"/>
        </collection>
     </resultMap>

    <select id="getTeacher"  resultMap="TeacherStudent">
      select t.id tid,t.name sname,s.name sname
      from student as s,teacher as t
      where s.tid=t.id and t.id=#{id}
  </select>
    

</mapper>

3.编写测试类

在这里插入图片描述

    @Test
    public  void test2(){
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        TeacherMapper userMapper=sqlSession.getMapper(TeacherMapper.class);
        Teacher teacherlist=userMapper.getTeacher(1);

        System.out.println(teacherlist);

        sqlSession.close();

    }

总结

  • 1、关联-association

  • 2、集合-collection

  • 3、所以association是用于一对一和多对一,而collection是用于一对多的关系

  • 4、JavaType和ofType都是用来指定对象类型的

     JavaType是用来指定pojo中属性的类型
    
     ofType指定的是映射到list集合属性中pojo的类型。
    

注意说明:

1、保证SQL的可读性,尽量通俗易懂

2、根据实际要求,尽量编写性能更高的SQL语句

3、注意属性名和字段不一致的问题

4、注意一对多和多对一 中:字段和属性对应的问题

5、尽量使用Log4j,通过日志来查看自己的错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值