SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【MySQL】MySQL@CentOS7にMyBatis(Mavenプロジェクト)@Eclipseから接続する

@が多くなりカテゴリが多くなり、状況が限定化されてきてしまった。
実際にやってみるとフレームワークとかにどっぷりで他の状況だとあまり使えない感じになってしまったかもしれません。

前提条件

Virtualbox上のCentOS7にMySQLを導入して、ホストマシンから接続できることは確認できましたので、今後は開発プロジェクトから接続できるようにします。

MySQL、Linuxサーバ側の環境構築
www.wantanblog.com


開発プロジェクト側の設定、環境構築など
www.wantanblog.com

MySQL側の準備

テーブル作成

Eclipseのアプリケーション側から参照するテーブルを作成する。
作成済みの場合は飛ばしてもOKだし、内容は自身のアプリに即したものに変えなけらばならない。

私の場合は以下の通りとした。

create table todoMyBatis(
 todoMyBatis_id varchar(36) primary key,
 todoMyBatis_title varchar(30),
 finished boolean, created_at timestamp);

MySQLにログインして実行してもいいが、私は前回の記事でせっかく使用できるようにしたのでA5SQLを使用して実行した。
まぁ使用ツールはなんでもいいですね。


Eclipse側の設定

まずはDBの接続先を設定する以下のファイルを次のように修正した。
todoMyBatis-infra.properties

database=mysql
# DEの向き先を設定
database.url=jdbc:mysql://localhost:53306
database.username=wantanhost
database.password=[パスワード]
database.driverClassName=com.mysql.cj.jdbc.Driver
まずはそのまま実行してみる

ただの確認。何をすればいいか探るためにやっているので飛ばしてもOK。
そうするともちろんエラーが発生する。ここからが勝負。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSourceInitializer#0': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.UncategorizedScriptException: Failed to execute database script; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot load JDBC driver class 'com.mysql.cj.jdbc.Driver'

今回の場合重要なのはここの部分か。
Cannot load JDBC driver class 'com.mysql.cj.jdbc.Driver'

ドライバーが読み込めないと言われている。

MySQLドライバーを追加する@Mavenプロジェクト

ここではMavenプロジェクトで作成している場合独自の方法となります。

JDBCドライバーなどを追加する場合、Mavenプロジェクトは「pom.xml」を修正するようです。

MySQLのコネクターは以下から探しました。MySQLではない場合でも同様に探せるはずです。
Maven Repository: mysql » mysql-connector-java

私の場合は5.1.48なので以下をコピー。

f:id:wantanBlog:20190913005445j:plain


mysql
mysql-connector-java
5.1.48

プロジェクト直下に存在するpom.xmlのdependenciesタグの中に追加しました。

f:id:wantanBlog:20190913005509p:plain


保存するとなんとMaven依存関係のところに今追加したjarファイルが追加されるんですね~
これがMavenプロジェクトの威力なのか(Maven素人

f:id:wantanBlog:20190913005737j:plain

ここで一応Mavenプロジェクトの更新を行っておきました。

ドライバーが追加できたのでサーバ実行!!

次なるエラーが発生しました。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSourceInitializer#0': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from class path resource [database/mysql-schema.sql]; nested exception is java.io.FileNotFoundException: class path resource [database/mysql-schema.sql] cannot be opened because it does not exist

うん、これが素人の環境構築ですよね。
前向きにエラーを解消していきましょう。

MyBatisでのスキーマ指定

上記のエラーは原因は明らか
「 [database/mysql-schema.sql] cannot be opened because it does not exist」
「mysql-schema.sql」が存在しないことでしょう。


状況を整理しながら対処法を探ります。

・propertyファイル

/todoMyBatis/src/main/resources/META-INF/spring/todoMyBatis-infra.properties

接続先のDBやユーザを指定します。
スキーマもここで指定できたりしないのでしょうか?いまいちわかりませんでした。


・env.xml

/todoMyBatis/src/main/resources/META-INF/spring/todoMyBatis-env.xml

propertyファイルを呼び出して実際にDB接続を行うのはここか。
「mysql-schema.sql」の呼び出しもここで行っている。

        <jdbc:script location="classpath:/database/${database}-schema.sql" encoding="UTF-8" />
        <jdbc:script location="classpath:/database/${database}-dataload.sql" encoding="UTF-8" />

上記2行で指定してるsqlファイルを作成すればうまくいくか??

・起動時のsqlファイル
以下を新規作成した。
mysql-dataload.sql
mysql-schema.sql


記述内容はそれぞれ以下の通り。

▼mysql-schema.sql
USE文で実際に使用したいスキーマを指定する。

/* define the schemas. */
USE APP_DB;

▼mysql-dataload.sql
とりあえず元々のファイル(H2-dataload.sql)内容に合わせた。

/* load the records. */
commit;
もう一度接続確認

当該プロジェクトでサーバ実行してみると、サーバの実行ではエラーが表示されなくなりました!
デフォルトの画面が表示できるようになり、サンプルアプリの画面を表示できるようになりました。

f:id:wantanBlog:20190913220533j:plain

データベースにアクセスする処理を実行すると

f:id:wantanBlog:20190913221126j:plain

エラーは解消されましたが、うーんまた別のエラー。。
これはどっちかというとアプリ側のエラー?

java.sql.SQLException: Incorrect string value: '\xE3\x83\x86\xE3\x82\xB9...' for column 'todoMyBatis_title' at row 1

テーブルの文字コード設定

エラー内容から検索をかけてもいいですが、とりあえず接続できることが確証されているA5SQLからアプリで発行されたSQLを実行してみます。
同じエラーが発生しました。

INSERT INTO todoMyBatis
        (
            todoMyBatis_id,
            todoMyBatis_title,
            finished,
            created_at
        )
        VALUES
        (
            '944b56fd-08a8-42f5-a32d-1a1440a4ba78',
            'テスト',
            0,
            '09/13/2019 22:13:49.797'
        ) 


原因はなんてことなく、挿入データに日本語は含まれていることによるDBテーブルの文字コードの問題っぽい。
テーブル作成時の考慮不足ですね。

今回やりたいことの本質からずれるので日本語は入力できない仕様としてもいいけど、さらっと以下のSQLをA5から実行した。

alter table todoMyBatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

ここまでやったらサーバを再起動して、画面を表示させ直すと
データベースからリストを取得でき。

f:id:wantanBlog:20190913231147j:plain

登録もできました。

f:id:wantanBlog:20190913231247j:plain


これでサーバのDBを使用したアプリ開発ができるようになりました!!!

warファイルを作成してTomcatにデプロイ

過去にも同様のことをやりましたが、今回はDB接続が伴う版です。
操作説明を省いているところは以下の記事と同様の操作となります。

www.wantanblog.com

DB接続先の再設定

接続情報を設定するプロパティファイルを次のように設定した。
まぁバージョン管理かなにかした方がいいでしょうね。
・todoMyBatis-infra.properties

database=mysql
# DEの向き先を設定
#開発環境用
#database.url=jdbc:mysql://localhost:53306
#database.username=wantanhost
#database.password=[パスワード]
#デプロイ用設定
database.url=jdbc:mysql://localhost:3306
database.username=wantan
database.password=[パスワード]

database.driverClassName=com.mysql.jdbc.Driver

Eclipseからの接続は外部からの接続設定でしたが、これをLinuxサーバ上に配置して起動するので、localhostから接続するように設定をおこなっています。

warファイルの生成

操作は過去記事の通り。
無事成功しました。

Tomcatにデプロイ

操作は過去記事の通り。
無事成功しました。

動作確認

Tomcat再起動後、以下のURLへアクセス。エラーですね。。

http://localhost:50001/todoMyBatis/todoMyBatis/list

f:id:wantanBlog:20190914002920j:plain

Tomcatのログを見ると以下のような記述が。。

### Error querying database. Cause: java.sql.SQLException: No database selected
### The error may exist in com/example/todoMyBatis/domain/repository/todoMyBatis/TodoMyBatisRepository.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters

この辺が原因か?先に設定した「USE文」がうまくきいてない??
No database selected

MYSQLのログ見た方がよかったのかな?
いろいろ検索してみた結果対応は以下の通りとなりました。


LinuxサーバでmysqlにログインしUSE文を実行

Eclipseから接続する際には外部接続用のユーザ(wantanhost)を使用していましたが、Linuxサーバ上にソースを配置して実行していますので、今回の場合はlocalhost接続用のユーザ(wantan)に使用ユーザを変更しています。

そしてwantanユーザでは以下が実行できませんでした。

USE APP_DB;

localhost接続用のユーザでデータベースを表示する

当該ユーザでアクセスできるデータベースを表示します。

show databases;

「information_schema」しか表示されてない。ここで原因が見えてきます。


localhost接続用のユーザに全DBのアクセス権限を付与する

全DBのアクセス権限を付与するために以下を実行します。

GRANT ALL ON *.* TO wantan@'%' IDENTIFIED BY [パスワード];
FLUSH PRIVILEGES;

mysqlの再起動 一応

systemctl restart mysql

tomcatの再起動 一応

systemctl restart tomcat9


再度接続確認

やったー!
元々の原因は環境構築時の権限設定ミスですかね。

f:id:wantanBlog:20190914010635j:plain



これでローカルで開発、仮想サーバにデプロイまでできるようになりました。
やっといろいろ試せます。