SpringBoot整合Mybatis,解决TypeAliases配置失败的问题

网友投稿 287 2022-10-12


SpringBoot整合Mybatis,解决TypeAliases配置失败的问题

问题描述

在应用MyBatis时,使用对象关系映射,将对象和Aliase映射起来。

在Mybatis的文档明确写出,如果你没有明确定义实体类的Aliase,框架会自动将Class Name自动作为别名。

那么问题来了,当使用java -jar xxx.jar&启动的时候,会报出以下错误,

Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'XXXXX'.Cause: java.lang.ClassNotFoundException: Cannot find class: XXXXX

从异常信息来看,明显就是无法从本地检索到alise对应的类,并最终导致sqlSessionFactory等初始化失败。而且吊轨的是,直接在Idea中启动是没有问题的,启动jar包才会出现这个问题

解决方法

参考博主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");

...

}

SpringBoot整合Mybatis及遇到的坑

1. 搭建项目环境

1.1 创建项目

1.2 修改POM文件,添加相关依赖

修改pom.xml文件,在其中添加下面依赖。

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-web

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.3

org.springframework.boot

spring-boot-starter-jdbc

mysql

mysql-connector-java

8.0.12

com.alibaba

druid

1.1.10

1.3 配置数据源

在application.yml文件中配置如下代码。

spring:

datasource:

driver-class-njHnAbKBame: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=GMT%2B8

username: root

password: root

type: com.alibaba.druid.pool.DruidDataSource

2. 配置Maven的generator插件

2.1 添加generator插件坐标

org.mybatis.generator

mybatis-generator-maven-plugin

1.4.0

mysql

mysql-connector-java

8.0.12

${project.basedir}/src/main/resources/generator.xml

true

true

2.2 添加generator配置文件

将文件命名为generator.xml,在src/main/resources中添加。

PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

&lthttp://;jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"

connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=UTC"

userId="root" password="root">

http://

targetProject=".\src\main\java">

targetProject=".\src\main\java">

targetProject=".\src\main\java">

targetProject=".\src\main\java">

targetPackage="com.example.springbootmybatis.mapper" targetProject="./src/main/java">

targetPackage="com.example.springbootmybatis.mapper" targetProject="./src/main/java">

2.3 添加generator配置文件的DTD文件

可以在工具栏中的File->Settings中添加,也可以直接在文件中按alt+shift自动添加。

2.4 运行generator插件生成代码

3. 配置资源拷贝插件

3.1 添加资源拷贝插件坐标

src/main/java

**/*.xml

src/main/resources

**/*.yml

3.2 修改启动类添加@MapperScan注解

package com.example.springbootmybatis;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@MapperScan("com.example.springbootmybatis.mapper")//指定扫描接口与映射配置文件的包名

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

}

4. 其他配置项

mybatis:

# 扫描classpath中mapper目录下的映射配置文件,针对于映射文件放到了resources目录下

mapper-locations: classpath:/mapper/*.xml

# 定义包别名,使用pojo时可以直接使用pojo的类型名称不用加包名

type-aliases-package: com.example.springbootmybatis.pojo

5. 添加用户功能

5.1 创建页面





5.2 创建Controller

5.2.1 PageController

package com.example.springbootmybatis.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

/**

* 页面跳转Controller

*/

@Controller

public class PageController {

/**

* 页面跳转方法

*/

@RequestMapping("/{page}")

public String showPage(@PathVariable String page){

return page;

}

}

5.2.2 UsersController

package com.example.springbootmybatis.controller;

import com.example.springbootmybatis.pojo.Users;

import com.example.springbootmybatis.service.UsersService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

* 用户管理Controller

*/

@RestController

@RequestMapping("/user")

public class UsersController {

@Autowired

private UsersService usersService;

/**

* 添加用户

*/

@PostMapping("/addUser")

public String addUsers(Users users){

try {

this.usersService.addUsers(users);

} catch (Exception e){

e.printStackTrace();

return "error";

}

return "redirect:/ok";

}

}

5.3 创建Service 接口实现类Impl

/**

* 用户管理业务层

*/

@Service

public class UsersServiceImpl implements UsersService {

@Autowired

private UsersMapper usersMapper;

@Override

@Transactional

public void addUsers(Users users) {

this.usersMapper.insert(users);

}

}

接口

public interface UsersService {

void addUsers(Users users);

}

遇到的错误

1. Mybatis Generator自动生成,数据库的同名表也会生产的问题

[WARNING] Table Configuration usejHnAbKBrs matched more than one table (test..users,performance_schema..users)

[WARNING] Cannot obtain primary key information from the database, generated objects may be incomplete

在 MyBatis Generator官网 中对这一问题做出了解答。

翻译如下:Mysql 无法正常支持 SQL catalogs 和 schema。因此,最好不要在 generator 配置文件中指定 catalog 以及schema,仅需指定数据表的名字并在 JDBC URL 中指定数据库即可。如果使用 mysql-connector-java 8.x 版本,generator 会为MySql中信息数据库(sys, information_schema, performance_schema)的表生成代码,若要避免这种操作,请在 JDBC URL 中加入属性“nullCatalogMeansCurrent=true”。

修改配置文件generator.xml

connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=UTC"

userId="username" password="password">

connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=UTC"

userId="username" password="password">

2. 页面出现500错误

2020-06-27 14:23:42.459 ERROR 19676 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Circular view path [addUsers]: would dispatch back to the current handler URL [/addUsers] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)] with root cause

javax.servlet.ServletException: Circular view path [addUsers]: would dispatch back to the current handler URL [/addUsers] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

at org.springframework.web.servlet.view.InternalResourceView.prepareForRendering(InternalResourceView.java:210) ~[spring-webmvc-5.2.7.RELEASE.jar:5.2.7.RELEASE]

at

解决方法

查了很多博客,但是都不是自己的问题,自己的问题是在pom.xml配置文件中的资源路径中,没有写所有,而是单独的xml和yml配置文件。要加载所有的静态资源。

src/main/resources

**/*.yml

**/*.xml

src/main/resources

**/*.*


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:VPN技术之GRE基础实验
下一篇:USB3.0支持Ai智能人脸跟踪技术的4K音视频会议摄像机
相关文章

 发表评论

暂时没有评论,来抢沙发吧~