MyBatisを使ってみる
メインページ>コンピュータの部屋#Java>MyBatis Tips
これは MyBatis のごく簡単なチュートリアルです。MyBatis を使ってある単独のテーブルのレコードを読む簡単な例を示します。
目次
[非表示]処理内容
MySQL flashcardデータベース上の cards テーブルの内容を読みます。
テーブルの形はこれです。
CREATE TABLE `cards` ( `userid` varchar(256) NOT NULL, `english` varchar(256) NOT NULL, `japanese` varchar(256) NOT NULL, `english_japanese_pass_count` int(11) NOT NULL, `japanese_english_pass_count` int(11) NOT NULL, `level` int(11) NOT NULL, `last_review_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`english`,`userid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='フラッシュカードの単語帳';
このテーブルは、所謂単語帳で、利用者別に英単語と日本語が収録されていると考えてください。
内容はこんな感じです。
準備
簡単に始めるなら Maven を使うのがよいでしょう。Eclipse(現在の版は 4.6Neon)のPleiades All in one には Maven が含まれておりますので Pleiades(Neon, All in One)をインストールされていれば準備完了です。Java は 今時ですから 1.8 にしてください。
プロジェクトの設定
Pleades で Mavenプロジェクトを作成したら、pom.xml の dependencies を以下のように設定します。
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>[5.1.40]</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.7</version> </dependency> </dependencies>
上の
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>[5.1.40]</version> </dependency>
の部分は MySQL を使うためです。他のデータベースを使うなら適宜変更してください。
また、Javaコンパイラーのバージョンとソースコードのエンコーディングの指定も忘れずに。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <maven.compiler.target>${java.version}</maven.compiler.target> <maven.compiler.source>${java.version}</maven.compiler.source> </properties>
また、プロジェクトの src/main/resouces には、ログ出力のための logback 用の設定ファイルを置きます。 名称は logback.xml 内容は以下のような感じでよいでしょう。
<?xml version="1.0" encoding="UTF-8" ?> <!--suppress ALL --> <configuration> <!--変数の定義を行います。2行目は外部のプロパティファイルの内容から定義します。--> <property name="LOG_DIR" value="c:/logback_logs" /> <!-- 標準出力に出力する設定です。--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!--アペンダでのレベル設定--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>TRACE</level> </filter> <target>System.out</target> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern> </encoder> <withJasi>true</withJasi> </appender> <!--ログファイルを出力するシンプルな設定です。--> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!--アペンダでのレベル設定--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>TRACE</level> </filter> <!--<file>${LOG_DIR}/Trace.log</file>--> <file>log/Trace.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern> </encoder> </appender> <!--ログファイルをアーカイブする設定です。アーカイブは1時間毎に行います。--> <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--アペンダでのレベル設定--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <!--<file>${LOG_DIR}/Rolling.log</file>--> <file>log/Rolling.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--<fileNamePattern>${LOG_DIR}/Rolling_%d{yyyy-MM-dd_HH}.log</fileNamePattern>--> <fileNamePattern>log/Rolling_%d{yyyy-MM-dd_HH}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n</pattern> </encoder> </appender> <!-- ルートから全てのログをアペンダに流し、アペンダでフィルタリングを行う方式とします。--> <root level="TRACE"> <appender-ref ref="STDOUT"/> <appender-ref ref="FILE"/> <appender-ref ref="ROLLING"/> </root> </configuration>
この辺慣れている方は、ログ周りの dependencies の設定や 設定ファイルの内容はお好きなようにしてください。 log4j などを使いたい人もいるでしょう。
pom.xml の設定が終わったら、Maven の「プロジェクトの更新」を忘れずに。
MyBatisの設定
決まり切った設定ですが、プロジェクトの src/main/resources に mybatis-config.xml というファイルを作り 中身はこんな感じにします。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- アンダースコアによって単語を分けている名前がCamel形式にマッチするように変更 --> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings> <typeAliases> <typeAlias alias="Card" type="info.nakamuri.app.spike.mybatisspike001.Card" /> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/flashcard" /> <property name="username" value="MySQLのユーザ名" /> <property name="password" value="MySQLのパスワード" /> </dataSource> </environment> </environments> <mappers> <mapper resource="CardMapper.xml" /> </mappers> </configuration>
この例では MySQL の flashcard というデータベースの cards というテーブルを読みます。
info.nakamuri.app.spike.mybatisspike001.Card
というクラスは、cardテーブルのレコードの内容を受け取るクラスで、typeAlisa タグでは 後で別の設定ファイルの中でこのクラスを指定する時、クラス名を FQCNで指定するのは長いので 短い名前 Card を定義しています。
environmentタグの中はおなじみの JDBC の接続パラメータで、
<transactionManager type="JDBC" />
は、トランザクションの制御をプログラムで直に制御することを表します。
<dataSource type="POOLED">
はデータベースコネクションがプールされることを示しています。
mappersタグは今回の主役 mapperインターフェースとそのステートメント(メソッド)を定義する ファイルがどこにあるかを示しています。