mybatisの設定で苦戦してしまった話
現在も自作ブログを作成中です.
進捗としては,とりあえずページング機能を加え,HTML/CSSのみである程度の外観を設計しました.
(背景などはわかりやすいように色付き無地にしただけなので,そのうち変更していくつもり)
あとは,簡単なコントローラと作りながら,Springの設定を整えていったという感じです.
SpringBootを使おうかとも考えましたが,とりあえずSpringMVCやその他のSpring機能だけで頑張ろうかと思います.
SpringBootを使わないとXMLが地獄だとよく言われてますが,インターンで一度経験したことがあるので思っていたよりは早くできました.
(でも,めんどくさかったです笑)
SpringBootは,SpringをXMLから使えるようになれば何とかなるかなと思い後回しにしてます笑
そのうちやります.
さてさて,ブログの記事の管理をMySQLで管理しようかと思っていたので,Springと相性の良いmybatisを使うことに決めましたが...
タイトルの通り,環境設定でつまづきました笑
こちらもインターンで触れたことはあるのですが,当時は何もわからずリファレンスの通りに作業していただけなので,あんまり覚えていませんでした笑
というわけで,今回はちゃんとやりました!!
mybatisをつかったマッピングはmybatisのホームページやQittaにも載ってますし,そんなに難しいことではないので飛ばします.
(最初はインタフェースを使ってマッピングするという感覚がつかみにくいかと思いますが,使っていくうちにわかると思います)
というわけで設定に関して記述していきます.
web.xmlやcontextが書いてあるXMLファイルが用意されていることを前提とすると,準備するファイルは以下の3つのファイルです.
一つ目から見ていきましょう.
まあ正直mybatis-configに関しては,フェッチサイズとNullの設定,mapper.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>
<setting name="jdbcTypeForNull" value="NULL" />
<setting name="defaultFetchSize" value="100" />
</settings>
<mappers>
<package name="classpath:mapper.BlogConfigMapper" />
</mappers>
</configuration>
ほかにもいろいろな要素があるので,気になる方は公式リファレンスを見てみてください.URLは下のほうに貼っておきます.
まずjdbcTypeForNullで,javaでのNull値をSQLでもNull値として扱えるようにします.
defaultfFetchSizeは,複数行の戻り値を受け取る場合の設定です.今回は適当に100にしました.記事が増えてきたら変更しなければいけませんね笑.
mappersのpackage要素で,マッピング用のXMLファイルを指定してます.classpathで指定することで,resource配下からのパスだということを明記しています.
※Mapperインタフェースの配置はsrc/main/java配下,Mapper.xmlの配置はsrc/main/resources配下でMapperインタフェースと同じパスの場所であることに注意!
mybatisを使う上でFQCN名を使用することが多くなるので,ネストが深くて書くのがめんどい人はTypeAliasesを使って短縮名を定義するのもありです.
僕は,短縮名を使うよりしっかり明記したい派なので書きませんでした.
人それぞれです.
これでmybatisのconfigurationは終わりです.
次はインタフェースを作ります.
package mapper;
import mapper.model.BlogConfigMapperModel
public interface BlogConfigMapper {
void registArticle (BlogConfigMapperModel mapperModel) ;
}
一部だけ載せました.記事を登録する用のメソッドです.これを実装するファイルをxmlで記述していきます.
(噂によるとアノテーションでもSQLクエリーを書けるそうですが,汎用性が低いみたいなので僕はxmlを使ってます)
<?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="mapper.BlogConfigMapper">
<insert id="registArticle" parameterType="mapper.model.BlogConfigMapperModel">
INSERT INTO ...
ここにクエリーを書き込む
</insert>
</mapper>
注意すべき点は1点.それは,idをインタフェースで定義したメソッドと同じ名前にすることです.これによって実装が可能となります.parameterTypeは引数の型です.引数が複数となる場合は,@Paramアノテーションをインタフェースに加えることで使用可能となります.
あと,クエリー内で引数を使う場合は2通りあります.
${ 変数名 }:置換変数を使用
#{ 変数名 }:バインド変数を使用
HTMLやJSP,PHPなどでフロントに変数を記述するときとほとんど同じですね.
バインド変数と置換変数の違いは,SQL仕様に変換するか,そのまま文字列に変換するかみたいな感じだと思います.(ここはあまり自信ありません笑)
結構大雑把に説明しましたが,まあこんなところです.
あれ?MySQLの設定は?
mybatis-config.xmlを読み込むにはどこに何を書いたらいいの?
こんなことを思った人は鋭いですね.
ズバリ,contextのXMLファイルに記述します.
(dataSourceなどの設定はmybatis-config.xmlにも書けますが僕はまとめてcontextファイルに書いちゃってます)
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${mysql.className}"/>
<property name="url" value="${mysql.url}" />
<property name="username" value="${mysql.user}" />
<property name="password" value="${mysql.pass}" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis-config.xml" /> </bean>
<bean id="mp" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper.BlogConfigMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
この3つを定義しておけば問題ないかと思います.dataSourceでドライバーの設定をします.pomでMySQLのコネクタをdependencyで加えておくことを忘れないように.MySQLの諸設定もここでしちゃいます.
sqlSessionFactoryでdataSourceとmybatis-configをセッターインジェクションします.
mpでMapperインタフェースをDIコンテナに注入しています.
これでようやく使用できますね.
Springは設定がめんどくさいと思われてますが,使ってみると意外と最強ですよ??
日本で使っている人は少ないみたいですが...
やっぱりWebやる人にはPHPやRailsやDjangoのほうが楽なのかなぁ...
まあ,Javaは結構複雑ですから,億劫になるのも仕方ありませんね笑
参考:mybatis公式 http://www.mybatis.org/mybatis-3/ja/index.html