iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Mybatis中多个对象包含同一个对象的处理操作
  • 936
分享到

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

2024-04-02 19:04:59 936人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

多个对象对应一个对象时,应该如何进行查询? 例如 关键字:association : 联系 ,关联 多个人可以关联一个人。 首先做一些准备,如:实体类,工具类和mybatis核心文件

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

例如

关键字:association : 联系 ,关联 多个人可以关联一个人。

首先做一些准备,如:实体类,工具类和mybatis核心文件

实体类:


//老师实体类
package com.MLXH.pojo;
public class Teacher {
    private int id;
    private String name;
    public Teacher() {
    }
    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Teacher{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

//学生实体类
package com.MLXH.pojo;
public class Student  {
    private int id;
    private String name;
    private Teacher teacher;
    public Student() {
    }
    public Student(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Teacher getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    @Override
    public String toString() {
        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>
    <!--配置文件修改-->
    <properties resource="database.properties"/>
    <!--Mybatis设置-->
    <settings>
        <!--默认日志实现-->
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <!--Log4j实现-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--配置别名-->
    <typeAliases>
        <package name="com.MLXH.pojo"/>
    </typeAliases>
    <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>
        <!--class对应的是一个接口类-->
        <!--resource对应的是一个接口类的映射文件-->
        <mapper resource="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的工具类,重复的代码的提纯
public class MyBatisUtils {
    //类变量不需要设置默认值;
    private static SqlSessionFactory sqlSessionFactory;
    static {
        //在Maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //设置SqlSessionFactory公共的方法
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }
    //获得一个带事务自动提交功能的SqlSession公共的方法
    public static SqlSession getSqlSession(){
        //自动提交事务
        return sqlSessionFactory.openSession(true);
    }
}

StudentDao接口


package com.MLXH.dao;
import com.MLXH.pojo.Student;
import java.util.List;
public interface StudentDao {
    //获得全部学生的信息以及对应的老师
    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不能写别名-->
<mapper namespace="com.MLXH.dao.StudentDao">
    <!--遇到问题:学生类中关联老师: 多个学生对应一个老师 -->
    
    <!--解决问题方式一:按查询结果嵌套处理,模拟数据库思想;-->
    <select id="getStudents" resultMap="StudentTeacher">
        select * from mybatis.student
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <!--属性和字段对应  , 类和表对应  , 对象和记录
        关联一个字段
        需求:拿到老师这个类的属性
        association : 关联,多对一
            column : 数据库对应的列名
            property : 对应属性名
            javaType : 多对一字段对应的Java类型
            select : 关联一个语句
        -->
        <association column="tid" property="teacher" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    <select id="getTeacher" resultType="Teacher">
        select * from mybatis.teacher where id = #{id}
    </select>
</mapper>

测试


    @Test
    public void getStudents(){
        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不能写别名!!!!!-->
<mapper namespace="com.MLXH.dao.StudentDao">
    <!-- 解决方式二:一个resultMap解决 , 模拟面向对象的思想-->
    <select id="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 -->
    <resultMap id="StudentTeacher2" type="Student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <!--直接关联一个老师-->
        <association property="teacher" javaType="Teacher">
            <id property="id" column="tid"/>
            <result property="name" column="tname"/>
        </association>
    </resultMap>
</mapper>

测试


@Test
public void getStudentsTwo(){
    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思想 :关联对象

Mybatis同时传入多个对象及普通参数

当传入多个文件时,mapper接口文件的方法参数要使用@param(“xx”)注释。

例子:

mapper:


//Student是对象,age是String类型。
int getPojo(@param("student") Student student, @param("age") String age );

xml:


<select id="getStudent" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from student
    where 1 = 1
    <!-- 使用参数一(是个自己的对象) -->
    <if test="student.id != null">
        and id = #{student.id}
    </if>
    <!-- 使用参数二 String类型 -->
    <if test="age!= null">
        and age = #{age}
    </if>
</select>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Mybatis中多个对象包含同一个对象的处理操作

本文链接: https://www.lsjlt.com/news/128667.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mybatis中多个对象包含同一个对象的处理操作
    多个对象对应一个对象时,应该如何进行查询? 例如 关键字:association : 联系 ,关联 多个人可以关联一个人。 首先做一些准备,如:实体类,工具类和Mybatis核心文件...
    99+
    2024-04-02
  • json包含多个对象怎么解析
    解析包含多个对象的 JSON 可以使用以下方法:1. 如果 JSON 是一个数组,你可以使用循环来遍历数组并解析每个对象。例如:``...
    99+
    2023-08-25
    json
  • PHP中如何创建一个包含对象数组的文件?
    在PHP中,我们可以使用文件来存储对象数组,方便我们在不同的页面或脚本中共享数据。本文将介绍如何在PHP中创建包含对象数组的文件。 1. 创建对象 在开始之前,我们需要先创建一个对象,用于存储我们想要保存到文件中的数据。下面是一个简单的示例...
    99+
    2023-08-26
    对象 数组 文件
  • 数据库文件中至少包含哪个对象
    小编给大家分享一下数据库文件中至少包含哪个对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!数据库文件中至少包含有表对象。数据库...
    99+
    2024-04-02
  • wps怎么为同一对象添加多个动画
    这篇文章主要介绍wps怎么为同一对象添加多个动画,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!添加方法:首先打开需要进行操作的ppt演示文档,选中指定对象;然后点击页面顶部的“动画”选项卡,选择指定动画效果;接着点击...
    99+
    2023-06-15
  • c++中一个对象怎么运行多个线程
    在C++中,一个对象可以通过创建多个线程来同时执行多个任务。为了实现这一点,你可以使用C++的多线程库,例如std::thread或...
    99+
    2024-02-29
    c++
  • wpf怎么绑定一个对象的多个属性
    在WPF中,可以使用绑定表达式来绑定一个对象的多个属性。首先,需要创建一个实现了INotifyPropertyChanged接口的类...
    99+
    2023-09-06
    wpf
  • 为什么将两个不同的对象解码为同一个对象,但bool成员却没有改变?
    IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天编程网给大家整理了《为什么将两个不同的对象解码为...
    99+
    2024-04-05
  • c++中怎么实现一个对象运行多个线程
    在C++中,可以使用线程库来实现一个对象运行多个线程。下面是一个简单的示例: #include #include class ...
    99+
    2023-10-25
    c++
  • vue如何判断数组中的对象是否包含某个值
    目录判断数组中的对象是否包含某个值判断对象是否包含某个属性,el-table formatter判断1.表格部分2.方法体部分判断数组中的对象是否包含某个值 xxx (array, ...
    99+
    2022-11-13
    vue判断数组 判断数组对象 对象包含某个值
  • 怎么在JavaScript中将多个对象合并成一个数组
    怎么在JavaScript中将多个对象合并成一个数组?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多...
    99+
    2023-06-14
  • MyBatis中多对一和一对多数据的处理方法
    目录多对一的处理1、数据库设计2、搭建测试环境3、按查询嵌套处理4 、按结果嵌套处理一对多的处理1、实体类编写2、按结果嵌套处理3、按查询嵌套处理4、小结多对一的处理 多对一的理解:...
    99+
    2023-01-03
    MyBatis多对一 MyBatis一对多处理
  • Java如何处理大数据中的对象操作问题?
    随着数据量的不断增大,Java在处理大数据中的对象操作问题上面也会遇到一些困难。本文将介绍Java中处理大数据中的对象操作问题,并提供一些代码示例。 一、使用缓存来优化对象操作 在处理大数据量时,Java中的对象操作会变得十分缓慢,因为内...
    99+
    2023-10-12
    大数据 对象 numpy
  • 如何在TypeScript中正确的遍历一个对象
    目录JavaScriptTypeScriptfor...inObject.keysObject.entries思考总结JavaScript 在讲解用 Ts 遍历一个对象之前, 我们先...
    99+
    2024-04-02
  • JS数组操作大全对象数组根据某个相同的字段分组
    目录先说点废话目标对象数组准换后的对象数组编写函数的思路方法一方法二拓展————ES6的新方法Object.keys先说点废话 最近在...
    99+
    2022-11-13
    js对象数组根据字段分组 js对象数组 js数组操作
  • 怎么在TypeScript中正确的遍历一个对象
    这篇文章主要介绍了怎么在TypeScript中正确的遍历一个对象的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么在TypeScript中正确的遍历一个对象文章都会有所收获,下面我们一起来看看吧。JavaScr...
    99+
    2023-06-29
  • Golang mongodb 聚合错误:管道阶段规范对象必须仅包含一个字段
    问题内容 我想获取过去一个月内按名称分组的计数。当我尝试在 golang mongo 客户端中运行以下查询时。我收到错误: error: 管道阶段规范对象必须仅包含一个字段。 cond := &bson.D{...
    99+
    2024-02-02
  • 重构一个期望一件事期望很多事情的对象
    php小编鱼仔在编程中,我们经常会遇到一个对象希望承担多个职责的情况。这种对象被称为"重构一个期望一件事期望很多事情的对象"。这样的对象通常会导致代码臃肿、耦合度高,难以维护和扩展。在...
    99+
    2024-02-09
  • Java判断List集合中的对象是否包含有某一元素
    关于以下方法,直接可以在自己项目创建一个类,然后进行测试使用!文本末尾也提供了每个方法的运行结果,供大家参考使用! 文章大量使用到了Java8当中的Lambda表达式,以及stream流相关基础知...
    99+
    2023-08-31
    java
  • php如何获取一个对象中所有的方法
    今天小编给大家分享一下php如何获取一个对象中所有的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。创建一个 Reflec...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作