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集合中。

 



相关文章
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
420 6
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
569 18
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
SQL XML Java
Mybatis中一对一和一对多的处理
这篇文章讲解了在Mybatis中如何处理一对一和一对多的关系映射,包括使用association和collection标签的具体方法。
506 1
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
Java 数据库连接 mybatis
Mybatis基于注解的一对一和一对多查询
Mybatis基于注解的一对一和一对多查询
262 0
|
11月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1608 1
Spring boot 使用mybatis generator 自动生成代码插件
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
1118 0
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
791 2