SpringBoot Mybatisを統合し、Type Aliasesの設定失敗の問題を解決します。
16617 ワード
問題の説明
MyBatisを適用するときは、オブジェクト関係マップを使用して、オブジェクトとAliaseをマッピングします。
Mybatisの文書に明確に書いてありますが、実体類のAliaseを明確に定義していないと、フレームは自動的にClass Nameを別名として登録します。
それでは問題が来ました。java-jar xx.jar&起動を使うと、以下のエラーが発生します。
Error reolving class.Cause:org.apphe.ibatis.type.Type Exception:Could not revove type alias'XXXX'.Cause:java.lassNot FoundException:Canot find class:XXXX
異常情報を見ると、明らかにローカルからalise対応のクラスを検索できなくなり、結局sql Session Factoryなどの初期化に失敗しました。また、レールが吊るされているのは、直接Ideaで起動するのは問題ないです。jarパッケージを起動するとこの問題が発生します。
解決方法
ブロガーA_を参考にしてくださいBeaverの文章は元々mybatisのfacrotyがSpring Boot独特の仮想ファイルシステムをロードしてこそ、クラスパスを識別することができます。
この問題を修復するにはmybatisの配置類の中にだけfactoryを設置すればいいです。
1.プロジェクト環境の構築
1.1作成項目
1.2 POMファイルを修正し、関連付けを追加する
pom.xmlファイルを修正し、下記の依存性を追加します。
appication.ymlファイルには次のコードが設定されています。
2.1 generatorプラグイン座標を追加する
ファイルをgenerator.xmlと命名し、src/main/resourceに追加します。
ツールバーのFile->Settingsに追加することもできます。直接ファイルにalt+shiftを押して自動的に追加することもできます。
2.4 generatorプラグインを実行してコードを生成する
3.リソースコピープラグインの設定
3.1リソースコピープラグイン座標を追加
5.1ページの作成
5.2.1 PageController
1.Mybatis Generatorが自動的に生成され、データベースの同名表も生産される問題
[WARNING]Table Configration users matched more than one table(test.users,performance_)schema.users)
[WARNING]Canot obitain prmary key information from the database,generated object may be incomplete
MyBatis Generator公式サイトでこの問題について答えました。
MysqlはSQL catalogsとschemaを正常にサポートできません。したがって、generatorプロファイルにcatalogおよびschemaを指定しないでください。データテーブルの名前を指定して、JDBC URLにデータベースを指定すればいいです。mysql-connector-java 8 xバージョンを使うと、GEneratorはMySql中の情報データベース(sys,information_)になります。schema、performanceschema)の表にコードが生成されます。この操作を避けるには、JDBC URLに「null CatalogMeans Current=true」という属性を入れてください。
プロファイルを変更するgenerator.xml
2020-06-27 14:23:424.59 ERROR 19676-[nio-8 8 0-exec-1]o.a.c.C.[.[.[/].[dispacher Servlet]:Servvice()forservlet[dispacherSerServlet]in contexxxxttttttttttpapapadededededededededededededettttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttrs]again.Check your View Reslover setup!Hint:This may be the result of an unspecified view,due to default view name generation.)]with root cause
javax.servlet.Servlet Exception:Circurular view path[addUsers]:would dispatback to the current hander URL[/addUsers]again.Check your View Resolover setup!Hit:This may be the result of an unspecified view,due to default view name generation.)
at org.springframe ewark.web.servlet.view.InternalResource View.prepareForRendering(InternalResource View.java:210)~[spring-webmvc-5.7.RELEASE.jar:5.2.70.REASE]
at
解決方法
多くのブログを調べましたが、自分の問題ではありません。自分の問題はpom.xmlプロファイルのリソースパスの中で、すべてを書いていません。単独のxmlとymlプロファイルです。すべての静的リソースをロードします。
MyBatisを適用するときは、オブジェクト関係マップを使用して、オブジェクトとAliaseをマッピングします。
Mybatisの文書に明確に書いてありますが、実体類のAliaseを明確に定義していないと、フレームは自動的にClass Nameを別名として登録します。
それでは問題が来ました。java-jar xx.jar&起動を使うと、以下のエラーが発生します。
Error reolving class.Cause:org.apphe.ibatis.type.Type Exception:Could not revove type alias'XXXX'.Cause:java.lassNot FoundException:Canot find class:XXXX
異常情報を見ると、明らかにローカルからalise対応のクラスを検索できなくなり、結局sql Session Factoryなどの初期化に失敗しました。また、レールが吊るされているのは、直接Ideaで起動するのは問題ないです。jarパッケージを起動するとこの問題が発生します。
解決方法
ブロガーA_を参考にしてくださいBeaverの文章は元々mybatisのfacrotyがSpring Boot独特の仮想ファイルシステムをロードしてこそ、クラスパスを識別することができます。
public SpringBootVFS() {
this.resourceResolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader());
}
上記のコードから見て、実はPathMatch Resource PatternResolaverを通じて資源のローディングを実現しました。この問題を修復するには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ファイルを修正し、下記の依存性を追加します。
<!--Thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!--jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<!--Druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
1.3データソースの設定appication.ymlファイルには次のコードが設定されています。
spring:
datasource:
driver-class-name: 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プラグイン座標を追加する
<!-- generator -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
</dependencies>
<!-- -->
<configuration>
<configurationFile>${project.basedir}/src/main/resources/generator.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
2.2 generatorプロファイルを追加するファイルをgenerator.xmlと命名し、src/main/resourceに追加します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- true: : false: -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- : 、 、 、 -->
<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">
</jdbcConnection>
<!-- false, JDBC DECIMAL NUMERIC Integer true, JDBC DECIMAL
NUMERIC java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--targetProject: PO -->
<javaModelGenerator targetPackage="com.example.springbootmybatis.pojo"
targetProject=".\src\main\java">
<!--enableSubPackages: schema -->
<property name="enableSubPackages" value="false" />
<!-- -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- mapper.xml -->
<sqlMapGenerator targetPackage="com.example.springbootmybatis.mapper"
targetProject=".\src\main\java">
<!--enableSubPackages: schema -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- Mapper -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.springbootmybatis.mapper" targetProject="./src/main/java">
<!--enableSubPackages: schema -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- -->
<table schema="" tableName="users"></table>
<!-- , Example -->
<!-- <table tableName="userinfo" domainObjectName="UserInfoPO" -->
<!-- enableCountByExample="false" enableUpdateByExample="false" -->
<!-- enableDeleteByExample="false" enableSelectByExample="false" -->
<!-- selectByExampleQueryId="false"> -->
<!-- <property name="useActualColumnNames" value="false" /> -->
<!-- </table> -->
</context>
</generatorConfiguration>
2.3 generatorプロファイルのDMDファイルを追加するツールバーのFile->Settingsに追加することもできます。直接ファイルにalt+shiftを押して自動的に追加することもできます。
2.4 generatorプラグインを実行してコードを生成する
3.リソースコピープラグインの設定
3.1リソースコピープラグイン座標を追加
<!-- -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
</includes>
</resource>
</resources>
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ページの作成
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<link rel="shortcut icon" href="../resources/favicon.ico" th:href="@{/static/favion.ico}">
<head>
<meta charset="UTF-8">
<title> SpringBoot PostgreSQL </title>
</head>
<body>
<form th:action="@{/user/addUser}" method="post">
<input type="text" name="userid"><br>
<input type="text" name="username"><br>
<input type="text" name="usersex"><br>
<input type="submit" value=" "><br>
</form>
</body>
</html>
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 Users Controller
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 Configration users matched more than one table(test.users,performance_)schema.users)
[WARNING]Canot obitain prmary key information from the database,generated object may be incomplete
MyBatis Generator公式サイトでこの問題について答えました。
MysqlはSQL catalogsとschemaを正常にサポートできません。したがって、generatorプロファイルにcatalogおよびschemaを指定しないでください。データテーブルの名前を指定して、JDBC URLにデータベースを指定すればいいです。mysql-connector-java 8 xバージョンを使うと、GEneratorはMySql中の情報データベース(sys,information_)になります。schema、performanceschema)の表にコードが生成されます。この操作を避けるには、JDBC URLに「null CatalogMeans Current=true」という属性を入れてください。
プロファイルを変更するgenerator.xml
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEnconding=utf-8&useSSL=false&serverTimezone=UTC"
userId="username" password="password">
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
2.ページに500のエラーが発生しました。2020-06-27 14:23:424.59 ERROR 19676-[nio-8 8 0-exec-1]o.a.c.C.[.[.[/].[dispacher Servlet]:Servvice()forservlet[dispacherSerServlet]in contexxxxttttttttttpapapadededededededededededededettttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttrs]again.Check your View Reslover setup!Hint:This may be the result of an unspecified view,due to default view name generation.)]with root cause
javax.servlet.Servlet Exception:Circurular view path[addUsers]:would dispatback to the current hander URL[/addUsers]again.Check your View Resolover setup!Hit:This may be the result of an unspecified view,due to default view name generation.)
at org.springframe ewark.web.servlet.view.InternalResource View.prepareForRendering(InternalResource View.java:210)~[spring-webmvc-5.7.RELEASE.jar:5.2.70.REASE]
at
解決方法
多くのブログを調べましたが、自分の問題ではありません。自分の問題はpom.xmlプロファイルのリソースパスの中で、すべてを書いていません。単独のxmlとymlプロファイルです。すべての静的リソースをロードします。
<!-- -->
<!-- -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.xml</include>
</includes>
<!-- <filtering>false</filtering>-->
</resource>
<!-- -->
<!-- -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<!-- <filtering>false</filtering>-->
</resource>
以上は個人の経験ですので、参考にしていただければと思います。