Mybatis中多个对象包含同一个对象的处理

2022-08-27 13:39:22

多个对象对应一个对象时,应该如何进行查询?
例如


关键字:association : 联系 ,关联 多个人可以关联一个人。
首先做一些准备,如:实体类,工具类和Mybatis核心文件
实体类:
//老师实体类package com.MLXH.pojo;publicclassTeacher{privateint id;private String name;publicTeacher(){}publicTeacher(int id, String name){this.id= id;this.name= name;}publicintgetId(){return id;}publicvoidsetId(int id){this.id= id;}public StringgetName(){return name;}publicvoidsetName(String name){this.name= name;}@Overridepublic StringtoString(){return"Teacher{"+"id="+ id+", name='"+ name+'\''+'}';}}
//学生实体类package com.MLXH.pojo;publicclassStudent{privateint id;private String name;private Teacher teacher;publicStudent(){}publicStudent(int id, String name, Teacher teacher){this.id= id;this.name= name;this.teacher= teacher;}publicintgetId(){return id;}publicvoidsetId(int id){this.id= id;}public StringgetName(){return name;}publicvoidsetName(String name){this.name= name;}public TeachergetTeacher(){return teacher;}publicvoidsetTeacher(Teacher teacher){this.teacher= teacher;}@Overridepublic StringtoString(){return"Student{"+"id="+ id+", name='"+ name+'\''+", teacher="+ teacher+'}';}}

database.properties配置文件数据库需要的数据

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

Mybatis工具类: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><!--配置文件修改--><propertiesresource="database.properties"/><!--Mybatis设置--><settings><!--默认日志实现--><!--<setting name="logImpl" value="STDOUT_LOGGING"/>--><!--Log4j实现--><settingname="logImpl"value="LOG4J"/></settings><!--配置别名--><typeAliases><packagename="com.MLXH.pojo"/></typeAliases><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource></environment></environments><mappers><!--class对应的是一个接口类--><!--resource对应的是一个接口类的映射文件--><mapperresource="com/MLXH/dao/StudentMapper.xml"/></mappers></configuration>

工具类:主要是为了使获得sqlsession更为简单方便

package com.MLXH.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;//mybatis的工具类,重复的代码的提纯publicclassMyBatisUtils{//类变量不需要设置默认值;privatestatic SqlSessionFactory sqlSessionFactory;static{//在maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。try{
            String resource="mybatis-config.xml";
            InputStream inputStream= Resources.getResourceAsStream(resource);
            sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);}catch(IOException e){
            e.printStackTrace();}}//设置SqlSessionFactory公共的方法publicstatic SqlSessionFactorygetSqlSessionFactory(){return sqlSessionFactory;}//获得一个带事务自动提交功能的SqlSession公共的方法publicstatic SqlSessiongetSqlSession(){//自动提交事务return sqlSessionFactory.openSession(true);}}

StudentDao接口

package com.MLXH.dao;import com.MLXH.pojo.Student;import java.util.List;publicinterfaceStudentDao{//获得全部学生的信息以及对应的老师
    List<Student>getStudents();//获得全部学生的信息以及对应的老师
    List<Student>getStudentsTwo();}

针对于StudentDao接口的实现mapper文件:我们使用如下的方式来进行查询

1.模拟数据库思想:连表查询

StudentMapper.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"><!--namespace不能写别名--><mappernamespace="com.MLXH.dao.StudentDao"><!--遇到问题:学生类中关联老师: 多个学生对应一个老师 --><!--解决问题方式一:按查询结果嵌套处理,模拟数据库思想;--><selectid="getStudents"resultMap="StudentTeacher">
        select * from mybatis.student</select><resultMapid="StudentTeacher"type="Student"><idcolumn="id"property="id"/><resultcolumn="name"property="name"/><!--属性和字段对应  , 类和表对应  , 对象和记录
        关联一个字段
        需求:拿到老师这个类的属性

        association : 关联,多对一
            column : 数据库对应的列名
            property : 对应属性名
            javaType : 多对一字段对应的Java类型
            select : 关联一个语句
        --><associationcolumn="tid"property="teacher"javaType="Teacher"select="getTeacher"/></resultMap><selectid="getTeacher"resultType="Teacher">
        select * from mybatis.teacher where id = #{id}</select></mapper>

测试类

@TestpublicvoidgetStudents(){
        SqlSession sqlSession= MyBatisUtils.getSqlSession();

        StudentDao mapper= sqlSession.getMapper(StudentDao.class);

        List<Student> students= mapper.getStudents();for(Student student: students){
            System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());}}

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不能写别名!!!!!--><mappernamespace="com.MLXH.dao.StudentDao"><!-- 解决方式二:一个resultMap解决 , 模拟面向对象的思想--><selectid="getStudentsTwo"resultMap="StudentTeacher2">
        select s.id,s.name,t.id as tid,t.name as tname
        from mybatis.student as s, mybatis.teacher as t
        where s.tid = t.id</select><!--设置结果集映射ResultMap --><resultMapid="StudentTeacher2"type="Student"><idproperty="id"column="id"/><resultproperty="name"column="name"/><!--直接关联一个老师--><associationproperty="teacher"javaType="Teacher"><idproperty="id"column="tid"/><resultproperty="name"column="tname"/></association></resultMap></mapper>

测试

@TestpublicvoidgetStudentsTwo(){
    SqlSession sqlSession= MyBatisUtils.getSqlSession();

    StudentDao mapper= sqlSession.getMapper(StudentDao.class);

    List<Student> students= mapper.getStudentsTwo();for(Student student: students){
        System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());}}

在这里插入图片描述
总结:

  • mybatis中遇到多对一的情况,要使用关联映射处理:使用association
  • 两种处理思路:
    • 数据库思想 : 联表查询
    • OOP思想 :关联对象
  • 作者:_板蓝根_
  • 原文链接:https://blog.csdn.net/mulinghanxue/article/details/97796500
    更新时间:2022-08-27 13:39:22