PostgreSQLとMyBatisで最速スタートを切るためのまとめです。
gradle
バージョンは適宜必要なものにしてください
implementation 'org.mybatis:mybatis:3.5.10'
implementation group: 'org.postgresql', name: 'postgresql', version: '42.4.1'
mybatis-config.xml
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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://localhost:5434/coincheck"/>
<property name="username" value="postgres"/>
<property name="password" value="postgres"/>
</dataSource>
</environment>
</environments>
</configuration>
docker-compose.yml
PostgreSqlのdocker-composeです。password, userを指定しない場合はDefaultでpostgresとなります。
version: '3'
services:
db:
image: postgres:latest
container_name: postgres
ports:
- 5432:5432
volumes:
- ./mydata:/var/lib/postgresql/data
- ./script:/docker-entrypoint-initdb.d
environment:
- POSTGRES_PASSWORD=postgres
データを永続化するためには/var/lib/postgresql/dataを自ホストにバインドします。
/docker-entrypoint-initdb.dにSQLを渡すことで、container作成時に一度だけそのSQLで初期化されます。Table定義などを入れるといいです
例えば以下のファイルを入れたとします。
CREATE TABLE some_data(
id serial UNIQUE,
data_name VARCHAR(32) UNIQUE,
flag bool,
data_type myDataType,
PRIMARY KEY (id, data_name)
);
Java/Kotlinファイル
SqlSessionFactoryを用意します。アプリケーションで一つのインスタンスとすることがベストプラクティスとして公式で推奨されているので、シングルトンで用意します。Mapperは後からでも追加できますが、この段階ですべて入れてしまった方が楽でしょう。なお、xmlで追加することも可能です。
object SqlSessionFactoryProvider {
val factory: SqlSessionFactory
private const val RESOURCE = "mybatis-config.xml"
init {
val inputStream = Resources.getResourceAsStream(RESOURCE)
factory = SqlSessionFactoryBuilder().build(inputStream)
factory.configuration.apply {
addMapper(MyMapper::class.java)
}
}
}
Mapperクラスです
interface MyMapper {
@Select("select * from some_data where id = #{id}")
fun getSomeData(id: Int): SomeData
@Select("select * from some_data")
fun getSomeDataList(): List<SomeData>
SomeData
data class SomeData(
val id: Int,
val dataName: String,
val flag: Boolean,
val dataType: DataType
)
使用箇所
SqlSessionFactoryProvider.factory.openSession().use { session ->
val mapper = session.getMapper(MyMapper::class.java)
return mapper.getSomeDataList()
}
kotlinのuseはjavaのtry-with構文です。
最後に
以上です。MyBatisのAnnotationについては以下でまとめていますので、興味があればご参考に