springboot整合mybatis时Could not resolve type alias 'xxx'

2023-11-17

注意:不管用下列哪种解决方法,都要在启动类中加入(总结:springboot整合mybatis要扫描三个东西:mapper接口类,映射文件xxxmapper.xml,实体类):

//指定mapper接口类的位置
@MapperScan(basePackages= "com.wordpython.mapper")

解决方案:

一:mapper.xml中的resultType中经常会用到一些自定义POJO,你可以用完全限定名来指定这些POJO的引用,例如

<select id="getUsers" resultType="com.majing.learning.mybatis.entity.User">

二:通过在application.properties中指定POJO扫描包来让mybatis自动扫描到自定义POJO,如下:

#配置数据库实体对象的位置和mapper映射文件的位置
mybatis.type-aliases-package=com.wordpython.po
mybatis.mapper-locations=classpath:com/wordpython/mapper/*.xml

!然后,如果使用第二种扫描包的方法,有可能还是Could not resolve type alias 'xxx',

解决办法:

参考博主A_Beaver的文章,原来mybatis的facroty需要加载SpringBoot独特的虚拟文件系统,才能识别类路径

public SpringBootVFS() {
    this.resourceResolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader());
}

从以上代码看,其实是通过PathMatchingResourcePatternResolver实现资源的加载

修复该问题只需要在mybatis的配置类中,设置一下factory即可,

  @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setVfs(SpringBootVFS.class);//设置SpringBootVFS
        bean.setTypeAliasesPackage("com.fulan.domain.red");//添加这一句
        ...
    }

问题来了,在mybatis的配置类中设置factory???怎么弄??

我的想法是重写这个方法,https://blog.csdn.net/doctor_who2004/article/details/70163144

下面是我的解决过程,记录一下,好奇怪啊!!!

我直接在启动类里面添加运行后,再注释掉

package com.wordpython;

import javax.sql.DataSource;

import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.ResourceLoader;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

@SpringBootApplication // 一个注解顶下面3个
//@SpringBootConfiguration
//@EnableAutoConfiguration//这里有了,其他controller就不用写了
//@ComponentScan

//指定mapper类的位置
@MapperScan(basePackages = "com.wordpython.mapper")
public class ApplicationStart {

	public static void main(String[] args) {
		SpringApplication.run(ApplicationStart.class, args);
	}
	
	/*
	 * 好奇怪啊!
	 * 为什么把下面的注释的呢,是这样的,没加下面代码之前,报错Could not resolve type alias 'User',
	 * 加了之后,报其他错误,注释掉后,重新运行,没有报任何错包括Could not resolve type alias 'User',运行成功
	 */
//	@Autowired
//	private MybatisProperties properties;
//	@Autowired
//	private ResourceLoader resourceLoader = new DefaultResourceLoader();
//	@Autowired(required = false)
//	private Interceptor[] interceptors;
//	@Autowired(required = false)
//	private DatabaseIdProvider databaseIdProvider;
//
//	@Bean(name = "masterSqlSessionFactory")
//	@Primary
//	public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
//		SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
//		factory.setDataSource(dataSource);
//		factory.setVfs(SpringBootVFS.class);
//		factory.setTypeAliasesPackage("com.wordpython.po");//mybatis.type-aliases-package还是扫描不到包,所以要添加这一句
//		if (StringUtils.hasText(this.properties.getConfigLocation())) {
//			factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfigLocation()));
//		}
//		factory.setConfiguration(properties.getConfiguration());
//		if (!ObjectUtils.isEmpty(this.interceptors)) {
//			factory.setPlugins(this.interceptors);
//		}
//		if (this.databaseIdProvider != null) {
//			factory.setDatabaseIdProvider(this.databaseIdProvider);
//		}
//		if (StringUtils.hasLength(this.properties.getTypeAliasesPackage())) {
//			factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
//		}
//		if (StringUtils.hasLength(this.properties.getTypeHandlersPackage())) {
//			factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
//		}
//		if (!ObjectUtils.isEmpty(this.properties.resolveMapperLocations())) {
//			factory.setMapperLocations(this.properties.resolveMapperLocations());
//		}
//		return factory.getObject();
//	}
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot整合mybatis时Could not resolve type alias 'xxx' 的相关文章

随机推荐

  • stm32学习笔记——如何理解stm32中标志位和中断位区别和联系

    1 当某个模块 比如串口 定时器 含有状态寄存器则涉及标志位和中断之间的区别 进而有库函数FlagStatus和ITStatus的使用区别 2 标志位置位 是指当某事件发生时 无论对应的中断是否使能都会使得相应的标志位置位 而当对应的中断也
  • akka设计模式系列-Chain模式

    链式调用在很多框架和系统中经常存在 算不得上是我自己总结的设计模式 此处只是简单介绍在Akka中的两种实现方式 我在这边博客中简化了链式调用的场景 简化后也更符合Akka的设计哲学 trait Chained def receive Rec
  • 数学建模--二次规划型的求解的Python实现

    目录 1 算法流程简介 2 算法核心代码 3 算法效果展示 1 算法流程简介 二次规划模型 二次规划我们需要用到函数 Cvxopt solvers qp P q G h A b 首先解决二次规划问题和解决线性规划问题的流程差不多 求解思路如
  • 中文医学知识语言模型:BenTsao

    介绍 BenTsao 原名 华驼 HuaTuo 基于中文医学知识的大语言模型指令微调 本项目开源了经过中文医学指令精调 指令微调 Instruction tuning 的大语言模型集 包括LLaMA Alpaca Chinese Bloom
  • 无法打开这个应用,查看Microsoft store, 了解有关Nahimic的详细信息

    win s 打开搜索框 输入 Nahimic 鼠标右键单击 打开应用设置 点击 修复 重启电脑
  • 计算机图形学:Bezier曲线的绘制

    1 实验目的 掌握Bezier曲线的定义原理及绘制过程 定义 贝塞尔曲线 Bezier curve 又称贝兹曲线或贝济埃曲线 是应用于二维图形应用程序的数学曲线 一般的矢量图形软件通过它来精确画出曲线 贝兹曲线由线段与节点组成 节点是可拖动
  • 什么是千年虫?计算机如何开始处理日期?都有哪些时间日期格式化?

    目录 千年虫 漏洞 Year 2000 Problem 简称 Y2K 计算机是怎么开始处理日期的么 举例1 时间格式化举例 过滤器 举例2 时间格式化 自定义私有过滤器 日期格式化 高性能计数器演示 OLE时间对象 时间的基本用法 千年虫
  • 【Hello Algorithm】二叉树的递归套路

    本篇博客介绍 介绍二叉树的递归套路算法 二叉树的递归套路 递归思路 判断二叉树是否是平衡二叉树 判断二叉树是否是搜索二叉树 返回二叉树节点的最大距离 验证一棵树是否是满二叉树 寻找最大的BST子树 判断二叉树是否是完全二叉树 判断二叉树的最
  • Shell脚本:expect脚本免交互

    Shell脚本 expect脚本免交互 expect脚本免交互 一 免交互基本概述 1 交互与免交互的区别 2 格式 3 通过read实现免交互 4 通过cat实现查看和重定向 5 变量替换 二 expect安装 1 概述 2 作用 3 e
  • RuntimeError: one of the variables needed for gradient computation has been modified by an inplace o

    RuntimeError one of the variables needed for gradient computation has been modified by an inplace operation torch cuda F
  • 牛客每日刷题

    作者简介 我是18shou 一名即将秋招的java实习生 个人主页 18shou 系列专栏 牛客刷题专栏 在线刷题面经模拟面试 目录 题目 思路 题解 题目 给定一个长度为 n 的字符串 请编写一个函数判断该字符串是否回文 如果是回文请返回
  • computed计算属性和data_computed与watched选项的比较

    computed 通过属性计算而得来的属性 1 支持缓存 只有依赖数据发生改变 才会重新进行计算 computed 属性值会默认走缓存 计算属性是基于它们的响应式依赖进行缓存的 也就是基于data中声明过的数据通过计算得到的 2 不支持异步
  • 3.python学习笔记——Python数据类型转换

    有时候 我们需要对数据内置的类型进行转换 数据类型的转换 你只需要将数据类型作为函数名即可 以下几个内置的函数可以执行数据类型之间的转换 这些函数返回一个新的对象 表示转换的值 int x base 将x转换为一个整数 float x 将x
  • Modern C++ for C 程序员 第4部分

    文章目录 面向 C 程序员的 Modern C 系列第4部分 Lambdas 扩展我们的索引器 容器和算法 查找 STL中的查找算法 更多的容器 Boost容器 Boost MultiIndex 总结 这是bert hubert的系列文章
  • opencv3特征检测的配置与使用

    官网下载opencv for Linux 和opencv contrib opencv版本 3 4 1 编译安装 编译选项为 cmake D OPENCV EXTRA MODULES PATH
  • 在colab中运行shell

    只需要在cell单元格第一行加上 shell 然后按运行按钮 就可以将单元格的内容当做shell执行了 参考例子 https colab research google com drive 1N7p0B 7QWEQ9TIWRgYLueW03
  • 背景的偏移与定位和背景固定

    background position背景的偏移 背景图片默认是贴着元素的左上角显示 通过background position可以调整背景图片在元素中的位置 可选值 该属性可以使用 top right left bottom center
  • java resultset 最后一行_Java:删除选定的行ResultSet,从数据库中删除最后一行?

    谢谢 Germann 我解决了它 我将提供解决方案 以便其他人可以从中获得帮助 你是对的resultSet absolute 返回布尔值 但它也将光标移动到其参数resultSet absolute table getSelectedRow
  • html2canvas 绘制海报清晰度

    场景 使用html2canvas绘制海报 生成海报比较模糊 解决方案 方案一 增大dpi dpi DPI是指某些设备分辨率的度量单位 DPI越低 扫描的清晰度越低 DPI越高 清晰度越高 由于受网络传输速度的影响 web上使用的图片都是72
  • springboot整合mybatis时Could not resolve type alias 'xxx'

    注意 不管用下列哪种解决方法 都要在启动类中加入 总结 springboot整合mybatis要扫描三个东西 mapper接口类 映射文件xxxmapper xml 实体类 指定mapper接口类的位置 MapperScan basePac