Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

MyBatis Generatorを使ってコードの自動生成をしてみる


皆さんJavaでORMは何を使っているでしょうか?だいたいJPA(Hibernate)かMyBatisだと思いますが、
Hibernateはやりたいことに対して複雑すぎるのがあって敬遠していると思います。
そこでMyBatisなのですが、何かと書くの面倒、楽したいってのはあると思います。
そこで検討してみるのがMyBatis Generatorではないでしょうか。というので、導入方法の紹介です。
今回やってみたのはアノテーションでの自動生成方法です。
XMLでの生成も簡単に設定で変えられます。

前提条件

コマンドラインで使えるMavenが入っていること
Eclipse Pleiades のJava Full Editionを入れとく

Pleiadesは昔重すぎて、余計なのがたくさんついてる印象であまり好きでなかったですが、
久々に使ってみるとよいです。いまだと必要なものだけが入っていていい感じ!
プラグインの相性が悪い変なハマりも少なくていいかも。

英語化したい場合は
[eclipseのインストールフォルダ]\eclipse\eclipse.iniファイルを変更
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jarの行を削除
最後の行に-Duser.language=en_USを追加
これでEclipseを再起動する

MarketplaceからMyBatisGeneratorを入れる

MarketplaceからMyBatis Generator 1.4.2をEclispeに入れる。

PostgreSQLをインストール

普通にインストールする。
Macの場合はここ参照

適当なデータを用意する

https://www.postgresqltutorial.com/postgresql-getting-started/postgresql-sample-database/

Spring Boot Projectを作成する

Name: demo-mybatis-generator
Type: Maven
Packaging: Jar
Java Version: 17
Language: Java

Lombok, Spring Boot DevTools, Spring Web がデフォルトで選ばれていると思うけど、
これに加えて
MyBatis Framework, PostgreSQL Driver, Thymeleaf を追加で入れる。

設定ファイルを整備する

src/man/resources/application.properties に以下を追記

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/dvdrental
spring.datasource.username=postgres
spring.datasource.password=postgres

※用意したデータの場合です。

pom.xmlの編集

https://mybatis.org/generator/running/runningWithMaven.html
を参考に
pom.xmlに次を追記する。

    <build>
        <plugins>
            <plugin>
                ...(関係ないので省略)
            </plugin>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.4.2</version>
                <configuration>
                    <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                </configuration>
                <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.postgresql</groupId>
                        <artifactId>postgresql</artifactId>
                        <version>${postgresql.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

※Eclipseから実行する場合はいらないところがいくつかあります。

generatorConfig.xmlの編集

Javaの場合はtargetRuntimeで指定する生成方法で3つの方法があり、大きく次の特徴があります。

MyBatis3DynamicSql MyBatis3 MyBatis3Simple
コード生成量 少なめ 多い 少ない
使うクラス MyBatis Dynamic SQL ~Example 普通のMapper
Annotation/XML Annotation 選択可 選択可

デフォルトはMyBatis3DynamicSqlでタイプセーフでコード生成量も比較的少なく そのままで柔軟なクエリが欠けるといった特徴があります。
しかし、独自DSLみたいな書き方を強制されるので人を選ぶ感じがあります。
自分で書く場合はAnnotationベースで書いちゃうって場合が多いと思います。 その場合、MyBatis3Simpleが多くの場合適してるのではないかと思います。

src/main/resources/generatorConfig.xml

<?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>
    <!-- 生成タイプはMyBatis3Simpleを選びます -->
    <context id="postgres" targetRuntime="MyBatis3Simple">
        <!-- 生成コメントの設定 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        
        <!-- DB接続設定 -->
        <jdbcConnection driverClass="org.postgresql.Driver"
            connectionURL="jdbc:postgresql://localhost:5432/dvdrental"
            userId="postgres" password="postgres">
        </jdbcConnection>
        
        <!-- Entityの設定 -->
        <javaModelGenerator
            targetPackage="com.example.demo.entity"
            targetProject="src/main/java">
        </javaModelGenerator>
        
        <!-- Mapper(XML)の設定 -->
        <!--
        <sqlMapGenerator
            targetPackage="com.example.demo.mapper"
            targetProject="src/main/resources">
        </sqlMapGenerator>
        -->
        
        <!-- Mapper(Java)の設定 -->
        <javaClientGenerator type="ANNOTATEDMAPPER"
            targetPackage="com.example.demo.mapper"
            targetProject="src/main/java">
        </javaClientGenerator>
        
        <!-- コードを生成するテーブルを指定 -->
        <table tableName="actor" modelType="flat">
        </table>
    </context>
</generatorConfiguration>

かなり細かい設定ができますので、気になる方は、こちらを参照。
MyBatis Generator Core – MyBatis Generator XML Configuration File Reference

この設定の場合、自分でMapper書きたいなと思えば、簡単に追加することができます。
自動生成したコードを直接触るのはどうなの?とかいうのはあるかと思いますが、
そこはプロジェクト次第だと思います。

コードの自動生成

コマンドプロンプトから

mvn mybatis-generator:generate

この例ではentity配下にActor.java
mapper配下にActorMapper.java
が生成されます。

Homebrew経由でPostgreSQL14をインストール


インストール直後何をすればいいのかよく忘れるのでメモ

前提条件

M1 Mac
シェルはbash
Homebrewをインストール済み
echo $SHELLで/bin/zshならzshです。 もし変えたい場合は先におまけから

インストール

Homebrew経由でPostgreSQL14をインストール

brew install postgresql@14

@の後ろがバージョン番号です。
あとは基本的にTerminalに表示されるまま
デフォルトがzshの場合はこれではなく表示される手順に従ってください。
ログイン時にパスを通す(bash)

(echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> ~/.bash_profile

現在のシェルでPATHを通す

eval "$(/opt/homebrew/bin/brew shellenv)"

サービスを起動する

brew services start postgresql@14  

サービスの一覧を確認する

brew services list

データベースの初期化をする

initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@14

スーパーユーザ作成

createuser -P -s postgres

繋いでみる

createuser -P -s postgres

繋げたら\qで終了

パスワードを聞かれるようにする

vim /opt/homebrew/var/postgresql\@14/pg_hba.conf 

trustをmd5にする

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
brew services restart postgresql@14

おまけ bashをデフォルトにする方法+αの設定

chsh -s /bin/bash

vim ~/.bash_profile

HOST='\u@\h'
PS1="\[\033]0;$HOST\007\]"     # set window title
PS1="$PS1"'\n'                 # new line
PS1="$PS1"'\[\033[32m\]'       # change color
PS1="$PS1"'\u@\h '             # user@host<space>
PS1="$PS1"'\[\033[33m\]'       # change color
PS1="$PS1"'\w'                 # current working directory
PS1="$PS1"'\[\033[0m\]'        # change color
PS1="$PS1"'\n'                 # new line
PS1="$PS1"'$ '                 # prompt: always $

# "-F":ディレクトリに"/"を表示 / "-G"でディレクトリを色表示
alias ls='ls -FG'
alias ll='ls -alFG'

~/.bashrcでもいい。というか、本当はこっちが正しい。
本当に正しい .bashrc と .bash_profile の使ひ分け #Bash - Qiita

WindowsからMacへファイル共有をする

久々にWindowsのファイルをMac側に送りたいなとおもったらプチハマりしたのでメモ
どうせ次やるときにはまた忘れて同じハマりを繰り返すのだ。
いまどきCDやUSBのデバイスを使って転送するのもアレだし
わざわざこれだけのためにクラウドストレージ使うのもあほらしいし、
ローカルネットワーク内で何とかしたいと思ったときにはまりがちなやつ
Windows Defenderでも起こるかも。
Firewallに阻まれるのはよくあること。
この記事は最低限のネットワークの知識がない人には役立たないかもしれない。

環境

ファイル共有側

OS: Windows11
ウィルス対策ソフト: ESET

ファイル取りたい側

OS: macOS Ventura 13.5
ウィルス対策ソフト: ESET

とりあえず長ったらしいので

WindowsからMacへの共有方法はコチラの通り。Write権限は別に与えんでもいい。
WindowsとMacの間でファイル共有をする方法 | パソコン工房 NEXMAG
Windws Defenderかウィルス対策ソフトのファイヤーウォールをOFFってみれば解決すると思うよ!!

症状

DHCPでWi-FiでPCを複数台使っている(※一部固定IPはある)。
同じセグメントにいるのにMacからWindowsのフォルダが読めない。
うちではCIDR表記で192.168.3.0/24がデフォルトの設定になっている。

古き良きSMB、これは慣れてるからさすがにできるだろ、と思ったらできない。
わざわざWindows側でSMBを有効化してsmb://[IPアドレス]の形式でもアクセスできない。
そればかりかpingも通らない。 なぜか逆方向のWindowsからMacからのpingは通る(おいおいどういうことだよESETさんてばよ)。
といった状態だった。 ファイヤーウォール?ファイアウォール?Firewallが怪しくね?(表記どれが正しいの?) と思ったらやっぱりこれだった。

解決策

ここの手順をすれば基本的にWindowsのデフォルト設定で共有できます。 Mac側も何か設定があるとすればネットワーク関連の設定で
WINSの設定でワークグループがWORKGROUPになっていればOK
Macで「WINS」設定を変更する - Apple サポート (日本)
デフォルトで設定されてるはず。

どうせ共有なんて普段しないんだからESETのファイヤーウォールを一時的にOFFる
恒久的な対策はいつか書きます(たぶん)。

おまけ

Thunderbirdを移行したくてやった。
特にメッセージフィルタがアレなんで、あれをあれしてはこれ
Thunderbirdのメッセージフィルタを移行する #thunderbird - Qiita

SpotBugsの使い方とレポート化の手順

Javaで静的解析がお手軽にできるツールということでレポート化できんだっけ?というので調べたときのメモ

前提条件

Java 17環境(Java 8でも同じだと思うが)
Maven使用(Gradleの場合は末尾の参考サイトを)
Eclipse(英語版)のPleadesじゃないのを使ってる想定
自PCにMavenをインストールしてなくてmvnwを使っていて、
基本的にEclipseのGUIでbuild/installする前提
SpotBugsは4.8.3を使います

インストール

Help > Install new software
Work with:
https://spotbugs.github.io/eclipse/
Addを押しとく Name: SpotBugs
あとは選択してNext、agreeしてFinish

その後しばらくして経つと、trust selectedを選ぶ

そのあとEclipse再起動により
プロジェクト右クリックでSpotBugsが出てくるようになる
4.8.3が選ばれた。

設定

プロジェクト右クリック
プロパティでSpotBugsを選ぶ

Configure Workspace Settingsを押す
お好みですが、かなり緩い設定にしてます。
後述のプラグインで簡単に制御できるのは analysis effortMinimum confidence to reportです。

analysis effort: Default  
Reporter Configurationタブ  
Reported (visible) bug categories  
の欄のBad pricticeなどのチェックを全部入れる  
右側のMinimum confidence to report: Highにする  
あとはそのまま  

実行方法

右クリックによりFind Bugsで出せる
そうすると下部の(Problems(マーカー))に出てくる。どれが出したかは
TypeにSpotBugsと書いてあるのでそれで判別できる
Excelに貼り付けたい場合はこれをCtrl+Aでコピーしてコピペすればよい

HTMLレポート化

spot-bugs-maven-pluginの最新版は4.8.3であるようだ
1)pom.xmlのdependencyに以下を追加

    <dependencies>
            ...
        <dependency>
            <groupId>com.github.spotbugs</groupId>
            <artifactId>spotbugs-maven-plugin</artifactId>
            <version>4.8.3</version>
        </dependency>
    </dependencies>

注:環境によっては次の依存も追加しないといけないかもしれない

    <dependencies>
            ...
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.12.1</version>
        </dependency>
    </dependencies>

あと場合によってはmaven-site-pluginの依存するhttpcoreあたりも追加する必要があるかも。

2)pom.xmlのbuild.pluginsの中に下記を追加

    <build>
        <plugins>
            ...
            <plugin>
                <groupId>com.github.spotbugs</groupId>
                <artifactId>spotbugs-maven-plugin</artifactId>
                <version>4.3.0</version>
            </plugin>
        </plugins>
    </build>

3)pom.xmlのreporting.pluginsに下記の記載を追加

 <reporting>
        <plugins>
            <plugin>
                <groupId>com.github.spotbugs</groupId>
                <artifactId>spotbugs-maven-plugin</artifactId>
                <configuration>
                    <effort>Default</effort>
                    <threshold>High</threshold>
                    <xmlOutput>true</xmlOutput>
                </configuration>
            </plugin>
        </plugins>
    </reporting>

※かなり緩い設定にしています。これはEclipseのプラグインの設定画面の次にあたるっぽいです。   effort -> analysis effort threshold -> Minimum confidence to Report 設定を書かないとあらゆるものが出力されます(本来はそれで良いが)。 ちなみにカテゴリー(Bad Practice)の単位でしぼりたかったものの何故かできませんでした。 SpotBugs Mavenプラグインの使い方 — spotbugs 4.8.3 ドキュメント
ここにはその記載があるにもかかわらず。
あと公式サイトがeffortとthresholdに何がかけるのか書いてない気がしますのでそこがつらい。

EclipseでMaven Buildの実行を追加する

あとは
mvn compile site

mvnw compile site
でいいのだが、大人の事情でSSL関連のエラー出るよーとかで、
いろいろ解決がめんどくさいのでEclipseからやる方法
(※制限された環境かだと素直にMavenをインストールしてコマンドラインからやったほうが楽ですが)

プロジェクト右クリック > Run As > Run Configuration
Maven buildの欄に新規追加
Name SpotBugs
Base directory: ${project_loc:[プロジェクト名]}
Goals: compile site
Profiles: pom.xml
プロジェクト名は置き換えてください。

あとはRun
だいぶかかるのでしばらく待つ
Spring Bootのプロジェクトなんだけどごっそり全部落とされてダウンロード地獄
しばらくたつと
target/site配下にspotbugs.htmlが出力される
※要リフレッシュ

警告された例

Primitive boxed just to call toString in ... [Of Concern(16), High confidence]

Integer.valueOf(1).toString() → String.valueOf(1)かInteger.toString(1)
今回の場合は後者でいい...的な警告だった。 Bug descriptions — spotbugs 4.8.3 documentation

参考サイト

いまだにJava 8 備忘録 - SpotBugsの使い方 - ふるてつのぶろぐ