每日三个JAVA经典面试题(三十一)

1.简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?

MyBatis的XML映射文件(Mapper XML)定义了数据库操作的SQL语句以及与之对应的映射关系,而MyBatis内部的数据结构则负责将XML映射文件中定义的SQL语句和映射关系转换为内部对象,以便于在Java代码中进行操作。

下面简要描述MyBatis的XML映射文件和内部数据结构之间的映射关系:

  1. XML映射文件中的SQL语句

    • XML映射文件中的 <select><insert><update><delete> 等标签定义了对数据库的SQL操作。
    • 这些SQL语句包括数据库查询、插入、更新和删除等操作,以及它们的参数和返回结果的映射关系。
  2. XML映射文件中的映射配置

    • XML映射文件中通过 <resultMap><result> 等标签定义了结果集与Java对象之间的映射关系,包括字段名和属性名的映射、字段类型和属性类型的映射等。
  3. MyBatis内部数据结构

    • MyBatis内部使用的数据结构主要包括 MappedStatementSqlSourceBoundSql 等。
    • MappedStatement 对象包含了SQL语句的信息,包括命名空间、SQL语句的ID、SQL语句类型等。
    • SqlSource 对象表示一个SQL语句的来源,它包含了SQL语句的文本以及参数映射等信息。
    • BoundSql 对象表示一个绑定了参数的SQL语句,它包含了SQL语句的文本以及参数值等信息。
  4. 映射关系

    • 在MyBatis内部,XML映射文件中定义的SQL语句和映射关系会被解析为 MappedStatement 对象和 SqlSource 对象。
    • MappedStatement 对象包含了SQL语句的信息,而 SqlSource 对象则包含了SQL语句的文本和参数映射关系。
    • 当调用SQL语句时,MyBatis会根据 MappedStatement 对象和 SqlSource 对象生成最终的执行SQL语句,并执行数据库操作。

总之,MyBatis的XML映射文件和内部数据结构之间存在着密切的映射关系,XML映射文件中定义的SQL语句和映射关系会被解析为MyBatis内部的数据结构,以便于在Java代码中进行数据库操作。

2.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

MyBatis将SQL执行结果封装为目标对象并返回的过程称为结果映射(Result Mapping)。MyBatis提供了多种映射形式来实现结果映射,包括:

  1. 基本映射(Basic Mapping):

    • 将查询结果的列映射到Java对象的属性,可以通过属性名或者别名进行映射。
  2. 嵌套映射(Nested Mapping):

    • 将查询结果的多个列映射到一个复杂对象的属性,这个复杂对象可以是JavaBean中的一个字段,也可以是一个嵌套的JavaBean对象。
  3. 关联映射(Association Mapping):

    • 将查询结果的多个列映射到一个关联对象的属性,这个关联对象通常是另一个JavaBean,通过关联对象的属性访问关联对象的属性。
  4. 集合映射(Collection Mapping):

    • 将查询结果的多行数据映射到一个集合类型的属性,支持List、Set、Map等集合类型,并可以嵌套使用。
  5. 自动映射(Auto Mapping):

    • MyBatis提供了自动映射的功能,可以根据查询结果的列名和Java对象的属性名进行自动映射,不需要显式配置映射关系。
  6. 构造函数映射(Constructor Mapping):

    • 将查询结果的列映射到Java对象的构造函数参数,通过构造函数来创建Java对象。
  7. 高级映射(Advanced Mapping):

    • MyBatis支持更加灵活和复杂的映射形式,如枚举映射、富类型映射等,可以根据具体情况进行定制。

以上是常用的MyBatis结果映射形式,开发人员可以根据需求选择合适的映射形式来实现数据库结果的封装。这些映射形式提供了灵活的方式来实现数据库结果和Java对象之间的映射关系,使得开发人员可以更加方便地操作数据库数据。

3.Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

除了常见的 <select><insert><update><delete> 标签之外,MyBatis的XML映射文件还有一些其他常用的标签,包括:

  1. <resultMap>

    • 用于定义结果集的映射关系,将查询结果的列映射到Java对象的属性或者关联对象的属性。
  2. <result>

    • 用于定义单个结果集的映射关系,指定了一个查询结果列与Java对象的属性之间的映射关系。
  3. <association>

    • 用于定义关联对象的映射关系,将查询结果的多个列映射到一个关联对象的属性。
  4. <collection>

    • 用于定义集合属性的映射关系,将查询结果的多行数据映射到一个集合类型的属性。
  5. <constructor>

    • 用于定义构造函数的映射关系,将查询结果的列映射到Java对象的构造函数参数,通过构造函数来创建Java对象。
  6. <sql>

    • 用于定义可重用的SQL片段,可以在其他SQL语句中引用这些SQL片段,减少重复代码。
  7. <include>

    • 用于包含其他XML片段,可以在XML映射文件中引用其他的SQL语句或SQL片段。
  8. <if><choose><when><otherwise>

    • 用于条件判断,可以根据条件动态生成SQL语句。
  9. <foreach>

    • 用于循环遍历集合,可以在SQL语句中动态生成多个参数。
  10. <bind>

    • 用于将表达式计算结果绑定到一个变量,方便在SQL语句中使用。
  11. <cache>

    • 用于配置缓存,可以提高查询性能。
  12. <parameterMap>

    • 用于定义参数映射关系,指定了查询参数与SQL语句中的参数之间的映射关系。
  13. <selectKey>

    • 用于在插入操作中获取生成的主键值。
  14. <sqlProviders>

    • 用于自定义SQL提供者,可以实现自定义的SQL生成逻辑。
  15. <databaseIdProvider>

    • 用于根据不同的数据库类型执行不同的SQL语句。

这些标签可以帮助开发人员更加灵活地编写SQL语句,并实现复杂的映射关系和逻辑处理。

相关推荐
编程版小新几秒前
C++初阶:STL详解(四)——vector迭代器失效问题
开发语言·c++·迭代器·vector·迭代器失效
陈大爷(有低保)14 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
c4fx20 分钟前
Delphi5利用DLL实现窗体的重用
开发语言·delphi·dll
kinlon.liu28 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
鸽芷咕44 分钟前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis