zoukankan      html  css  js  c++  java
  • 结果集映射体系一

    结果集映射体系一

    前言

    本章你将学会MetaObject的使用与原理,以及嵌套子查询原理,包括子查询当中的循环依赖

    映射工具MetaObject

    所谓映射是指结果集中的列填充至JAVA Bean属性。这就必须用到反射,而Bean的属性 多种多样的有普通属性、对象、集合、Map都有可能。为了更加方便的操作Bean的属性,MyBatis提供了MeataObject 工具类,其简化了对象属性的操作。其具体功能如下:

    1. 查找属性:勿略大小写,支持驼峰、支持子属性 如:“blog.comment.user_name”

    2. 获取属性

      1. 基于点获取子属性 “user.name”

      2. 基于索引获取列表值 “users[1].id”

      3. 基于key获取map值 “user[name]”

    3. 设置属性:

      1. 可设置子属性值

      2. 支持自动创建子属性(必须带有空参构造方法,且不能是集合)

    为了实现上述功能,MetaObject 相继依赖了BeanWrapper、MetaClass、Reflector。这四个对象关系如下:

    image-20200624184018932

    • BeanWrapper: 功能与MeataObject类似,不同点是BeanWrapper只针对单个当前对象属性进行操作,不能操作子属性。

    • MetaClass :类的反射功能支持,获能获取整完整类的属性,包括属性的属性。

    • Reflector :类的反射功能支持,仅支持当前类的属性。

    Meata获取属性流程:

    对象结构如下图:

    image-20200624184435875

    获取博客的第一个评论者的名称,其获取表达示是:

    "comments[0].user.name"

    MetaObjbt 解析获取流程如下图:

    image-20200624184731617

    流程中方法说明:

    MeataObject.getValue()

    获取值的入品,首先根据属性名"comments[0].user.name" 解析成PropertyTokenizer,并基于属性中的“.” 来判断是否为子属性值,如果是就递归调用getValue()获取子属性对象。然后在递归调用getValue()获取子属性下的属性。直到最后的name属性获。

    MeataObject.setValue()

    流程与getValue()类似,不同在于如果子属性不存在,则会尝试创建子属性。

    ResultMap结果集映射

    映射是指返回的ResultSet列与Java Bean 属性之间的对应关系。通过ResultMapping进行映射描述,在用ResultMap封装成一个整体。

    image-20200624185839752

    映射设置

    一个ResultMap 中包含多个ResultMapping 表示一个具体的JAVA属性到列的映射,其主要值如下:

    image-20200624190400867

    ResultMapping 有多种表现形式如下:

    1. constructor:构建参数字段

    2. id:ID字段

    3. result:普通结构集字段

    4. association:1对1关联字段

    5. Collection:1对多集合关联字段

    image-20200624190002578

    自动映射

    当前列名和属性名相同的情况下,可使用自动映射

    image-20200624190915621

    自动映射条件

    1. 列名和属性名同时存在(勿略大小写)

    2. 当前列未手动设置映射

    3. 属性类别存在TypeHandler

    4. 开启autoMapping (默认开启)

    嵌套子查询

    但很多时候对象结构, 是树级程现的。即对象中包含对象。可以通过子查询获取子对象属性。

    image-20200624191331605

    当依次解析Blog中的属性时,会先解析填充普通属性,当解析到复合对象时,就会触发对子查询。

    image-20200624191515841

    子查询循环依赖

  • 相关阅读:
    GeneXus for SAP的最新动态
    GeneXus DevOps 自动化构建和部署流程
    GeneXus 16 如何实现自动化测试和发布
    在GeneXus开发过程中如何进行自动化测试?
    【GeneXus】在WorkWithPlus中如何定义未被包含的页面属性?
    【GeneXus】开发移动APP时,如何使用Canvas进行布局?
    如何对富文本编辑器(FCK Html Editor)的工具栏进行扩展?
    GenXus进行APP开发-全局颜色设计
    通过GeneXus如何快速构建微服务架构
    Android签名打包详解
  • 原文地址:https://www.cnblogs.com/sunanli/p/13621938.html
Copyright © 2011-2022 走看看