B056-Mybatis增强

news2025/3/15 22:59:18

目录

      • 域对象(domain)之间的关系
        • A 表结构上是如何设计关系的
        • B 实体对象上是如何设计关系的
        • 回顾多表查询
      • 结果映射
        • 多对一/一对一
          • Domain
            • Department
            • Employee
          • Mapper
            • EmployeeMapper
            • EmployeeMapper_嵌套结果.xml(推荐使用)
            • EmployeeMapper_嵌套查询.xml
          • Many2OneTest
        • 一对多
          • domain
            • Department
            • Employee
          • mapper
            • DepartmentMapper
            • DepartmentMapper_嵌套查询.xml(建议使用)
            • DepartmentMapper_嵌套结果.xml
          • One2ManyTest
      • 缓存

域对象(domain)之间的关系

关系:java对象之间的关系
分类:1. 一对多,2. 多对一,3. 一对一,4. 多对多,

A 表结构上是如何设计关系的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

B 实体对象上是如何设计关系的

在这里插入图片描述

回顾多表查询

先查出宽表,取别名,然后做自定义映射
在这里插入图片描述

结果映射

为什么要使用结果映射
原因一:解决表字段名和对象属性名不一样的情况.
原因二:关联对象查询,在mybatis不会默认查询出来,需要自己查询结果并且通过resultMap来配置

关联映射处理方式
嵌套查询和嵌套结果
在这里插入图片描述

多对一/一对一

Domain
Department
@Data
public class Department {
    private Long id;
    private String name;
}
Employee
@Data
public class Employee {
    private Integer id;
    private String name;
    /*在多对一种:通过对象引用来表明关系*/
    private Department dept;
}
Mapper
EmployeeMapper
public interface EmployeeMapper {
    List<Employee> loadAll();
}
EmployeeMapper_嵌套结果.xml(推荐使用)
   <!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="employeeMap" type="cn.itsource.many2one.domain.Employee">
        <!--id:主键       property:Employee对象里的属性     column:宽表列名-->
        <id property="id" column="id"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="name"/>
        <!--association:绑定一个对象  javaType:申明引用属性的类型-->
        <association property="dept" javaType="cn.itsource.many2one.domain.Department">
            <id property="id" column="did"/>
            <result property="name" column="dname"/>
        </association>
    </resultMap>
    
    <!--resultMap 我们自定义的结果集映射,作用:用来绑定对应引用属性值的-->
    <select id="loadAll" resultMap="employeeMap">
        SELECT
            e.*,
            d.id did,
            d.NAME dname
        FROM
            employee e
        JOIN department d ON e.dept_id = d.id
    </select>
EmployeeMapper_嵌套查询.xml
    <!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="employeeMap" type="cn.itsource.many2one.domain.Employee">
        <!--id:主键       property:Employee对象里的属性     column:宽表列名-->
        <id property="id" column="id"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="name"/>
        <!-- association:绑定一个对象     column:外层sql查询出来的列名     select:指明要使用的sql-->
        <association property="dept"
                     column="dept_id"
                     select="cn.itsource.many2one.mapper.EmployeeMapper.loadDeptById"
                     javaType="cn.itsource.many2one.domain.Department">
        </association>
    </resultMap>

    <!--1.查询出员工数据-->
    <select id="loadAll" resultMap="employeeMap">
        SELECT * from employee
    </select>

    <!--2.根据员工表中的dept_id 查询出部门数据-->
    <select id="loadDeptById" parameterType="long" resultType="cn.itsource.many2one.domain.Department">
        SELECT * from department where id = #{id}
    </select>
Many2OneTest
    @Test
    public void testMany2One() {
        //1.获取连接
        SqlSession session = MybatisUtil.getSession();
        //2.得到mapper对象
        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
        //3.执行操作
        mapper.loadAll().forEach(a -> {
            System.out.println(a);
        });
        //4.释放资源
        session.close();
    }

一对多

domain
Department
@Data
public class Department {
    private Long id;
    private String name;
    /*在一对多中:通过集合引用属性来表明关系*/
    private List<Employee> employees;
}
Employee
@Data
public class Employee {
    private Long id;
    private String name;
}
mapper
DepartmentMapper
public interface DepartmentMapper {
    List<Department> loadAll();
}
DepartmentMapper_嵌套查询.xml(建议使用)
	<!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="departmentMap" type="cn.itsource.one2many.domain.Department">
        <!--id:主键       property:Department对象里的属性     column:宽表列名-->
        <id property="id" column="id"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="name"/>
        <!--collection:对应多个对象  ofType:申明集合引用属性类型-->
        <collection property="employees"
                    column="id"
                    select="loadEmpsByDeptId"
                    ofType="cn.itsource.one2many.domain.Employee">
        </collection>
    </resultMap>

    <!--resultMap 我们自定义的结果集映射,作用:用来绑定对应引用属性值的-->
    <select id="loadAll" resultMap="departmentMap">
        select * from department
    </select>

    <!--通过部门ID查询出部门下的员工-->
    <select id="loadEmpsByDeptId" parameterType="long" resultType="cn.itsource.one2many.domain.Employee">
        select * from employee where dept_id = #{id}
    </select>
DepartmentMapper_嵌套结果.xml
    <!-- 这是我们自定义的结果集映射规则,如果我们使用自定义映射,那么所有我们想要的对象属性都得做手动匹配 -->
    <resultMap id="departmentMap" type="cn.itsource.one2many.domain.Department">
        <!--id:主键       property:Department对象里的属性     column:宽表列名-->
        <id property="id" column="did"/>
        <!--除开主键之外的普通属性外层用result-->
        <result property="name" column="dname"/>
        <!--collection:对应多个对象  ofType:申明集合引用属性类型-->
        <collection property="employees" ofType="cn.itsource.one2many.domain.Employee">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
        </collection>
    </resultMap>
    
    <!--resultMap 我们自定义的结果集映射,作用:用来绑定对应引用属性值的-->
    <select id="loadAll" resultMap="departmentMap">
        SELECT
            e.*,
            d.id did,
            d.NAME dname
        FROM
            employee e
        JOIN department d ON e.dept_id = d.id
    </select>
One2ManyTest
    @Test
    public void testOne2Many() {
        //1.获取连接
        SqlSession session = MybatisUtil.getSession();
        //2.得到mapper对象
        DepartmentMapper mapper = session.getMapper(DepartmentMapper.class);
        //3.执行操作
        mapper.loadAll().forEach(a -> {
            System.out.println(a);
        });
        //4.释放资源
        session.close();
    }

缓存

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/864560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(4)各个属性角色分析显示-4

将折线图、数据集、散点图集合在一个html文件中&#xff1a; &#xff08;1&#xff09;将折线图、数据集、散点图设置为函数a()、b()、c()&#xff0c; &#xff08;2&#xff09;再调用page.add()函数&#xff0c;将三个图片组合在一起 &#xff08;3&#xff09;运行page.…

python sqlalchemy 动态设置表名__tablename__,一个model对应多个table

我们在上一篇中说明了&#xff0c;如何在.net core的efcore中动态设置表名。 本文讲述如何在sqlalchemy中动态设置表名&#xff0c;使多个table可以对应到一个model 表如下 code example from sqlalchemy import create_engine,Column,BigInteger,String from sqlalchemy.ext…

Java全开源电影票一站式购买平台程序研发

院线电影票H5用户端一站式订购平台设计 随着移动互联网的普及和快速发展&#xff0c;越来越多的用户开始使用手机端进行在线购票。为了满足用户更加便捷、快速地购买电影票&#xff0c;我们设计了一个院线电影票H5用户端一站式订购平台。该平台集成了多种功能&#xff0c;旨在…

腾讯云服务器地域有什么区别怎么选择?

腾讯云服务器地域有什么区别&#xff1f;怎么选择比较好&#xff1f;地域选择就近原则&#xff0c;距离地域越近网络延迟越低&#xff0c;速度越快。关于地域的选择还有很多因素&#xff0c;地域节点选择还要考虑到网络延迟速度方面、内网连接、是否需要备案、不同地域价格因素…

linux系统的压缩、解压详细用法,附代码举例(感觉别人写的都不够好)

文章目录 zipzip支持的选项有&#xff1a;-A 详细解释-d &#xff08;对压缩包操作&#xff09;-e &#xff08;对压缩文件加密&#xff09;-f&#xff08;只更新文件&#xff09;-g&#xff08;不显示压缩过程&#xff09;-r &#xff08;文件夹必选&#xff09;-u&#xff08…

ECRS工时分析:什么叫标准化作业管理?为什么要进行作业标准化管理

中国自古就有标准化。《孙子兵法》中&#xff0c;孙子训练射箭&#xff0c;射箭的姿势是“标准化操作”&#xff1b;中国武术中的套路是“标准化”&#xff1b;在中国古诗中&#xff0c;字数甚至被“标准化”来打开中国历史&#xff0c;“标准化”作业的例子数不胜数。 而在工厂…

[C语言]深入浅出,带你构建C语言宏观框架

导言&#xff1a; 本文章会带你基本了解C语言&#xff0c;对他有一个感性的认识&#xff0c;对其有一个框架&#xff0c;后期在对其进行更加细致的补充。 文章目录 C语言第一个函数变量局部变量 与 全局变量常量字符串 与 转义字符 头文件分支 与 循环注释数组关键字操作符宏指…

【学习FreeRTOS】第4章——FreeRTOS任务创建与删除

1.任务创建和删除的API函数 任务的创建和删除本质就是调用FreeRTOS的API函数 动态方式创建任务——xTaskCreate()静态方式创建任务——xTaskCreateStatic()删除任务——vTaskDelete() 动态创建任务&#xff1a;任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由 F…

美团研究院:2022年剧本娱乐行业发展报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 户外赛道本质上迎合了全球共性需求的增长&#xff0c;在全球普遍进入大规模城市化、市场经 随着居民收入水乎提高&#xff0c;中国消费者日益注重精神文化生活&#xff0c;文化娱乐成为人们重要的体闲…

Android的学习系列之Android Studio Setup安装

Android的学习系列之Android Studio Setup安装 [TOC](Android的学习系列之Android Studio Setup安装) 前言Android平台搭建总结 前言 还是项目需要&#xff0c;暂时搭建安卓的运行平台。 Android平台搭建 安装包 双击安装包&#xff0c;进入安装。 下一步 根据自己需求&a…

kinit报错 /etc/host.conf: line 3: bad command `nospoof on‘

kinit报错 /etc/host.conf: line 3: bad command nospoof on’ linux7.5不再支持nospoof命令了, 修改/etc/host.conf注释掉nospoof on即可。

chatGPT小白快速入门培训课程-001

一、前言 本文是《chatGPT小白快速入门培训课程》的第001篇文章&#xff0c;全部内容采用chatGPT和chatGPT开源平替软件生成。完整内容大纲详见&#xff1a;《chatGPT小白快速入门课程大纲》。 本系列文章&#xff0c;参与&#xff1a; AIGC征文活动 #AIGC技术创作内容征文# …

39 printf 的输出到设备层的调试

前言 在前面 printf 的调试 我们只是调试到了 glibc 调用系统调用, 封装了参数 stdout, 带输出的字符缓冲, 以及待输出字符长度 然后内核这边 只是到了 write 的系统调用, 并未向下细看 我们这里 稍微向下 细追一下, 看看 到达设备层面 这里是怎么具体的 impl 的 测试用例…

宋浩线性代数笔记(五)矩阵的对角化

本章的知识点难度和重要程度都是线代中当之无愧的T0级&#xff0c;对于各种杂碎的知识点&#xff0c;多做题复盘才能良好的掌握&#xff0c;良好掌握的关键点在于&#xff1a;所谓的性质A与性质B&#xff0c;是谁推导得谁~

【ultralytics仓库使用自己的数据集训练RT-DETR】

ultralytics仓库使用自己的数据集训练RT-DETR RT-DETR由百度开发&#xff0c;是一款尖端的端到端物体检测器&#xff08;基于transformer架构&#xff09;&#xff0c;在提供实时性能的同时保持高精度。它利用视觉变换器&#xff08;ViT&#xff09;的力量&#xff0c;通过解耦…

MongoDB的下载和安装

一、MongoD下载 下载地址&#xff1a;https://www.mongodb.com/try/download/community 二、安装 因为选择下载的是 .zip 文件&#xff0c;直接跳过安装&#xff0c;一步到位。 选择在任一磁盘创建空文件夹&#xff08;不要使用中文路径&#xff09;&#xff0c;解压之后把文…

关于安卓打包生成aar,jar实现(一)

关于安卓打包生成aar&#xff0c;jar方式 背景 在开发的过程中&#xff0c;主项目引入三方功能的方式有很多&#xff0c;主要是以下几个方面&#xff1a; &#xff08;1&#xff09;直接引入源代码module&#xff08;优点&#xff1a;方便修改源码&#xff0c;易于维护&#…

ChatGLM2-6B在Windows下的微调

ChatGLM2-6B在Windows下的微调 零、重要参考资料 1、ChatGLM2-6B! 我跑通啦&#xff01;本地部署微调&#xff08;windows系统&#xff09;&#xff1a;这是最关键的一篇文章&#xff0c;提供了Windows下的脚本 2、LangChain ChatGLM2-6B 搭建个人专属知识库&#xff1a;提供…

Linux命令200例:tree用于以树状结构显示文件和目录

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

非计算机科班如何丝滑转码?

近年来&#xff0c;很多人想要从其他行业跳槽转入计算机领域。非计算机科班如何丝滑转码&#xff1f; 如何规划才能实现转码&#xff1f; 对于非计算机科班的人来说&#xff0c;想要顺利转码成为计算机相关岗位的从业者&#xff0c;需要经过以下几个步骤&#xff1a; 规划转码…