作者:一心同学


目录

自动映射

一、介绍

二、解释等级PARTIAL

三、实操

自动映射

一、介绍

1.在数据库列名和Java类属性名相同的情况,MyBatis会自动将数据库的值自动匹配到 Java 类的属性(忽略大小写)当中。

2.MyBatis也可开启对Java的驼峰命名与数据库的字段进行匹配,例如Java:testName==数据库:test_name。

3.如果两者的命名不匹配,并且也不满足驼峰命名匹配,MyBatis就无法完成表的信息与实体类之间的对应关系,而是需要借助ResultMap来进行手动映射。

开启驼峰命名

<?xml version="1.0" encoding="UTF-8" ?><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>

</configuration>

二、解释等级PARTIAL

自动映射又分为三种等级

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

对于这三种等级,NONE和NULL从字面意思就可以知道什么意思了,这里主要讲解一下PARTIAL

什么是在内部定义了嵌套结果映射呢?

对于这种映射方式:

<resultMap id="AutoMap" type="Blog" >
    <association property="author" resultMap="AutoMap2"/>
</resultMap>

这种就是属于在AutoMap的ResultMap内部嵌套了另一个ResultMap:AutoMap2

那么是AutoMap不可以自动映射还是AutoMap2不可自动映射呢?

答案是AutoMap2不可以自动映射。也就意味在AutoMap2这个ResultMap无法完成自动映射。

<resultMap id="AutoMap2" type="Author" >
</resultMap>

三、实操

接下来我们开始实操一下,以便大家更清楚的理解自动映射的概念。

  • 数据库表blog的结构:

mybatis mysql json字段如何映射 mybatis数据库映射_java

        对应的Java实体类:

public class Blog {
    private int id;
    private String name;
    private String pwd;
    private Author author;
    //set,get,无参,有参
}

数据库表author的结构: 

mybatis mysql json字段如何映射 mybatis数据库映射_mybatis_02

对应的Java实体类: 

public class Author {
    private int author_id;
    private String author_name;
    private String author_pwd;
    //set,get,无参,有参
}

可以得知这两个表字段名和对应实体类的属性名都是一致的,除了Blog的Author对象。 

映射文件: 

<select id="testAuto" resultMap="AutoMap">
    select b.*,a.* from blog b,author a
</select>

<resultMap id="AutoMap" type="Blog" autoMapping="true">
<association property="author" resultMap="AutoMap2"/>
</resultMap>

<resultMap id="AutoMap2" type="Author">
</resultMap>

MyBatis的默认自动映射是:PARTIAL

接下来让一心同学讲解这个过程

1.在<select>中sql语句查找出blog和author的所有字段,并通过AutoMap这个ResultMap进行映射。

2.在AutoMap里面会默认完成自动映射的Blog属性是id,name,pwd。

3.对于Blog里面的这个Author对象,采用关联association进行映射,嵌套了一个另一个resultMap:AutoMap2。

4.然而在AutoMap2这个ResultMap由于是内部的嵌套结果集,所以在这个结果集并不会完成自动映射。 让我们来测试一下: 

@Test
public void testAuto(){
        SqlSession sqlSession= MybatisUtils.getSession();
        BlogMapper mapper=sqlSession.getMapper(BlogMapper.class);

        Blog blog=mapper.testAuto();
        System.out.println(blog);
        sqlSession.close();
        }

结果:

mybatis mysql json字段如何映射 mybatis数据库映射_ide_03

正如我们所料!

在默认机制里面AutoMap2这个是不会完成自动映射的,那么我们想让它也可以完成自动映射该怎么做呢,我们只需加入

autoMapping设置自动映射,并将其打开,AutoMap2修改如下:

<resultMap id="AutoMap2" type="Author" autoMapping="true">
</resultMap>

我们再测试一下:
运行结果:

mybatis mysql json字段如何映射 mybatis数据库映射_xml_04

但是我们不推荐这么做,因为这样的话相当于FULL(自动映射所有属性)

如果假设两个数据库都拥有同一个id名(含义不一样,一个是Blog,一个是Author),然而这时候,我们的sql语句是:

select b.*,a.author_name,a.author_pwd from blog b,author a;

那么在AutoMap2这个ResultMap里面就会将Blog的id赋予给Author的id,然而这并不是我们想要的。

看到这里,是不是恍然大悟了,原来自动映射机制是这么一回事!!