blog

MyBatisPlusのコード生成とdruidの統合問題を使用する

エラーログは次のとおりです。理由:コードジェネレータでは、データベースの日付時刻型に変換され、統合されたドルイドデータソースは、バージョン3.1.0を使用して問題ありませんが、mpを3.1.1にアップ...

Jun 19, 2020 · 4 min. read
シェア

エラーログは以下のとおりです。:

2020-07-29 17:46:47.767 ERROR 6976 --- [nio-8553-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'create_time' from result set. Cause: java.sql.SQLFeatureNotSupportedException
; null; nested exception is java.sql.SQLFeatureNotSupportedException] with root cause
java.sql.SQLFeatureNotSupportedException: null

依存バージョン

<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.3.2</version>
</dependency>
<dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid-spring-boot-starter</artifactId>
 <version>1.1.10</version>
</dependency>

解決方法:

  1. グローバル・コンフィギュレーションでの dateType の設定。
gc.setDateType(DateType.ONLY_DATE);
  1. データソース構成での型変換
DataSourceConfig dsc = new DataSourceConfig();
dsc.setTypeConvert(new MySqlTypeConvert() {
 // カスタムデータベーステーブルフィールド型変換オプション
 @Override
 public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
 System.out.println("タイプを変換する:" + fieldType);
 //データベースの日時を日付に変換する
 if ( fieldType.toLowerCase().contains( "datetime" ) ) {
 return DbColumnType.DATE;
 }
 return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
 }
});
  1. ドルイド・バージョン1.1.18の改善(ただし、ある場所の問題のためにプロジェクト依存のバージョンを変更するのは決して良いことではありません)

最初の2つの解の解析

// コード生成オブジェクト
AutoGenerator mpg = new AutoGenerator();
// データソース構成オブジェクト
DataSourceConfig dsc = new DataSourceConfig();
// 型変換を表示する
dsc.setTypeConvert(new MySqlTypeConvert() {
 // カスタムデータベーステーブルフィールド型変換オプション
 @Override
 public DbColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
 System.out.println("タイプを変換する:" + fieldType);
 //データベースの日時を日付に変換する
 if ( fieldType.toLowerCase().contains( "datetime" ) ) {
 return DbColumnType.DATE;
 }
 return (DbColumnType) super.processTypeConvert(globalConfig, fieldType);
 }
});
// データソース構成を設定する
mpg.setDataSource(dsc);

setDataSource(final DataSourceConfig dataSource)

// AutoGeneratorオブジェクトを返す
public AutoGenerator setDataSource(final DataSourceConfig dataSource) {
 this.dataSource = dataSource;
 return this;
}
// AutoGeneratorクラスのプロパティ
private DataSourceConfig dataSource; // データソース設定
// DataSourceConfig型変換インターフェースのプロパティを持つクラス
private ITypeConvert typeConvert;

ITypeConvertインターフェースのソースコード

public interface ITypeConvert {
 default IColumnType processTypeConvert(GlobalConfig globalConfig, TableField tableField) {
 return this.processTypeConvert(globalConfig, tableField.getType());
 }
 IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType);
}

processTypeConvertメソッドの実装

public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
 String t = fieldType.toLowerCase();
 if (t.contains("char")) {
 return DbColumnType.STRING;
 } else if (t.contains("bigint")) {
 return DbColumnType.LONG;
 } else if (t.contains("tinyint(1)")) {
 return DbColumnType.BOOLEAN;
 } else if (t.contains("int")) {
 return DbColumnType.INTEGER;
 } else if (t.contains("text")) {
 return DbColumnType.STRING;
 } else if (t.contains("bit")) {
 return DbColumnType.BOOLEAN;
 } else if (t.contains("decimal")) {
 return DbColumnType.BIG_DECIMAL;
 } else if (t.contains("clob")) {
 return DbColumnType.CLOB;
 } else if (t.contains("blob")) {
 return DbColumnType.BLOB;
 } else if (t.contains("binary")) {
 return DbColumnType.BYTE_ARRAY;
 } else if (t.contains("float")) {
 return DbColumnType.FLOAT;
 } else if (t.contains("double")) {
 return DbColumnType.DOUBLE;
 } else if (!t.contains("json") && !t.contains("enum")) {
 if (t.contains("date") || t.contains("time") || t.contains("year")) {
 byte var5;
 switch(globalConfig.getDateType()) {
 case ONLY_DATE:
 return DbColumnType.DATE;
 case SQL_PACK:
 var5 = -1;
 switch(t.hashCode()) {
 case 3076014:
 if (t.equals("date")) {
 var5 = 0;
 }
 break;
 case 3560141:
 if (t.equals("time")) {
 var5 = 1;
 }
 break;
 case 3704893:
 if (t.equals("year")) {
 var5 = 2;
 }
 }
 switch(var5) {
 case 0:
 return DbColumnType.DATE_SQL;
 case 1:
 return DbColumnType.TIME;
 case 2:
 return DbColumnType.DATE_SQL;
 default:
 return DbColumnType.TIMESTAMP;
 }
 case TIME_PACK:
 var5 = -1;
 switch(t.hashCode()) {
 case 3076014:
 if (t.equals("date")) {
 var5 = 0;
 }
 break;
 case 3560141:
 if (t.equals("time")) {
 var5 = 1;
 }
 break;
 case 3704893:
 if (t.equals("year")) {
 var5 = 2;
 }
 }
 switch(var5) {
 case 0:
 return DbColumnType.LOCAL_DATE;
 case 1:
 return DbColumnType.LOCAL_TIME;
 case 2:
 return DbColumnType.YEAR;
 default:
 return DbColumnType.LOCAL_DATE_TIME;
 }
 }
 }
 return DbColumnType.STRING;
 } else {
 return DbColumnType.STRING;
 }
}
Read next

JavaScript-イベント

イベント:ドキュメントやブラウザウィンドウで発生する特定のインタラクションの瞬間です。ウェブアプリケーションの場合、代表的なイベントとして、要素をクリックする、要素の上でマウスを動かす、ポップアップウィンドウを閉じる、などがあります。 HTMLはイベント駆動型の言語です。 HTMLとのインタラクションは、イベントを通じて実現されます。 イベント...

Jun 19, 2020 · 3 min read