Kotlin + MyBatisを利用してMySQLに接続し、レコードの情報を取得するまでのメモです。
CRUD一通りとか動的クエリとかは別で書きます。
環境
Kotlin : 1.4.0 MyBatis : 3.5.5 MySQL Connector/J : 8.0.21
ビルドツールはMavenを前提としています。
DBの中のデータはこんな感じ。
DB自体の環境については下記の記事を参照
【MySQL/Docker】docker-composeでMySQL5.7のイメージを作成して接続する備忘録 - B-Teck!
ディレクトリ構成
├src/main/ │ ├kotlin/ │ │ └mybatis/ │ │ └Main.kt │ └resources/ │ ├mapper.xml : 実行するクエリの定義ファイル │ └mybatis-config.xml : MyBatisの設定ファイル └pom.xml : Mavenの依存性管理ファイル
ライブラリ読み込み
pom.xmlに下記の記述を追加して、MyBatis本体とMySQLに接続するためのコネクタを利用できるようにします。
<!-- DB --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency>
MyBatisの設定ファイルを作成します
mybatis-config.xmlにDBへの接続情報などの設定値を定義します。
後述するSQLを書くためのファイルは
<?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="defaultStatementTimeout" value="20"/> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <environments default="sample"> <environment id="sample"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3314/sampledb"/> <property name="username" value="user"/> <property name="password" value="password"/> <property name="poolMaximumActiveConnections" value="5"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper.xml"/> </mappers> </configuration>
SQLを定義する
mappersブロックに記述されていたxmlの中身です。
SQLと利用するMapper(namespace)、レコードを取り出すための型情報(resultType)が定義されています。
idはそのままMapperのメソッド名になります。
mapper.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="main.Mapper"> <select id="selectAll" resultType="main.User"> SELECT name, email FROM users; </select> </mapper>
実装
取得するエンティティを表現するためのdata classを用意します。
data class User(val name: String, val email: String)
mapper.xmlと対になる形のinterfaceを用意します
設定ファイルのところでも書いたように、mapperで定義したid= selectAll
がメソッド名になっています。
interface Mapper { fun selectAll(): List<User>? }
接続情報を読み込んでDBに接続、レコードを取得
今回はサンプル用の実装なのでSessionFactoryを使い捨てていますが、
本来はアプリケーションが生存している間は同じものを使い回すことが推奨されています。
MyBatis – MyBatis 3 | スタートガイド のスコープとライフサイクル参照
package main import org.apache.ibatis.session.SqlSessionFactoryBuilder fun main() { // configをInputStreamで取り出す val config = Thread.currentThread() .contextClassLoader .getResourceAsStream("mybatis-config.xml") // 接続用のセッションを作成 val sessionFactory = SqlSessionFactoryBuilder().build(config) val session = sessionFactory.openSession() // Mapper経由で情報を取り出し val users = session.getMapper(Mapper::class.java).selectAll() println(users) // [User(name=exam taro, email=taro@example.com), User(name=exam jiro, email=jiro@example.com)] }