Mybatis 别名的配置 + Mybatis配置类的调查

news2024/11/18 5:57:48

参考资料

  1. Mybatis配置类别名
  2. mybatis-spring-boot-autoconfigure
  3. 类型别名(typeAliases)
  4. SpringBoot五步配置Mybatis超简教程

目录

  • 一. 使用场景
  • 二. 前期准备
    • 2.1 实体类
    • 2.2 查询接口
  • 三. 配置方式1 配置文件的方式
    • 3.1 application.yml文件
    • 3.2 SQL的XMl文件
    • 3.3 效果
  • 四. 配置方式2 配置类的方式
    • 4.1 创建配置类,实现ConfigurationCustomizer
    • 4.2 效果
  • 五. 原理
  • 六. 注意事项


一. 使用场景

  • 如下面的代码所示,我们通过一个SQL查询数据,返回值类型为Ttag类型,我们需要通过resultType来指定Ttag类的全路径com.example.jmw.entity.alias.Ttag。一两个类还好说,如果使用的实体类数量过多,配置起来就很繁琐,我们需要为每一个类都指定全路径。
  • 这个时候,就可以用到Mybatis的别名配置,我们可以指定实体类指定别名或者指定Mybatis扫描某个包,自动为该包下面的所有实体类都起别名。
<?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 namespace="com.example.jmw.mapper.alias_mapper.TtagMapper">
    <select id="queryAllTtag" resultType="com.example.jmw.entity.alias.Ttag">
        SELECT
          *
        FROM
          t_tag
    </select>
</mapper>

二. 前期准备

2.1 实体类

  • alias包下的实体类
package com.example.jmw.entity.alias;

import lombok.Data;
import org.apache.ibatis.type.Alias;

@Data
@Alias("jmwUser")
public class EnumUser {

    private String name;

    private String sex;
}
package com.example.jmw.entity.alias;

import lombok.Data;

@Data
public class I18message {

    private String code;

    private String locale;

    private String item;
}
package com.example.jmw.entity.alias;

import lombok.Data;

@Data
public class Ttag {

    private String id;

    private String name;
}

2.2 查询接口

import com.example.jmw.entity.alias.EnumUser;
import java.util.List;

public interface EnumUserMapper {

    List<EnumUser> queryAllEnumUser();
}
import com.example.jmw.entity.alias.I18message;
import java.util.List;

public interface I18messageMapper {

    List<I18message> queryAllI18message();
}
import com.example.jmw.entity.alias.Ttag;
import java.util.List;

public interface TtagMapper {

    List<Ttag> queryAllTtag();
}

三. 配置方式1 配置文件的方式

3.1 application.yml文件

  • 如果有多个包的话,中间用分隔。
mybatis:
    type-aliases-package: com.example.jmw.entity.alias;

3.2 SQL的XMl文件

  • 我们之所以可以把resultType的值配置为jmwUser,是因为我们在EnumUser实体类上配置了@Alias("jmwUser")注解,手动指定了EnumUser实体类的别名。
<mapper namespace="com.example.jmw.mapper.alias_mapper.EnumUserMapper">
    <select id="queryAllEnumUser" resultType="jmwUser">
        SELECT
          *
        FROM
          enumuser
    </select>
</mapper>
  • 如果我们没有通过@Alias注解手动指定别名,默认别名为类的名称,开头字母可以大写,不过推荐使用小写。
<mapper namespace="com.example.jmw.mapper.alias_mapper.I18messageMapper">
    <select id="queryAllI18message" resultType="i18message">
        SELECT
          *
        FROM
          i18message
    </select>
</mapper>
  • 之前的使用全类名的方式,可以和别名的方式混用。
<mapper namespace="com.example.jmw.mapper.alias_mapper.TtagMapper">
    <select id="queryAllTtag" resultType="com.example.jmw.entity.alias.Ttag">
        SELECT
          *
        FROM
          t_tag
    </select>
</mapper>

3.3 效果

在这里插入图片描述


四. 配置方式2 配置类的方式

4.1 创建配置类,实现ConfigurationCustomizer

  • MyBatis-Spring-Boot-Starter 将自动寻找实现了 ConfigurationCustomizer 接口的组件,然后会调用自定义 MyBatis 配置的方法来创建配置类。
  • 接口虽然无法直接实例化,但是可以配合函数式接口,通过lambda表达式的方式创建对象。
import org.apache.ibatis.type.TypeAliasRegistry;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;

@org.springframework.context.annotation.Configuration
public class MybatisConfig {

    /*
        ConfigurationCustomizer是一个函数式接口,函数式接口只有一个方法customize(Configuration configuration)
        通过ConfigurationCustomizer来创建Mybatis的配置
    */
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {

        // 下面这种写法是lambda式的简写的方式
        return configuration -> {

            // 打开别名注册类
            TypeAliasRegistry typeAliasRegistry = configuration.getTypeAliasRegistry();
            // 指定包下面所有的实体类都设置别名
            typeAliasRegistry.registerAliases("com.example.jmw.entity.alias");

            // 添加拦截器
            // configuration.addInterceptor();

            // 开启驼峰命名映射
            // configuration.setMapUnderscoreToCamelCase(true);
        };
    }
}

或者可以通过实现接口这种方式

import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.type.TypeAliasRegistry;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;

@org.springframework.context.annotation.Configuration
public class MybatisConfig implements ConfigurationCustomizer {

    @Override
    public void customize(Configuration configuration) {
        // 打开别名注册类
        TypeAliasRegistry typeAliasRegistry = configuration.getTypeAliasRegistry();
        // 指定包下面所有的实体类都设置别名
        typeAliasRegistry.registerAliases("com.example.jmw.entity.alias");
        
		// 添加拦截器
        // configuration.addInterceptor();

        // 开启驼峰命名映射
        // configuration.setMapUnderscoreToCamelCase(true);
    }
}

4.2 效果

在这里插入图片描述


五. 原理

由下面的源码截图可知,Mybatis读取我们指定的包的路径,将包中所有的类都添加到别名的HashMap中。

在这里插入图片描述
在这里插入图片描述


六. 注意事项

之前在写这个demo时,遇到通过配置文件和配置类指定别名的时候,无法生效的问题。经过调查之后,发现自己在工程中还配置了Mybatis的拦截器,代码如下:

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.TypeAliasRegistry;
import org.mybatis.spring.SqlSessionFactoryBean;
//import org.mybatis.spring.boot.autoconfigure.SqlSessionFactoryBeanCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    // 注入数据源
    @Resource
    private DataSource dataSource;

    // 注入自定义参数拦截器
    @Resource
    private MybatisParamInterceptor paramInterceptor;

    @Bean
    public SqlSessionFactory sqlSessionFactorySecondary() throws Exception {

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        // 设置数据源
        sqlSessionFactoryBean.setDataSource(dataSource);
        // 设置拦截器(可设置多个)
        Interceptor[] plugins = {paramInterceptor};
        sqlSessionFactoryBean.setPlugins(plugins);
        return sqlSessionFactoryBean.getObject();
    }
}

😅😅😅
在此配置类中,我们使用了SqlSessionFactory 来添加Interceptor,将SqlSessionFactory添加到Spring的IOC容器中的这种方式,会导致Mybatis的配置文件或配置类失效。因为无论配置文件还是配置类,最终都是加载到SqlSessionFactory中,如果我们自己手动new一个SqlSessionFactory到Bean中的话,相当于重置了Mybatis为我们自动配置好的SqlSessionFactory。

💪💪💪
官方给我们提供了SqlSessionFactoryBeanCustomizer接口来实现
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

做完这些lab,国内外大厂横着走

hi&#xff0c;大家好&#xff0c;这里是极客重生&#xff0c;坚实的计算机基础&#xff0c;对我们发展都是至关重要的&#xff0c;不管是校招还是社招&#xff0c;因此我和小伙伴一起收集了一些国内外硬核lib和开源项目来帮助大家学习和巩固基础&#xff08;动手实践&#xff…

计算机组成原理 第一章_概述

typora-copy-images-to: images 文章目录 typora-copy-images-to: images1.现代计算机的结构2.各硬件的工作原理2.1 主存储器的基本组成2.2 运算器的基本组成2.3 控制器的基本组成2.4 计算机的工作过程 3.计算机系统的层次结构4. 计算机的性能指标4.1存储器的性能指标4.2 CPU的…

14-Vue3快速上手

目录 1.Vue3简介2. Vue3带来了什么2.1 性能的提升2.2 源码的升级2.3 拥抱TypeScript2.4 新的特性 1、海贼王&#xff0c;我当定了&#xff01;——路飞 2、人&#xff0c;最重要的是“心”啊&#xff01;——山治 3、如果放弃&#xff0c;我将终身遗憾。——路飞 4、人的梦想是…

chatgpt赋能python:Python如何创建一个DataFrame

Python如何创建一个DataFrame 在数据科学和分析领域中&#xff0c;DataFrame是一种非常常见的数据结构。它类似于电子表格&#xff0c;可以存储和处理包含多个列和行的数据。在Python中&#xff0c;pandas库提供了DataFrame数据结构的支持。 什么是DataFrame&#xff1f; Da…

Hugging News #0602: Transformers Agents 介绍、大语言模型排行榜发布!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」&#xff0c;本期 Hugging News 有哪些有趣的消息…

聚观早报 | B站第一季度净亏损同比下降72%;​必应聊天放宽限制

今日要闻&#xff1a;B站第一季度净亏损同比下降72%&#xff1b;必应聊天放宽限制&#xff1b;马斯克再次成为世界首富&#xff1b;英伟达CEO黄仁勋计划访华&#xff1b;联想moto razr 40系列新品发布 B站第一季度净亏损同比下降72% 6 月 1 日消息&#xff0c;哔哩哔哩&#x…

哈希表理论基础

目录 哈希表 哈希函数 哈希碰撞 一般哈希碰撞有两种解决方法&#xff0c; 拉链法和线性探测法。 拉链法 线性探测法 常见的三种哈希结构 set map 总结 哈希表 哈希表是根据关键码的值而直接进行访问的数据结构。 哈希表中关键码就是数组的索引下标&#xff0c;然后通…

Linux NGINX 优化与防盗链

----------------隐藏版本号------------------- 可以使用 Fiddler 工具抓取数据包&#xff0c;查看 Nginx版本&#xff0c; 也可以在 CentOS 中使用命令 curl -I http://192.168.80.101 显示响应报文首部信息。 curl -I http://192.168.80.101 方法一&#xff1a;修改配置文件…

java工程师技术成长之路

1、新手阶段&#xff0c;全面、扎实地掌握语言的基本要素是你的当务之急。当然&#xff0c;除了语言&#xff0c;你还需要了解与编程相关的其他周边知识。 2、工作了几年&#xff0c;整天忙于业务代码&#xff0c;初级工程师很容易困惑下一步的方向在哪里&#xff0c;并且相当多…

KVM 虚拟化

1.1 前言 1.1.1 什么是虚拟化&#xff1f; 在计算机技术中&#xff0c;虚拟化&#xff08;技术&#xff09;或虚拟技术&#xff08;英语&#xff1a;Virtualization&#xff09;是一种资源管理技术&#xff0c;是将计算机的各种实体资源&#xff08;CPU、内存、磁盘空间、网络…

当你怀疑电脑的时候,就是该换个方法的时候了

做软件开发的朋友们&#xff0c;干的时间长了&#xff0c;相信都会有过类似的体验&#xff1a;一个问题查了很久很久&#xff0c;代码检查了很多遍很多遍&#xff0c;到最后都要怀疑电脑了&#xff0c;突然发现是一个特别隐蔽的错误导致的&#xff0c;而这种错误通常不涉及逻辑…

2021第十二届蓝桥杯Python组国赛【真题+解析+代码】

&#x1f381;2021第十二届蓝桥杯python组国赛真题 &#x1f680; 真题练习&#xff0c;冲刺国赛 &#x1f680; 2021第十二届蓝桥杯python组国赛真题解析代码 博观而约取&#xff0c;厚积而薄发 &#x1f3c6;国赛真题目录 文章目录 &#x1f381;2021第十二届蓝桥杯python组国…

chatgpt赋能python:Python创建一个3x3的数组

Python创建一个3x3的数组 如果您是一名Python的爱好者或是初学者&#xff0c;在处理数据的时候一定会遇到需要创建数组的情况。在本篇文章中&#xff0c;我们将会介绍如何使用Python创建一个3x3的数组。在这个过程中&#xff0c;我们将从定义数组开始&#xff0c;到最后输出结…

【Python】函数 ⑥ ( 变量作用域 | 局部变量 | 全局变量 | global 关键字 | 代码示例 )

文章目录 一、变量作用域1、局部变量2、全局变量3、代码示例 - 函数体内修改全局变量失败4、代码示例 - 函数体内修改全局变量 一、变量作用域 Python 变量 作用域 是 变量的 使用范围 , 变量 在哪些 代码区域中可以被访问 , 在哪些代码块中不能被访问 ; 变量主要分为两类 : 局…

国产化麒麟系统在window系统上用hyper-v搭建虚拟机环境QT安装文件传输步骤

1 麒麟系统国产化hyper-v虚拟机环境经验 1.1 简介 随着国际环境的变化&#xff0c;软硬件国产化是现在迫切的需求&#xff0c;只有实现了自主研发&#xff0c;才能自立自强&#xff0c;才能实现民族伟大复兴&#xff0c;才能实现祖国的繁荣昌盛。为了实现这一目标&am…

AI可能造成人类灭绝,真的还是炒作?

5月30日&#xff0c;一封由非营利组织人工智能安全中心&#xff08;Center for AI Safety&#xff09;发布的简短声明轰动了AI界&#xff0c;导致人工智能的地位可能会被动摇。 我们在该组织的官网上找到了这份声明。声明中仅有22个单词&#xff0c;却饱含了专家对AI的“控诉”…

JavaEE-JVM的学习

目录 JVM执行流程JVM内存区域划分程序计时器栈堆方法区 JVM类加载机制1)Loading环节2)Linking环节2.1) Verification2.2)Preparation2.3)Resolution 3)Initializing JVM典型面试题JVM的垃圾回收机制(GC)分代回收 JVM执行流程 程序在执行之前先要把java代码转换成字节码&#xf…

盘点一个Python自动化办公需求,实现数据自动填充(下篇)

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 七月七日长生殿&#xff0c;夜半无人私语时。 大家好&#xff0c;我是皮皮。 一、前言 前几天遇到了一个小需求&#xff0c;粉丝自己在实际工作中的需求…

回顾 | Semantic Kernel:面向 AI 编程(二) - Prompt Skill

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软 Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 .NET Core, C#, Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链, IoT 等技术&#xff0…

子集II--(回溯+去重)

1题目 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,2…