「MyBatisを使ってみる」の版間の差分
(→処理内容) |
(→MyBatisの設定) |
||
| 214行: | 214行: | ||
mappersタグは今回の主役 mapperインターフェースとそのステートメント(メソッド)を定義する | mappersタグは今回の主役 mapperインターフェースとそのステートメント(メソッド)を定義する | ||
ファイルがどこにあるかを示しています。 | ファイルがどこにあるかを示しています。 | ||
| + | |||
| + | 以上までが、一回書けばほとんど変更しないファイルです。一度作ってひな形としておけば、 | ||
| + | わずかな修正で使いまわせるでしょう。 | ||
| + | |||
| + | ==Mapperの定義== | ||
| + | |||
| + | さて、ここからが本題です。 | ||
| + | |||
| + | Mapperとはテーブル等の読み書きに使うインターフェースです。 | ||
| + | select, update, insert, delete 用の SQL を事項するメソッド(ステートメント)を定義します。 | ||
| + | この例では select の例を紹介します。 | ||
| + | |||
| + | mybatis-config.xml に記述した通り、mapperの定義ファイルは '''CardMapper.xml''' ですが | ||
| + | これは CardMapper.xml をクラスパス、つまり src/main/resources に置くことを示します。 | ||
| + | |||
| + | 中身はこんな感じです。 | ||
| + | |||
| + | <pre> | ||
| + | <?xml version="1.0" encoding="UTF-8" ?> | ||
| + | <!DOCTYPE mapper | ||
| + | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | ||
| + | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||
| + | <mapper namespace="info.nakamuri.app.spike.mybatisspike001.CardMapper"> | ||
| + | <select id="findAllCards" resultType="Card"> | ||
| + | select * from cards | ||
| + | </select> | ||
| + | <select id="findByKey" resultType="Card"> | ||
| + | select * from cards where userid=#{param1} and english=#{param2} | ||
| + | </select> | ||
| + | </mapper> | ||
| + | </pre> | ||
| + | |||
| + | 2つのメソッド findAllCards と finfByKey が定義されており、 | ||
| + | findAllCards メソッドは無引数でテーブル上の全てのレコードを返します。findByKeyは | ||
| + | 指定ユーザの指定絵に単語を持つレコードを1個だけ返します。 | ||
| + | |||
| + | いずれも Card 型を返すように指定されていますが、実際には、戻り値は Card か Cardの コレクション型 | ||
| + | になりますが、これは Java側のインターフェース定義に任せます。 | ||
| + | |||
| + | SQL の中身は解説不要と思いますが、#{param1}と#{param2}は OGNLという記法で、メソッドの第1引数と第2引数を表します。 | ||
2016年11月16日 (水) 10:12時点における版
メインページ>コンピュータの部屋#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>
pom.xml の設定が終わったら、Maven の「プロジェクトの更新」を実行します。
プロジェクトの 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 などを使いたい人もいるでしょう。
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インターフェースとそのステートメント(メソッド)を定義する ファイルがどこにあるかを示しています。
以上までが、一回書けばほとんど変更しないファイルです。一度作ってひな形としておけば、 わずかな修正で使いまわせるでしょう。
Mapperの定義
さて、ここからが本題です。
Mapperとはテーブル等の読み書きに使うインターフェースです。 select, update, insert, delete 用の SQL を事項するメソッド(ステートメント)を定義します。 この例では select の例を紹介します。
mybatis-config.xml に記述した通り、mapperの定義ファイルは CardMapper.xml ですが これは CardMapper.xml をクラスパス、つまり src/main/resources に置くことを示します。
中身はこんな感じです。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="info.nakamuri.app.spike.mybatisspike001.CardMapper">
<select id="findAllCards" resultType="Card">
select * from cards
</select>
<select id="findByKey" resultType="Card">
select * from cards where userid=#{param1} and english=#{param2}
</select>
</mapper>
2つのメソッド findAllCards と finfByKey が定義されており、 findAllCards メソッドは無引数でテーブル上の全てのレコードを返します。findByKeyは 指定ユーザの指定絵に単語を持つレコードを1個だけ返します。
いずれも Card 型を返すように指定されていますが、実際には、戻り値は Card か Cardの コレクション型 になりますが、これは Java側のインターフェース定義に任せます。
SQL の中身は解説不要と思いますが、#{param1}と#{param2}は OGNLという記法で、メソッドの第1引数と第2引数を表します。
