MyBatisは、Javaの開発でSQLベースのO/Rマッパーを探している方が知っておきたいフレームワークです。
しかし、Springと連携してのデータベース活用(DB操作)など、使い方に慣れていない方は何から始めればよいのかわからず、コード作成も難しく感じることでしょう。
そこで本記事は、MyBatisに必要な基礎知識や使い方について解説します。
目次
閉じる
1.MyBatisとは
MyBatisは、Javaで「データベース管理システム」を効率的に扱うためのフレームワークです。英語表記の「Database Management System」の頭文字を取って「DBMS」と略して呼ばれることもあります。
データベースを扱う理由は、プログラミングの世界では、アプリケーションに直接データを保存しないことがあることです。データベース管理システムでは、ストレージにデータを集約したものを用意して、そのデータベースに外部アクセスし、編集、検索、削除などの操作ができます。
MyBatisはその中でも「O/Rマッパー」と呼ばれる機能をもつことが特徴です。
MyBatisのO/Rマッパーとは
O/Rマッパーは、「O/Rマッピング」の短くした呼び方です。データを組分けした「リレーショナルデータベース」とJavaのオブジェクトを紐づける機能をもちます。
通常、O/Rマッパーがない場合は、データベースを操作する言語「SQL」を記述して、データベースの操作命令SQL文(=SQLクリエ)を書く必要があります。しかし、O/Rマッパーはそれを簡易化して、SQL文とJavaのオブジェクトを紐づけることが可能です。
MyBatisは、このO/Rマッパーによるマッピングに重点を置いたフレームワークとして知られています。
永続性のフレームワークとは
MyBatisのフレームワークがもつ特徴の1つが「永続性」です。永続性とは、JavaやSQLで「トランザクション処理の状態をずっと保持すること」を意味します。トランザクションとは、複数の処理をひとまとめにすることです。
一般的には、銀行の入出金処理などに対して「トランザクション」という用語が使われます。これはトランザクションの「ACID」という考え方が入出金処理に必要なためで、その中の「D(Durability)」がこの永続性の意味に該当します。
例えば、永続性として「1000円入金済みで、そこから1000円が引き落とされ残高0円」という結果があって、それを消さずに記録で残しておくことです。この性質によって、先の取引で通帳残高が0円になった状態を記録から保持することができます。
もしこれがプログラムを再び起動しただけで消え、一時メモリのキャッシュとして失われてしまうと、通帳の出金記録データも消えて困ります。永続性のあるMyBatisは、銀行などをはじめとしたシステムで使われており、トランザクション処理データが残る仕組みを採用しているのです。
2.MyBatisで使える機能
MyBatisには、先に紹介したデータマッピング機能以外にも、Java向けに以下の機能が搭載されています。
DBスキーママイグレーション
1つ目が、「DBスキーママイグレーション」という機能です。「DB」はデータベース、「スキーマ」はテーブルや構造を意味します。
つまり、「DBスキーマ」は、データベースのテーブルのことです。SQLではテーブルを作成して、データベースを構築するため、これらの用語がよく登場します。そして、マイグレーションは新しい環境への「移行」を意味します。これらをまとめると「DBスキーマの変更を保存して更新する」機能です。
開発中は仕様が変わったり、バージョン管理のためだったり、DBスキーマの変更をファイルなどで記録に残しておくことが必要になるケースもあります。DBスキーママイグレーションの機能はそのようなケースに有効です。
コードジェネレータ
2つ目は、コードジェネレータの機能です。コードジェネレータとは、コードを自動的に生成するためのフレームワーク内のツールです。この場合、「MyBatis Generator」で、DBスキーマを解析して、JavaのコードやXMLを補完しながらサポート機能を使って作成できます。
フレームワーク間連携
3つ目は、MyBatisと他のフレームワークを連携できる機能です。具体的には、連携先として「Spring Framework」や「Spring Boot」、「Google Guice」が代表的です。
特に、DIを活用することによって、依存性を減らすことが可能となります。この機能でテスト面やコードの再利用性が高まり、開発効率が上がるでしょう。MyBatisだけでは難しいことも、連携することで欠点を補完できるのです。
キャッシュ機能
4つ目は、キャッシュ機能です。キャッシュ機能は、キャッシュを保存して、SQLクリエが同じ場合に再利用することで同じ操作を省略できます。
キャッシュ機能で使われる内部キャッシュにはローカルな「SqlSession」があり、セッションの破棄までキャッシュ情報が保持される仕組みです。また、SqlSessionのキャッシュは、コードを書いて明示的にクリアすることも可能です。
ロギング
5つ目は、ロギングの機能です。ロギング(logging)の「ログ(log)」は、通信や挙動状況を記録する情報のことで、それをタイムスケジュールなどで整理して記録する機能を指します。
MyBatisでは、SQLクリエやその変数までロギングして情報を記録することが可能です。
関連記事
Strutsとは?脆弱性は大丈夫?struts6とは?Javaフレームワークとの違いをわかりやすく解説!
3.MyBatisで開発するメリット
MyBatisを活用した開発には、さまざまなメリットがあります。以下に3つのメリットを紹介します。
開発業務の効率向上
1つ目のメリットは、開発業務の効率が高まることです。MyBatisはSQLクリエを簡易化し、SQL文のコードを省略できます。その際に、効率化のために使用されるのがMapperやSqlSessionなどのインターフェースとMyBatisの内部機能です。
JavaとSQLは本来、別の言語のため、コードに直接使用することはできません。しかし、インターフェースがそれらをつなぎ合わせる役割を果たしています。MyBatisはインターフェースからメソッドの名前やアノテーションの情報を受け取り、自動でマッピングします。
マッピング作業でSQL文をアプリ側に長々と直接書く必要がなく、クラスコードに1行を加えるだけで完了します。これは、Javaで使われるデータベース管理システム「JDBC」(Java Database Connectivity)だけではできないことです。
もちろん、初期設定にはコードを記述する必要があり、マッピングはXMLやアノテーションを使って書く必要はあります。しかし、それでも使用するごとに10行以上のコードを減らして、1行で記述できます。
さらにMyBatis Generatorを使えばXML記述の作業も省略可能です。そのため、JDBCに比べるとコードの作成量が減り、コードとの分離もできるため保守管理の業務効率も向上するのです。
基礎学習のみで実践使用できる
2つ目のメリットは、JavaエンジニアがデータベースやSQLの基礎学習のみで実践的に使えることです。MyBatisはJDBCのさまざまな処理を短いコードで実現します。そのため、SQL初学者でもXML記述の方法や簡単な操作の処理の仕方、インターフェースの使い方さえ押さえておけばプログラムを作成可能です。
もちろん、場合によっては高度なMyBatisのプログラム記述が必要となることもあるため、後々、理解を深めることも必要です。
プラグインが豊富にある
3つ目のメリットは、Java開発でよく使われるIDE向けのプラグインが豊富で開発業務に活用できることです。例えば、EclipseだけでなくIntelliJもIDEの中で公式がサポートするプラグインを導入することが可能です。
プラグインがなくても開発自体はできますが、導入することでエラーチェックからの記述ミスを減らしたり、対応関係を簡単に確認できたり、といった複数のメリットがあります。上手く活用すれば、作業効率も上がるのです。
関連記事
Java Goldはどんな資格?難易度や合格率と取得するメリットについて解説
4.MyBatisの基本的な使い方
MyBatisの基礎を理解したところで、次に具体的な使い方を説明します。
MyBatisの実行用コード
以下のコードは、SQLクリエの結果を1行で受け取る例を示した簡単なコードです。(メインクラスのみのコード)
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.*;
public static void main(String[] args) throws Exception { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { BlogMapper mapper = session.getMapper(BlogMapper.class);
//SQLクリエの結果を1行で受け取る
} } } |
まずオブジェクトと紐づけるためにSQLクリエで1を渡します。それが1行で記述したコードの部分です。カッコ内の「1」は、SQLにおける「パラメータ値」を意味します。それを「id = 1」として検索するのです。
テーブルとidの作成ができていれば、自動的に「id = 1」と紐づけているユーザーの情報がコンソールに出力されます。このコードはMyBatis公式で「SqlSessionの取得方法」に示されている書き方となります。
活用することで、ミスを恐れずに文字列のキャストなどが可能です。ちなみに、このコードは実行のために後述のエンティティクラスやMyBatisの設定ファイル、インターフェースなどのコードが別に必要です。
MapperのXMLの記述
MyBatisでは、SQL文をXMLファイルとして記述する方法が代表的です。設定ファイルとは違って、selectのコードを中で使用していることから「SELECT文」と呼ばれます。
<?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">
<select id="selectBlog" parameterType="int" resultType="org.mybatis.example.Blog"> select * from Blog where id = #{id} </select> </mapper> |
上記は、Mapperを定義しているコードです。idの値に「1」を渡します。後は、MyBatisがマッピングで紐づけて、データベースの値を返す流れです。
アノテーションの使用(Mapperインターフェース作成時)
XMLの記述ではなく、アノテーションを使用してコードを作成することもできます。具体的には、Mapperインターフェースのクラスをアノテーションで作成する方法です。
import org.apache.ibatis.annotations.Select;
@Select("SELECT id, title FROM Blog WHERE id = #{id}") Blog selectBlog(int id); } |
アノテーションを使えばJavaのコードにSQLをそのまま書けるメリットがあります。これならマッパーXMLファイルの記述も不要です。ただし、コンフィグファイルは除きます。
関連記事
SQL Serverとは【初心者向け】使い方やメリット、無償版の特徴、価格体系まで徹底解説
5.Springと連携するDB操作の仕方
次に、Javaで使われるWEBアプリケーション作成などで登場するSpringと連携するデータベース(DB)操作の仕方を解説します。
Spring Bootの導入
まず、Spring Bootは、Javaの標準APIではありません。外部のAPIとしてIDEにインストールする必要があります。Eclipseを使っている方は、マーケットプレースからSpring Bootのプラグインを探してインストールすることです。Spring BootをIDEで使える状態にしましょう。
IDEやビルド管理ツールは初学者の場合に導入が必須のため、導入前の方はIDEをOSにインストールすることから始めることです。Web系エンジニアや他の言語のエンジニアからJavaを学習し始めた方は、Javaを使えるようにJDKやSQLなど開発環境の構築も一緒にしておきます。
ちなみに、Spring Bootはコマンドラインからの導入が可能です。その場合、開発にはビルドツールが必須となります。ビルド管理ツールは、代表的な「Maven」や「Gradle」の2つから選択が可能です。
MavenとGradleでは依存関係の設定方法が微妙に異なるため、選択によって作業内容が変わります。それから、今回はMavenを前提に解説しています。
依存関係の追加記述
先述の通り、Spring BootやMyBatisを使用する場合は、依存関係を追加で記述します。
<dependencies> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency>
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> |
上記コードをpomファイルの中の依存関係に入れて更新します。依存関係を設定しないと外部ツールは実行されません。
データベースの環境選択
MyBatisのデータベース環境は、指定の決められたものをインストールする必要はありません。自分で自由に選ぶことが可能です。それが設計の柔軟性にも直結しているのです。
データベースの環境は、基本となるデータベースにSQL文で指示を出します。そのため、Javaがデータベースにアクセスするための標準API「JDBC」をドライバに組み込む必要があります。
MyBatisはこの部分をラップしてやり取りを効率化します。設定を「mybatis-config.xml」の設定ファイルにあるenvironmentsの中でtypeにJDBC、driverの値にドライバーのクラス名を定義します。そのコード例は以下です。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd">
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/bookstore"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments>
<mapper resource="com/example/mapper/BookMapper.xml"/> </mappers> </configuration> |
プロパティファイルの設定
Spring Bootの設定は、プロパティファイルによって決定します。
# DB接続設定 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=password(←これをパスワードに書き換え)
mybatis.type-aliases-package=com.example.model mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
|
例えば、上記の「spring.datasource」で書いたことは、データベース管理(JDBC)の接続情報を設定しています。例えば、「demo_db」のコードは、データベースを表しています。そして、「= password」と置いている部分に、SQLで設定したパスワードを実際に英数字で書き換えましょう。
ただし、アノテーションでJavaのコードを書く場合、XML指定のクラスパスは削除が必要です。
Mapperインターフェースの作成
次は、Mapperインターフェースの作成です。以下は、それにアノテーションを使用した書き方となります。
package com.example.demo.mapper;
import org.apache.ibatis.annotations.*;
public interface UserMapper { @Select("SELECT id, username, email FROM users WHERE id = #{id}") @Results({ @Result(property = "id", column = "id"), @Result(property = "username", column = "username"), @Result(property = "email", column = "email") }) User selectUserById(Long id);
@Results({ @Result(property = "id", column = "id"), @Result(property = "username", column = "username"), @Result(property = "email", column = "email") }) List<User> selectAllUsers(); } |
上記のコードには2つの役割があって、1つはテーブルから1個のユーザーの情報を取得すること。もう1つは全ユーザー情報の全部を取得することです。
1個の取得だけで良い場合は、「List<User> selectAllUsers()」に該当する後半のコードを省くことも可能です。必要に応じてデータベースの操作を変えましょう。
エンティティクラスの作成
下記は基本となるエンティティクラスを作成したコードです。idやemailなど、データベースの既存情報に必要なものを入れています。なお、フィールド名はMapperインターフェースのSQLで使用するカラム名と一致させる必要があります。
package com.example.demo.model;
import java.time.LocalDateTime;
public class User { private Long id; private String username; private String email; private LocalDateTime createdAt; } |
今回は、Java Beanを使いSetter/GetterをLombokで書くことによって、オブジェクトをひとまとめで短く作成できます。
Controllerクラスの実装
Lombokで書く場合もコントローラークラスが必要です。以下はそのコード例です。
package com.example.demo.controller;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
import com.example.demo.service.UserService;
@RequestMapping("/users") public class UserController { private final UserService userService;
this.userService = userService; }
public User getUser(@PathVariable Long id) { return userService.getUserById(id); }
public List<User> getAllUsers() { return userService.getAllUsers(); } } |
基本的には、Springの機能でDI注入をするため、必要なuserServiceのインスタンスをここで作成します。
ただし、URLのパスからAPIで受け取る場合は、上記のコードに「@PathVariable」などのアノテーションでデータベースへのアクセスを書き換えられます。
その上で、public User以下の「@PathVariable」では、idを引数としてパスに値を渡す役割があります。これもSpringの自動機能です。
ただし、「@Autowired」を入れるフィールド注入はベストプラクティスではないため、可能なら上記のfinal修飾子を入れたままのコード(コンストラクタで注入する方法)を使います。
SQLのテーブル作成作業とコードの実行確認
以上で作成したコードは、SQLでデータベースを作成してユーザーデータをテーブルを用意し、データベースにユーザーID「1」にある情報を受け取れるよう事前にセットします。データがないと検索してもidで探せません。
SQLなどのデータベース環境がない場合は先にインストールが必要です。そのとき、SQLのログインデータや接続情報は控えておくとアプリケーション設定やpomファイルのコード作成が効率的に進むでしょう。
次に、EclipseなどのSpringBootが使えるIDEの起動です。メインメソッドの開始コードをdemoメインクラスに追加したら実行可能となります。
SpringApplication.run(DemoApplication.class, args); |
「DemoApplication.java」などのファイル名などを付けて作成し、追加しましょう。その際に、他のクラスファイルとパッケージも追加して、依存関係の追加やプロパティを設定することです。このとき、Mavenの更新操作も忘れないようにします。
後はSpringBootで実行し、成功したら「id = 1」のデータが検索できます。結果は、「http://localhost:8080/users/1」にローカルアクセスして確認が可能です。
問題がなければ、次のようなデータの取得画面が表示されます。
{"id":1,"username":"yamada","email":"yamada@example.com","createdAt":null} |
画面が真っ白になったり、エラーコードが表示される場合は、データベース登録の失敗やコードに問題があります。特にJavaエンジニアでSQLの操作に慣れていない方もいるでしょう。この機会にデータベース操作の正しい手順を覚えることです。
関連記事
【2025年版】Javaの最新バージョン|確認方法やインストール方法を解説
6.MyBatisのよくある質問
ここでは、MyBatisについてよくある質問に回答します。
MyBatisは内部で自動生成される?
結論からいえば、すべてが自動生成されることはありません。MyBatisを利用したJavaのプログラムでコードを実行した場合に、自動的にマッピングが行われます。しかし、コード自体が自動で毎回追加されるわけではないのです。
必要な設定や記述は事前に行う必要があり、JavaコードとアノテーションやXMLの記述、各クラスの初期設定は省くことができません。ただし、JDBCで書くよりも多くのコードを省略可能です。
MyBatisを使うデメリットは?
MyBatisのデメリットは、コードが複雑化した場合や内容が高度化した場合に、記述が長くなることです。つまり、保守の際の可読性が下がります。
特に繰り返し文が発生した場合、保守管理の手間が増えることです。そのため、変更や修正などが難しくなることもあります。MyBatisで作成する場合でもコード量の増減には注意が必要です。
MyBatisで使われる#と$の違いは?
#{}と${}には明確な役割の違いがあることで知られています。まずMyBatisでは、値や文字をマッピングした状態で渡す機能が基本です。その際に、SQL文に値や文字を組み込む操作に型の安全を保証するため#{}と${}が使われます。
#{}はPreparedStatementのパラメータとして値を安全に渡します。文字列の場合は自動的にシングルクォーテーションで囲まれ、数値の場合はそのまま渡されるなど、適切な型変換が行われます。一方、${}は値をそのまま文字列としてSQL文に直接埋め込みます。
#{}のパラメーターバインディング(値の紐づけ)はSQLインジェクション対策が施されていますが、${}は文字をそのままコードに組み込むため、SQLインジェクションの攻撃リスクがあります。
したがって、${}は必要なときだけに限定して、乱用しないことが原則です。#は基本的に使ってもパラメーターをバインディングする(変数の値を結びつける)ため安全です。
7.まとめ
今回は、MyBatisの概要や機能、メリット、使い方などについて解説しました。MyBatisはデータベース管理のできるフレームワークです。
特に、O/RマッパーはJavaでSQL文の結果を受け取って、オブジェクトを紐づけるマッピング作業ができます。SQLに軽く触れただけで本格的な開発経験がない方にとっては、少し大変ですが使い方を覚える必要があります。しかし、慣れてしまえば便利に開発を進めることが可能です。
以上を参考にして、MyBatisの基本的な使い方をマスターしましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。
自身に最適なフリーランスエージェントを探したい方はこちらよりご確認いただけます。