スポンサーリンク

【PostgreSQL docker】【MyBatis】初期設定

スポンサーリンク

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については以下でまとめていますので、興味があればご参考に

タイトルとURLをコピーしました