mybatis的高级映射

MyBatis高级映射(一对一映射、一对多映射、多对多映射) 一、什么是MyBatis高级映射        mybatis是一个持久层框架,不完全的ORM(对象关系映射)框架。sql语句需要程序员自己去写,都是mybatis也有映射(输入参数映射,输出结果映射)。pojo通过映射数据库字段才能对数据进行增删改查操作,让程序员把精力放在写sql语句上,并对sql语句优化非常方便。即mapper.xml(映射文件)。       1、输入映射:parame... 阅读详情

mybatis的高级映射(重点)
        表与表之间的关系:
            一对一关系:
                栗子:一个人对应一个身份证号
            一对多关系:


                栗子:一个用户可以有多个订单
                1.    分析需求:查询用户"郭襄"的个人信息并且包含所属订单的名字
                2.  在数据库中编写查询语句
                3.  在主表对应的实体类中(User)添加映射关系:
                    一对多关系:
                        主表(user)应该包含从表(orders)的实体对象的集合
                        private List<Orders> orders;生成get\set方法
                4.  在接口类中定义接口方法 User findUsrName(String name);
                5.  在映射配置文件中配置<ResultMap>
                    建立两表之间的映射关系:

  <resultMap type="user" id="userMap">
                            <id property="id" column="id" jdbcType="INTEGER"/>
                            <result property="name" column="name" jdbcType="VARCHAR"/>
                            <result property="sex" column="sex" jdbcType="VARCHAR"/>
                            <result property="username" column="username" jdbcType="VARCHAR"/>
                            <result property="pwd" column="pwd" jdbcType="VARCHAR"/>
                            <result property="tel" column="tel" jdbcType="VARCHAR"/>
                            --多:集合collection
                            <collection property="orders" ofType="orders">
                                <id property="id" column="id" jdbcType="INTEGER"/>
                                <result property="ordername" column="ordername" jdbcType="VARCHAR"/>
                            </collection>
                        </resultMap>

配置操作语句:

    <!-- 查询用户"郭襄"的个人信息并且包含所属订单的名字 -->
                        注:resultMap="userMap"
                        <select id="findUserAndOrdersName" resultMap="userMap">
                            SELECT `user`.*,orders.ordername  
                            FROM `user`  
                            LEFT JOIN orders  
                            ON orders.orderuser=`user`.id  
                            WHERE `user`.`name`=#{name}
                        </select>

      多对一关系:


                栗子:多个订单属于一个用户
                    特殊:单独拿出一个订单来对应一个用户,一对一的关系
                1.    分析需求:查询订单信息并且包含所属用户名
                2.  在数据库中编写查询语句
                3.  在从表对应的实体类中(Orders)添加映射关系:
                    多对一关系:
                        从表(orders)实体类应该包含主表(user)实体对象的引用
                        private User user;
                4.  在接口类中定义接口方法
                    List<Orders> findOrdersAndName();
                5.  在映射配置文件中配置<ResultMap>

 <resultMap type="orders" id="ordersMap">
                        <!-- 
                            property:值为实体的属性名 
                            column:值为数据库表的字段名
                            jdbcType:值为字段的数据类型
                         -->
                        <id property="id" column="id" jdbcType="INTEGER"/>
                        <result property="ordernum" column="ordernum" jdbcType="VARCHAR"/>
                        <result property="ordername" column="ordername" jdbcType="VARCHAR"/>
                        <result property="ordermoney" column="ordermoney" jdbcType="DECIMAL"/>
                        <result property="orderdate" column="orderdate" jdbcType="TIMESTAMP"/>
                        --多对一:association
                        <association property="user" column="id">
                            <id property="id" column="id" jdbcType="INTEGER"/>
                            <result property="name" column="name" jdbcType="VARCHAR"/>
                        </association>
                    </resultMap>
                    
                    配置操作语句:
                        <!-- 查询订单信息并且包含所属用户名 -->
                        <select id="findOrdersAndName" resultMap="ordersMap">
                            SELECT orders.*,`user`.`name` 
                            FROM orders,`user` 
                            WHERE orders.orderuser=`user`.id
                        </select>

多对多关系:m:n
                栗子:学生与课程的关系
                        一个学生可以上多门课程;
                        一门课程可以被多个学生学习;
                    
                    实现步骤:
                        1.    分析需求:查询杜兰特同学的信息并且显示上哪一门课程
                        2.  在数据库中编写查询语句
                        3.  在第一个查询的表的实体类中(Student)添加映射关系:
                            多对多关系:
                                应该包含另外一个表的实体对象的集合引用
                                private List<Student> students;
                        4.  在接口类中定义接口方法
                            Student findStuAndCourse(String name);
                        5.  在映射配置文件中配置<ResultMap>

  <resultMap type="student" id="studentMap">
                                    <id property="stuid" column="stuid" jdbcType="INTEGER"/>
                                    <result property="name" column="name" jdbcType="VARCHAR"/>
                                    <result property="sex" column="sex" jdbcType="VARCHAR"/>
                                    <result property="stunum" column="stunum" jdbcType="VARCHAR"/>
                                    <result property="major" column="major" jdbcType="VARCHAR"/>
                                    <result property="address" column="address" jdbcType="VARCHAR"/>
                                    <result property="username" column="username" jdbcType="VARCHAR"/>
                                    <result property="password" column="password" jdbcType="VARCHAR"/>
                                    <collection property="courses" ofType="course">
                                        <id property="id" column="id" jdbcType="INTEGER"/>
                                        <result property="courseName" column="course_name" jdbcType="VARCHAR"/>
                                    </collection>
                                </resultMap>
                                
                                <!-- 查询用户"郭襄"的个人信息并且包含所属订单的名字 -->
                                    <select id="findStuAndCourse" resultMap="studentMap">
                                        SELECT student.*,course.course_name AS courseName 
                                        FROM student 
                                        LEFT JOIN stucourse 
                                        ON student.stuid=stucourse.stuid 
                                        LEFT JOIN course 
                                        ON stucourse.courseid=course.id 
                                        WHERE student.`name`=#{name}
                                    </select>


                                    

【MyBatis框架】MyBatis高级映射 MyBatis高级映射 在关系型数据库中,我们经常要处理一对一、一对多、多对多的关系。在RBAC权限系统中还存在着一个用户拥有多个角色、一个角色拥有多个权限这样复杂的嵌套关系。在面对这种关系的时候,我们可能要写多个方法分别查询这些数据,然后再组合到一起。这种处理方式特别适合用在大型系统上,由于分库分表,这种用法可以减少表之间的关联查询,方便系统进行扩展。但是在一般的企业级应用中,使用MyBatis的高级结果映射便可以轻松地处理这种一对一、一对多、多对多地关系。 以订单数据模型为例进行分析: user:用户 阅读详情

相关推荐

Mybatis高级映射查询

Mybatis高级映射查询

【SSM】Mybatis的高级映射

分布查询中,`association` 标签下的`javaType` 属性和`collection` 标签下的 `ofType` 属性,如果对应的查询语句(映射接口方法)有返回值的话,`mybatis`可以自行推断,不写也不会报错。但是非分布查询的,`javaType` 和 `ofType` 属性是必须设置的,不然mybatis 无法知道所指定的类型。

qq_63691275的博客 1254

mybatis中批量插入的两种方式(高效插入)

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。这篇文章主要介绍了mybatis中批量插入的两种方式(高效插入)的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧

玩转Mybatis的高级关系映射(实战加详解,保姆级教程)

详解+实战,零基础也能玩转!

浪里小白龙nbw的博客 2441

数据质量管理的一些思考

背景 在近期的项目当中,我们为客户落地实施了数据资产平台。随后,在数据平台中接入了客户子公司的一个业务系统的明细数据。客户希望在我们的数据平台上通过数据探索和数据分析,来挖掘一些业务价值和业务创新点。 当我们拿到数据开始进行一些初步探索的时候,发现导入平台的数据质量存在一定的问题:例如一些用于数据分析的关键字段的值为空、一些本应该有主从关系的数据对应不上、数据分类混乱等。这些问题直接影响到了对...

IDEAL Garden 1万+

在Redroid容器中构建Frida RPC服务:自动化生成淘宝X-Sign签名参数

本文详细介绍了在Redroid容器中构建Frida RPC服务,实现自动化生成淘宝X-Sign等签名参数的完整方案。通过逆向分析定位关键方法,定制Redroid系统使Frida-Server常驻运行,并编写Frida脚本将签名方法暴露为RPC接口,最终封装为可远程调用的微服务,解决了签名生成的可移植性与工程化难题。

ice55的博客 644

Mybatis高级映射

Mybatis高级映射本质上来说是多个表的联合查询过程 订单数据模型分析思路 数据表: 用户表user:记录了购买商品的用户信息 订单表orders:记录了用户创建的订单(购买商品的订单) 订单明细表orderdatail:记录了订单的详细信息即购买商品的信息 商品表items:记录了商品信息 数据模型分析: 表与表之间的业务关系: 用户表user和订单表order的关系:(一对多关系) user->orders:一个用户可以创建多个订单,一对多 orders->u

iiiiiiiiiooooo的博客 1245

Android车载应用开发:Kotlin与Automotive OS深度实践

Android Automotive OS(AAOS)是Google专为车辆设计的操作系统,直接运行于车机硬件,提供完整的车载信息娱乐系统(IVI)。与Android Auto不同,AAOS允许开发者深度集成车辆硬件功能,如空调控制和传感器数据读取,同时遵循严格的驾驶安全规范。Kotlin作为开发语言,具备空安全设计、扩展函数和协程支持等优势,简化了开发流程。开发环境配置包括Android Studio、AAOS模拟器和Gradle配置,核心组件如CarAppService、Screen与模板系统,以及车辆

时小雨的专栏 3444

【MyBatis】高级结果映射

但是有的时候我们查询的结果并不需要显示全部字段,或者我们需要将A表和B表进行联合查询,查询的结果既有A表的字段,又有B表的字段,这个时候再继续用pojo来作为数据库数据传输的对象显然就不太合适了,我们就需要根据查询结果,再创建一个DTO对象来帮助我们进行数据传输。上面是Emp表对应的pojo对象,包含了Emp表的全部字段,但是现在我们需要进行一个Emp表和DEPT表的联合查询,再去使用这个Emp对象显然就不合适了,需要根据这个联合查询显示的字段,再去创建一个DTO对象。关联元素就是专门用来处理关联关系的;

小七的博客 1104

在游戏开发中如何使用Unity3D引擎开发麻将游戏

总体来说使用Unity3D引擎开发麻将游戏需要开发人员熟练掌握Unity3D的各种功能和API,并且需要深入了解麻将游戏的规则和背景,以便实现一个质量高、玩法丰富的游戏。在测试的过程中我们需要检查游戏是否符合规则,保证游戏逻辑的正确性,并检查游戏的UI是否和设计图一致,保证游戏的可玩性。Unity3D引擎是一个高度集成的游戏开发工具,可以为开发人员提供很多强大的工具和功能,包括3D建模、物理模拟、粒子系统、动画等等,在游戏开发中可以提高开发效率和游戏质量。在开始开发之前我们需要明确游戏的需求和功能。

a272857154的专栏 1889

告别Overleaf!本地LaTeX环境配置:VSCode+TeXLive完全指南(Windows/Mac双平台)

本文详细介绍了如何在Windows和Mac平台上配置本地LaTeX环境,使用VSCode和TeXLive打造高效的专业写作工作流。从TeXLive安装到VSCode插件配置,再到高级技巧与性能优化,帮助用户摆脱Overleaf限制,实现更快速、更私密的学术写作体验。

3c4x5z6v7b的博客 952

mybatis高级映射

mybatis高级映射订单数据模型分析思路一对一映射 高级映射本质来说是多个表的联合查询的过程。 订单数据模型分析思路 数据表: 用户表user:记录了购买商品的用户信息。 订单表orders:记录了用户所创建的订单(购买商品的订单) 订单明细表orderdetail:记录了订单的详细信息即购买商品的信息。 商品表items:记录了商品信息。 数据模型分析: 表与表之间的业务关系 user和orders:(一对多关系) user->orders:一个用户可以创建多个订单,一对多。 orders-&g

m0_46853673的博客 2131

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,...

weixin_44143671的博客 2万+

MyBatis的高级映射

MyBatis高级映射

CXYCMY的博客 451

Python学习第32天:Web前端入门

本文介绍了Web前端开发三大核心技术:HTML、CSS和JavaScript。首先概述了HTML的发展历程和HTML5新特性,详细讲解了常用HTML标签如文本、列表、链接、图像、表格、表单等。其次介绍了CSS的基础语法、选择器、颜色字体设置、盒子模型和布局定位方法。最后简要提及JavaScript为网页添加交互功能的作用。文章为Python开发者提供了前端技术的基础知识,帮助理解网页的结构、样式和行为实现原理。

tigerhhzz的博客 1911

手把手教你学Simulink--四翼无人机滑模控制器设计与仿真

四翼无人机(Quadcopter)滑模控制(Sliding Mode Control, SMC)是一种鲁棒性很强的非线性控制方法,特别适用于存在模型不确定性和外部扰动的情况。滑模控制器通过强制系统状态进入并保持在一个预定义的滑模面上,从而实现对期望轨迹或姿态的精确跟踪。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个基于滑模控制策略的四翼无人机系统。

MHD0815的博客 184

Mybatis高级结果映射

References Advanced Result Maps Use mybatis to map one to many(1->n) model, data mode is like the following tracking packages address items tracking(1)->packages(n) | address, packages(1)-&g

阿萨的专栏 324

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MyBatis 高级映射功能

本文将深入探讨这些高级映射功能,包括映射配置方法、嵌套查询和关联查询的使用,并通过示例代码进行演示。通过合理使用一对一、一对多和多对多映射,以及嵌套查询和关联查询,开发者可以轻松构建出符合业务需求的数据访问层。:嵌套查询可能导致 N+1 查询问题,应在必要时使用,并考虑使用 `fetchType="lazy"` 进行优化。:指定关联数据的加载方式,可选值为 `eager`(立即加载)和 `lazy`(延迟加载)。:对于数据量较小且使用频繁的关联数据,优先使用关联查询。

shangjg3的博客 870

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MyBatis 的高级结果映射

MyBatis 的高级结果映射 为方便理解,本章涉及示例代码已上传至 gitee ==>获取示例代码请点击这里。。。 拉取示例代码时,请拉取所有分支,master 分支只是做了示例的初始化 MyBatis 的高级结果映射主要是针对一对一,一对多的表关系结果映射。 一对一结果映射 在使用多表联查的时候,想要将联查出来的另一个表的数据映射到主表映射对象上,需要在主表的实体对象中增加一个从表的对象属性,并添加 set、get 方法。 实现一对一映射共有三种方式: SQL 别名方式实现映射 SQL 别名与

shizhiqian0021的博客 328

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入浅出Mybatis(八)高级映射

    前面的章节使用的都是对单张表的操作,但是在实际开发当中,很多时候需要关联多张表,这时就需要用到我们的高级映射,包括一对一,一对多和多对多。下面先来分析一个简单的业务场景。有四张表:用户表:user保存用户相关信息。CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) D...

qq_21963133的博客 4611

mybatis高级结果映射之 一对一映射

1、高级结果映射 1一对一映射 1.1.1 使用resultMap配置一对一映射 association标签的映射查询常用的属性如下。 property: 对应实体类中的属性名,必填项。 javaType:属性对应的Java类型。 resultMap:可以直接使用现有的resultMap,而不需要在这里配置。 columnPrefix:...

liyanghao809433131的博客 477

MyBatis学习——高级结果映射

前面我们讲解了一下关于MyBatis的动态SQL查询,对MyBatis的基本用法有了大致的了解,如果忘记了可以去复习一下,MyBatis学习——动态SQL。今天我们将讲解一下MyBatis的高级查询知识点。 前言:在关系型数据库中,我们经常要处理一对一 、一对多的关系。在面对这种关系的时候,我们可能要写多个方法分别查询这些数据,然后再组合到一起。这种处理方式特别适合用在大型系统上,由于分库分表,这...

Anumbrella 851

(自用)mybatis高级映射

`fetchType="lazy"` 表示延迟加载,只有在访问 `user.getOrders()` 时才会触发查询。- 学生(`Student`)和课程(`Course`)的多对多关系(一个学生选多门课,一门课有多个学生)。- `property` 表示 Java 对象中的属性名,`javaType` 表示关联对象的类型。- 订单(`Order`)和用户(`User`)的关联(一个订单属于一个用户)。- 用户(`User`)和订单(`Order`)的关联(一个用户有多个订单)。-- 延迟加载 -->

weixin_55869972的博客 1010

Mybatis 输入映射 输出映射 高级映射

1.输入映射     通过parameterType指定输入参数的类型,类型可以是简单类型、 hashmap 、 pojo 的包装类型。     [1]简单类型   例如入门程序里的根据用户ID查询用户信息的映射文件,输入Int值。   [2]POJO类型   例如入门程序里的添加用户文件,就是输入POJO类型的USER   [3]包装POJO类型

JavaLab 717
上一篇: mybatis的CRUD操作
下一篇: mybatis的动态SQL
Jarvis!
博客等级 码龄6年 822粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值