Mybatis - Mapper.xml映射器解析

前言

完成了简单的CRUD
解读了Mybatis-config.xml的标签
学会了日志工厂的使用
通过源码分析了Mybatis的运行流程

现在来看看sql语句的xml文件:Mapper.xml(映射器)


UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        
<!--绑定一个mapper接口-->
<mapper namespace="com.learn.dao.UserMapper">

    <!--结果集映射-->
    <resultMap id="UserMap" type="User">
        <!--column是数据库字段,property是实体类的属性-->
        <result column="pwd" property="password"/>
    </resultMap>

    <select id="getUserById" resultMap="UserMap" parameterType="int">
        select * from mybatis.user where id = #{id}
    </select>
    
</mapper>

我们的UserMapper.xml由这几个要素组成:

1. 约束

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

mapper.xml是xml文件,第一行必须是声明,第二行是指定外部约束文件
当有了外部的约束文件,才能规定标签,我们打一个尖括号就出来的标签全是约束文件指定的

通过这个约束文件可以看到:
在这里插入图片描述
根标签是mapper,内部有cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select
他们不像mybatis-config.xml,并没有标签顺序

不清楚xml约束的可以看:真的了解XML吗? - XML 基础

2.根标签
根标签只有一个属性namespace
在这里插入图片描述

这个属性指定我们这个mapper.xml对应的mapper接口

3.子标签
cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select

官网的说法:
在这里插入图片描述

这些是具体的子标签,后面研究


怎么查看这些标签

在这里插入图片描述

鼠标点到mapper标签上,按住ctrl,点击鼠标左键
在这里插入图片描述

会有一个下划线,就可以进入mybatis-3-mapper.dtd(dtd约束)

在这里插入图片描述


初始项目

先搭建一个初始项目跑起来(会的话可以直接跳过,到后面的标签解析)

Mybatis连接数据库

在这里插入图片描述

db.properties设置连接数据库的属性

在这里插入图片描述
mybatis-config.xml配置mybatis
设置别名,映射和数据库连接

在这里插入图片描述

实体类(实体类偷懒神器:Lombok插件):

package com.learn.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private String password;
}

工具类MybatisUtils(负责创建sqlSession):

在这里插入图片描述

UserMapper接口:定义操作数据库的方法

在这里插入图片描述

UserMapper.xml:sql操作数据库

在这里插入图片描述

测试类:
junit测试
在这里插入图片描述

数据库:

在这里插入图片描述

测试结果:

getUserById(1),即查找id=1的User

在这里插入图片描述


Select标签

先看这个最常用的标签

在这里插入图片描述

说明select内部可以有include | trim | where | set | foreach | choose | if | bind标签
也可以直接写sql语句(#PCDATA)

有很多属性
在这里插入图片描述

在这里插入图片描述

常用的有:

  • id:标识mapper接口的方法,与之相对应(我们这个select对应的就是getUserById方法)
  • parameterType:传入的参数类型,Mybatis内置了一下属性别名如int类型就要写_int(默认是int型,可以省略该属性),如果是我们自己的实体类,就需要写完全的类名如com.learn.pojo.User,当然可以通过mybatis-config.xml设置别名

如果不清楚可以看:Mybatis - 核心配置文件Mybatis-config.xml标签详解(上)

  • resultType:结果类型,和parameterType要求一样

  • resultMap:结果集,当返回的结果需要我们处理时,可以使用它(具体的后面解析)

  • timeout:超时时间

  • databaseId:当支持多个数据库时,需要设置属性表示该sql是运行在哪个数据库

内部的标签中,include是这个标签引入外部数据
在这里插入图片描述

必须有refid,也就是外部数据名或者地址
可以有property子标签

//通过id查找
<include refid="sql">
    <property name="id" value="1"/>
</include>
//通过地址查找,然后取出id
<include refid="com.learn.dao.UserMapper">
    <property name="id" value="${id}"/>
</include>

用于复用sql语句

关于其他的内部标签,放到动态sql学习


增删改

insert、update、delete3个标签都约束都是一样的,与select类似

在这里插入图片描述
但是没有返回结果,因为从我们学习jdbc时候就知道,增删改resultSet都是int数据,表示本次操作改动的数据库数据条数

注意:select标签内可以使用增删改sql,但是没有返回结果,为Integer的null

这个让我碰了个大坑:Mybatis碰到的问题


sql标签

sql标签是可被重用的sql语句块

    <select id="getUserById" resultMap="UserMap">
        select * from mybatis.user
        <include refid="sql"/>
    </select>


    <sql id="sql">
        where id = #{id}
    </sql>

sql设置一个sql语句块,需要的话就直接通过include标签拿到即可

依旧可以查到数据
在这里插入图片描述


ResultMap:处理别名

ResultMap是用于处理返回的结果集

上面的案例里:

数据库字段:
在这里插入图片描述

实体类字段:
在这里插入图片描述

mybatis默认是需要数据库与实体类字段对应

把前面的resultMap改成resultType
在这里插入图片描述

当字段不对应的时候,该实体类字段为空值

在这里插入图片描述

解决方法:

  1. 直接给字段取别名

既然pwd对应的是password,那我就把名字改成对应的就可以了(简单粗暴)

在这里插入图片描述

但是,如果不知道字段,就没办法用这种方法了

  1. resultMap结果集映射

当返回的结果集需要处理时,添加resultMap标签处理

    <!--结果集映射-->
    <resultMap id="UserMap" type="User">
        <!--column是数据库字段,property是实体类的属性-->
        <result column="pwd" property="password"/>
    </resultMap>

id是这个resultMap 的标识,type是结果对应的实体类
result 是我们想要处理的字段,column是数据库字段,property是实体类的属性

我们这样就把返回的结果集中的pwd转换为了password

注入到User类中,就不会出现空值


ResultMap详解

在这里插入图片描述

子标签:constructor?,id*,result*,association*,collection*, discriminator?
属性:id,type,extends,autoMapping

属性:

  • id:该标签的唯一标识
  • type:映射的pojo实体类
  • extends:实现存在继承关系的两个类实体的映射。extends填父类的resultMap
  • autoMapping: 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在resultMap内明确注明映射关系才会调用对应的setter方法

默认是true,也就是自动注入到实体类,如果设置为false
在这里插入图片描述
在这里插入图片描述

除了了设置好了的pwd,其他属性都没有帮我们注入

子标签:

<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->

<resultMap id="唯一的标识" type="映射的pojo对象">

  <id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
  
  <result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型" property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
  
  <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
    <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
    <result  column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/>
  </association>
  
  <!-- 集合中的property须为oftype定义的pojo对象的属性-->
  <collection property="pojo的集合属性" ofType="集合中的pojo对象">
    <id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
    <result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />  
  </collection>
  
</resultMap>
  • id、result标签,用于指定某个字段,基本没有区别
  • association :表示一个对象,当实体类中引用了其他对象,就需要这个标签

比如一Student类中引用了Teacher类
在这里插入图片描述

在这里插入图片描述

resultMap:返回的Student结果中,返回一个Teacher对象

在这里插入图片描述

  • collection :集合,如果返回的类型是集合,就需要使用这个标签

一个Teacher返回一个List,类型为Student
在这里插入图片描述
在这里插入图片描述

就需要collection标签

在这里插入图片描述

这是复杂查询,后续继续详解


缓存

当需要开启二级缓存时:
加上标签:

<cache/>

或者自定义缓存:

在这里插入图片描述

缓存中也有很多属性:

在这里插入图片描述

在后续的缓存中学习。。。


总结

Mapper.xml映射大致就这些,因为还涉及到缓存、动态sql、复杂查询,后续再深入分析

当然,可以用注解代替增删改查,后续分析

学海无涯苦作舟

都看到这了,点个赞呗(^_−)☆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: mybatis-config.xmlMyBatis 框架中的一个配置文件,它用于配置 MyBatis 的各种全局属性和设置,例如数据源信息、类型别名、插件等。在使用 MyBatis 框架时,我们可以根据自己的需要修改该配置文件,以满足特定的业务需求。 ### 回答2: mybatis-config.xmlMyBatis框架中的配置文件之一,用于配置MyBatis的全局属性和各种插件、别名等。在MyBatis中,mybatis-config.xml的配置非常重要,它可以决定整个框架的行为。 在mybatis-config.xml文件中,我们可以进行一系列的配置,包括: 1. 数据库连接的配置:可以通过配置数据库驱动类、连接URL、用户名、密码等来连接数据库。 2. 设置MyBatis的运行环境:可以配置多个环境,每个环境可以有自己的数据源和事务管理器。 3. 映射器Mapper)的配置:可以通过配置<bean></bean>标签来注册映射器接口,MyBatis会自动扫描并生成对应的实现类。 4. 插件(Plugin)的配置:可以通过配置<plugins></plugins>标签来注册插件,插件可以对MyBatis的底层行为进行增强和扩展。 5. 别名(Alias)的配置:可以为Java类配置别名,提供更简洁的类名引用。 6. 全局属性:可以配置默认的数据库方言、缓存策略、懒加载等属性。 通过对mybatis-config.xml的配置,我们可以灵活地调整和优化MyBatis的性能和功能,满足项目的需求。同时,mybatis-config.xml的配置是基于XML的,也可以通过对应的Java配置类来替代,实现更简洁和灵活的配置方式。 总之,mybatis-config.xmlMyBatis框架中非常重要的配置文件,通过对其的配置,我们可以灵活地定制和优化MyBatis的各项功能和属性,提高数据库操作的效率和性能。 ### 回答3: mybatis-config.xmlMyBatis框架中的配置文件,主要用于配置和管理MyBatis的各种全局属性和设置。 该配置文件包含了多个重要的配置项: 1. 数据库连接信息:可以在mybatis-config.xml中配置数据库的连接信息,包括数据库驱动、连接URL、用户名和密码等。 2. 映射器配置:可以添加或引用映射器Mapper)配置文件,将Java对象与SQL语句进行映射。映射器可以定义SQL语句、参数映射和结果映射等信息。 3. 缓存配置:可以配置MyBatis的缓存策略,包括一级缓存和二级缓存。一级缓存是默认开启的,在同一个SqlSession中可以共享缓存数据;而二级缓存是数据共享的范围更广,可以跨SqlSession共享缓存数据。 4. 插件配置:可以配置插件来扩展或修改MyBatis的核心功能。MyBatis提供了多个插件接口,可以自定义插件来实现拦截SQL执行、参数处理、结果处理等功能。 5. 其他全局设置:还可以在mybatis-config.xml中配置其他全局设置项,比如日志实现、数据库类型别名、懒加载开关等。 通过mybatis-config.xml,我们可以对MyBatis进行全局性的配置和管理。该配置文件提供了灵活的配置选项,可以根据具体需求进行配置,从而提高对数据库的访问效率和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值