• MyBatis基础之自动映射、映射类型、文件注解双配置


    在这里插入图片描述

    自动映射原理

    MyBatis 的配置文件settings 元素部分)中,有一个 autoMappingBehavior 配置,其默认值PARTIAL ,表示 MyBatis 会自动映射(简单的,没有嵌套关系的)结果集。

    有三种自动映射等级:

    NONE - 禁用自动映射。仅对手动映射的属性进行映射。
    PARTIAL - 对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射
    FULL - 自动映射所有属性。`

    "PARTIAL"也 表示设置自动映射的行为为部分匹配模式。具体来说,当实体类中存在与查询结果列相同的属性时,MyBatis 会将它们进行自动映射,而对于没有匹配的列,则会忽略它们。这样可以避免在实体类中定义过多无用的属性。

    需要注意的是,如果设置了全局的自动映射行为(通过 标签中的 autoMappingBehavior 属性),则该项设置会被覆盖。此外,还可以在映射语句(Mapper)级别或者方法级别上进行自定义的自动映射行为设置,其他可以参考官方文档Auto-Mapping

    <configuration>
    
      <properties>....properties>
    
      <settings>
        ....
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        ....
      settings>
    
      <typeAliases>....typeAliases> 
    
      ....
    
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    如果你的类的属性名与表的字段名一致,那么 MyBatis 会自动将结果集的一行封装成一个 JavaBean 。

    一般而言,数据库表和字段的命名风格是以下划线为分隔符,而 Java 中命名风格是驼峰命风格。

    如果,PO 类的属性名和 Table 的列名仅仅是命名风格的不同,那么此时你可以使用 mapUnderscoreToCamelCase 进行控制,以便于自动转换或不转换。

    <configuration>
    
      <properties>....properties>
    
      <settings>
        ....
        <setting name="mapUnderscoreToCamelCase" value="false"/>
        ....
      settings>
    
      <typeAliases>....typeAliases> 
    
      ....
    
    configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    jdbcType

    将 ResultSet 数据映射成对象时,会涉及到两种数据类型:数据库类型(varchar) 和 Java 类型(String)。MyBatis 使用 类型转换器(typeHandler)来处理两种类型数据的转换问题。

    [!attention]注意,
    不同的数据库对于同一个数据类型的概念可能会使用不同的『单词』。
    例如:整型,在 MySQL 中是 INT ,在 Oracle 中是 INTEGER

    在 Java 的 JDBC 中,对不同数据库的各种类型的『称呼』进行了统一:JDBC 类型 。例如:

    『整型』的 JDBC Type 表示为 INTEGER ,即表示 MySQL 中的 INT ,又表示 Oracle 中的 INTEGER

    常见的有:

    JDBC TypeMysql TypeJava Type
    SMALLINTSMALLINTshort
    java.lang.Short
    INTEGERINTEGERint
    java.lang.Integer
    BIGINTBIGINTlong
    java.lang.Long
    FLOATFLOATfloat
    java.lang.Float
    DOUBLEDOUBLEdouble
    java.lang.Double
    DECIMALDECIMALjava.math.BigDecimal
    CHARCHARjava.lang.String
    VARCHARVARCHARjava.lang.String
    DATEDATEjava.util.Date
    TIMETIMEjava.util.Date
    TIMESTAMPTIMESTAMPjava.util.Date

    注意:对于 java.lang.Datejava.sql.Date ,是两种不同的类型。在写 JavaBean 一定要确认你所使用的是哪个 Date 类型(一般都是使用 java.lang.Date

    同时启用配置文件和注解两种配置方式

    虽然通过 mapper.xml 配置文件和注解都可以拿到 mapper 对象,进而操作数据库,不过,有意思地是,Mybatis 居然支持同时使用 mapper.xml 和注解

    虽然这个特性看起来有些多余,但是实际上它极具价值,因为,注解配置虽然万般皆好,唯独有一个功能它实现不了,在这个功能上注解是取代不了 mapper.xml 配置文件的(不知道这个问题在 MyBatis 的未来的发展中会不会解决掉)。所以,MyBatis 允许两种配置方式同时使用,我们就可以同时「享受」注解和配置文件的全部优点的同时,又避免各自的缺点。

    同时使用两种配置方式本质上是让 mapper.xml 和注解两者进行分工,你要做的操作和工作分配如下:

    1. “退回”到早期 mapper.xml 的使用方式:在核心配置文件中指定 mapper.xml 配置文件的路径名(而不是指定接口所在)
    2. 在 mapper.xml 配置文件中只配置 “” 指定映射规则,不配置 SQL 语句。SQL 语句在接口中通过 @Select 等注解指定;
    3. 在注解中使用 “@ResultMap” 注解引用 mapper.xml 配置文件中的映射规则。

    [!attention] 注意
    映射文件中的映射规则 “” 可以有多个,他们之间通过 id 来进行区分。

    另外,注解是哪一点功能实现不了,反而不如 mapper.xml 配置文件,我们在复杂映射关系之后讲解。其实就是 @Results 注解没有 100% 实现 的全部功能。

  • 相关阅读:
    leetcode第311场周赛题解
    js获取页面中某个元素的中心位置
    前端性能优化:页面加载速度慢怎么办?
    19 | 多线程1
    在Postman中使用 FineBI提供的接口获取数据
    一篇讲清楚String、StringBuffer和StringBuild
    springboot+springsecurity+elementui博客系统-dsblog
    汽车自适应巡航系统车距控制策略研究
    MyBatis详细介绍
    Java项目:JSP高校新生报到迎新管理系统
  • 原文地址:https://blog.csdn.net/m0_73393501/article/details/133814218