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.xml中namespace是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、学习表与表之间的关系(一对一、一对多、多对多)

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

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第1张图片

 

用户表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类。

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第2张图片

mapper.xml

定义mapper.xml文件

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第3张图片

mapper.java

测试

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第4张图片

使用resultMap实现一对一


resultMap映射思路

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

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

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第5张图片

mapper.xml

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第6张图片

resultMap定义

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第7张图片
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

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第8张图片

resultMap定义

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第9张图片

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第10张图片

mapper.java

测试

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第11张图片

一对多查询(复杂)

需求


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

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

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  orderlist
在Orders中创建映射的属性:集合List orderdetails 
在Orderdetail中创建商品属性:pojo   Items items

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第12张图片

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第13张图片

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第14张图片


mapper.xml

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第15张图片

resultMap

Mybatis:高级知识1- resultMap实现一对一、一对多、多对多_第16张图片

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

 

你可能感兴趣的:(Mybatis)