Skip to content

MyBatisを使ってDBに接続

MyBatisを使ってJavaアプリからDBに接続する方法、および実装サンプルを記載します。

設定ファイル

pom.xml

各種依存関係です。アプリ起動時にエラーが起きる場合はバージョンが古い可能性があります。

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.19</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>jakarta.persistence</groupId>
            <artifactId>jakarta.persistence-api</artifactId>
        </dependency>

application.properties

DBへの接続情報です。

#MariaDBのドライバ設定
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
#接続用URL
spring.datasource.url=jdbc:mariadb://localhost/eadb
#ユーザ名
spring.datasource.username=root
#パスワード
spring.datasource.password=password

mybatis-config.xml

src/main/resources配下に下記で作成します。

<?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="mapUnderscoreToCamelCase" value="true" />
    </settings>
</configuration>

EasyappApplication.java

アプリ起動時にMyBatisの設定を読み込みます。

package nob.example.easyapp;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "nob.example.easyapp.domain.mapper")
public class EasyappApplication {

    public static void main(String[] args) {
        SpringApplication.run(EasyappApplication.class, args);
    }

}

MyBatisConfig.java

package nob.example.easyapp.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

/**
 * MyBatisの設定向けのコンフィグクラスです。
 *
 * @author nob
 */
@Configuration
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        // コンフィグファイルの読み込み
        sessionFactory.setConfigLocation(new ClassPathResource("/mybatis-config.xml"));

        return sessionFactory.getObject();
    }
}

実装

例として、下記のusersテーブル向けの実装を記載します。

カラム名 column_name PK NULL
ユーザID user_id VARCHAR(11) o x
ユーザ名 user_name VARCHAR(20) x
年齢 age INT x
住所 address TEXT o

エンティティ

デーブル定義と対応させるモデルクラスです。

package nob.example.easyapp.domain.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * usersテーブルのentityクラスです。
 *
 * @author nob
 */
@Table(name = "users")
@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Users {

    /** ユーザID */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "user_id", nullable = false)
    private Integer userId;

    /** ユーザ名 */
    @Column(name = "user_name", length = 20, nullable = false)
    private String userName;

    /** 年齢 */
    @Column(name = "age", nullable = false)
    private Integer age;

    /** 住所 */
    @Column(name = "address", nullable = true)
    private String address;
}

Mapperインターフェース

Mapperのインターフェースです。業務処理側からはこのクラスのメソッドを呼び出します。

package nob.example.easyapp.domain.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import nob.example.easyapp.domain.entity.Users;

/**
 * usersテーブルのmapperインターフェースです。
 *
 * @author nob
 */
@Mapper
public interface UsersMapper {

    /**
     * ユーザ情報を更新します。
     *
     * @param users
     */
    void update(Users users);

    /**
     * ユーザ情報を登録します。
     *
     * @param users
     */
    void insert(Users users);

    /**
     * 検索条件からカラムを抽出します。
     *
     * @param userId
     * @return ユーザのリスト
     */
    List<Users> selectByKey(Integer userId);

    /**
     * ユーザ情報を削除します。
     *
     * @param userId
     */
    void delete(Integer userId);
}

Mapper xml

SQLの実体を記載するファイルです。src/resources配下に、mapperインターフェースと同じパッケージ構成で配置します。例として、mapperインターフェースがsrc/main/java/nob/example/easyapp/domain/mapperに配置されている場合、xmlファイルはsrc/main/resources/nob/example/easyapp/domain/mapperに配置します。

  • mapperタグ
    • namespace: mapperが配置されているパッケージ
  • update, insert, select, deleteタグ
    • id: インターフェース側のメソッド名
    • resultType: 戻りの型
<?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="nob.example.easyapp.domain.mapper.UsersMapper">
    <update id="update">
        UPDATE
            users
        SET
            user_name = #{userName}
            , age = #{age}
            , address = #{address}
        WHERE
            user_id = #{userId}
    </update>

    <insert id="insert">
        INSERT
            INTO users (
                user_name
                , age
                , address
            ) VALUES(
                #{userName}
                , #{age}
                , #{address}
            )
    </insert>

    <select id="selectByKey" resultType="nob.example.easyapp.domain.entity.Users">
        <bind name="userNameLike" value="'%' + userName + '%'"/>
        SELECT
            user_id
            , user_name
            , age
            , address
        FROM
            users
        <where>
            <if test="userName != ''">
                AND user_name LIKE #{userNameLike}
            </if>
        </where>
    </select>

    <delete id="delete">
        DELETE
        FROM
            users
        WHERE
            user_id = #{userId}
    </delete>
</mapper>