Mybatis:高级知识1- resultMap实现一对一、一对多、多对多

简介: Mybatis:高级知识1- resultMap实现一对一、一对多、多对多

Mybatis是什么


mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入和输出的映射,需要程序员自己写sql语句,mybatis重点对 sql语句的灵活操作。

 

适合用于:需求变化频繁, 数据模型不固定的项目,例如:互联网项目。


mybatis架构

SqlMapConfig.xml(名称不固定),配置内容:数据源、事务、properties、typeAliases、settings、mapper配置。

SqlSessionFactory--会话工厂,作用是创建SqlSession,实际开发中以单例模式管理 SqlSessionFactory。

   

SqlSession--会话,是一个面向用户(程序员)的接口,使用mapper代理方法开发是不需要程序员直接调用sqlSession的方法。是线程不安全,最佳适用场合方法体内。


mybatis开发dao的方法:

1、原始dao开发方法,需要程序员编写dao接口和实现类,此方法在当前企业中还有使用,因为ibatis使用的就是原始dao开发方法。

2、mapper代理方法,程序员只需要写mapper接口(相当于dao接口),mybatis自动根据mapper接口和mapper接口对应的statement自动生成代理对象(接口实现类对象)。

   开发需要遵循规则:

    1)mapper.xmlnamespace是mapper接口的全限定名

    2)mapper.xml中statement的id为mapper接口方法名

    3)mapper.xml中statement的输入映射类型(parameterType)和mapper接口方法输入参数类型一致

    4 ) mapper.xml中statement的输出映射类型(resultType)和mapper接口方法返回结果类型一致



resultType和resultMap都可以完成输出映射:

--resultType映射要求sql查询的列名和输出映射pojo类型的属性名一致

--resultMap映射时对sql查询的列名和输出映射pojo类型的属性名作一个对应关系。


动态sql:

#{}和${}完成输入参数的属性值获取,通过OGNL获取parameterType指定pojo的属性名。

#{}:占位符号,好处防止sql注入

${}:sql拼接符号

if

where

foreach

 

商品订单数据模型

 


学会在企业中如何去分析陌生表的数据模型:

1、学习单表记录了什么东西(去学习理解需求)

2、学习单表重要字段的意义(优先学习不能为空的字段)

3、学习表与表之间的关系(一对一、一对多、多对多)

通过表的外键分析表之间的关系

注意:分析表与表之间的关系时是要建立在具体 的业务意义基础之上

 

用户表user:记录了购买商品的用户

订单表orders:记录了用户所创建的订单信息

订单明细表orderdetail:记录了用户创建订单的详细信息

商品信息表items:记录了商家提供的商品信息


分析表与表之间的关系:

用户user和订单orders:

user---->orders:一个用户可以创建多个订单   一对多

orders-->user:一个订单只能由一个用户创建  一对一

订单orders和订单明细orderdetail:

orders-->orderdetail:一个订单可以包括多个订单明细  一对多

orderdetail-->orders:一个订单明细只属于一个订单  一对一

订单明细orderdetail和商品信息items:

orderdetail-->items:一个订单明细对应一个商品信息 一对一

items--> orderdetail:一个商品对应多个订单明细  一对多


一对一查询

需求:查询订单信息关联查询用户信息


sql语句

查询语句:

先确定主查询表:订单信息表

再确定关联查询表:用户信息

通过orders关联查询用户使用user_id一个外键,只能关联查询出一条用户记录就可以使用内连接

SELECT

 orders.*,

 user.username,

 user.sex

FROM

 orders,

 USER

WHERE orders.user_id = user.id


使用resultType实现

创建po类

基础的单表的 po类:


一对一查询映射的pojo

创建pojo包括 订单信息和用户信息,resultType才可以完成映射。

创建OrderCustom作为自定义pojo,继承sql查询列多的po类。


mapper.xml

定义mapper.xml文件


mapper.java


测试


使用resultMap实现一对一

resultMap映射思路

resultMap提供一对一关联查询的映射和一对多关联查询映射,一对一映射思路:将关联查询的信息映射到pojo中,如下:

在Orders类中创建一个User属性,将关联查询的信息映射到User属性中。


mapper.xml


resultMap定义


mapper.java


小结

resultType:自定义pojo 保证sql查询列和pojo的属性对应,这种方法相对较简单,所以应用广泛。

resultMap:使用association完成一对一映射需要配置一个resultMap,过程有点复杂,如果要实现延迟加载就只能用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。


一对多查询

需求

查询所有订单信息及订单下的订单明细信息


sql语句

主查询表:订单表

关联查询表:订单明细

SELECT

 orders.*,

 user.username,

 user.sex ,

 orderdetail.id orderdetail_id,

 orderdetail.items_num,

 orderdetail.items_id

FROM

 orders,

 USER,

 orderdetail

WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id


resultMap进行一对多映射思路

resultMap 提供collection完成关联信息映射到集合对象中。

在orders类中创建集合属性:


mapper.xml


resultMap定义


mapper.java


测试


一对多查询(复杂)

需求

查询所有用户信息,关联查询订单及订单明细信息及商品信息,

订单明细信息中关联查询商品信息


sql

主查询表:用户信息

关联查询:订单、订单明细,商品信息

SELECT

 orders.*,

 user.username,

 user.sex ,

 orderdetail.id orderdetail_id,

 orderdetail.items_num,

 orderdetail.items_id,

 items.name items_name,

 items.detail items_detail

FROM

 orders,

 USER,

 orderdetail,

 items

WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id


pojo定义

在user.java中创建映射的属性:集合 List<Orders>  orderlist

在Orders中创建映射的属性:集合List<Orderdetail> orderdetails

在Orderdetail中创建商品属性:pojo   Items items


mapper.xml


resultMap


mapper.java


多对多查询

一对多是多对多的特例。

需求1:

查询显示字段:用户账号、用户名称、用户性别、商品名称、商品价格(最常见)

企业开发中常见明细列表,用户购买商品明细列表,

使用resultType将上边查询列映射到pojo输出。

 

需求2:

查询显示字段:用户账号、用户名称、购买商品数量、商品明细(鼠标移上显示明细)

使用resultMap将用户购买的商品明细列表映射到user对象中。

  • 注意:如果这里使用resultType,会显示一个用户的多条记录,还需要使用Java代码(将相同的用户)汇总;


resultMap小结


resultType作用:

将查询结果按照sql列名pojo属性名一致性映射到pojo中

resultMap场合:

常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。


resultMap:

使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。


association:

作用:

   将关联查询信息映射到一个pojo对象中。

场合:

   为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,

   比如:查询订单及关联用户信息。

   使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。

   


collection:

作用:

   将关联查询信息映射到一个list集合中。

场合:

为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,

比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。如果使用resultType无法将查询结果映射到list集合中。

 



目录
相关文章
|
12天前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
12天前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
2月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
4月前
|
Java 数据库连接 mybatis
Mybatis基于注解的一对一和一对多查询
Mybatis基于注解的一对一和一对多查询
|
4月前
|
SQL Java 数据库连接
Mybatis中一对多mapper配置
Mybatis中一对多mapper配置
|
25天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
12天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
2月前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
101 1
|
2月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
2月前
|
Java 关系型数据库 MySQL
1、Mybatis-Plus 创建SpringBoot项目
这篇文章是关于如何创建一个SpringBoot项目,包括在`pom.xml`文件中引入依赖、在`application.yml`文件中配置数据库连接,以及加入日志功能的详细步骤和示例代码。