【初心者向け】ORMとは

公開日: 2025/7/11

ORMとは英語でObject-Relational Mappingといい、オブジェクト指向プログラミング言語とリレーショナルデータベースとのマッピングを行うものになります。またそれぞれの互換性を向上させるために設計されたプログラミング技術でもあります。
ORMの基本的な構造として、プログラミング言語のクラスとデータベースのテーブルを関連付けや対応付けを行うことから始まります。これにより、エンジニアは直接SQLクエリを作成することなく、ORMを通じてデータベースとやりとりを行うことができます。
そもそもオブジェクト指向プログラミング言語と、リレーショナルデータベースとはなにかを簡単に説明します。

オブジェクト指向言語:データ(オブジェクト)とそれに関連する操作(メソッド)を組み合わせてプログラムを構築するプログラム言語のことです。

リレーショナルデータベース:データを表形式で管理するデータベースの一種です。リレーショナルデータベースでは、データが複数のテーブルに分割され、それらの表の間に関係性が定義されています。

ではなぜORMという技術が出てきたのでしょうか。

1. ORMが出てきた背景


まず簡単にまとめるとオブジェクト指向と関係データベースの考え方の違いを解消するためです。

このオブジェクト指向と関係データベースの考え方の違いをインピーダンス・ミスマッチといいます。インピーダンス・ミスマッチとは


オブジェクト指向は現実世界の物事に沿ってデータモデルを定義しているが、関係データベースはCRUD処理などデータベース操作に最適化してデータモデルを定義しています。これらの設計方針が混在している状態のままだと、無理な表の結合や複数テーブルにまたがる更新処理が多く発生してしまいパフォーマンスが悪化するなどの不都合を招いてしまいます。

このようなデータモデルの設計思想の違いから生じる問題を「インピーダンス・ミスマッチ」と呼びます。インピーダンスミスマッチが起こりうる場面は以下に述べています。



1.オブジェクトとテーブルのミスマッチ
オブジェクト指向プログラミング言語では、データをオブジェクトとしてモデル化しますが、リレーショナルデータベースではデータをテーブルとして格納します。そのため、オブジェクトとテーブルの構造や表現方法が異なってしまいます。

・異なるデータ型のミスマッチ
オブジェクト指向プログラミング言語とリレーショナルデータベースでは、データ型の定義や扱い方が異なる場合があります。たとえば、オブジェクト指向プログラミング言語では文字列をUnicodeで扱うことが一般的ですが、リレーショナルデータベースでは文字セットやエンコーディングによって扱い方が異なります。

・異なる操作のミスマッチ
オブジェクト指向プログラミング言語ではオブジェクトのメソッドを使用してデータを操作しますが、リレーショナルデータベースではSQLを使用してデータを操作します。そのため、データの操作方法や処理の流れが異なり、適切な変換やマッピングが必要です。

2. O/Rマッパーとの違い


ORMについて調べているとO/Rマッパーという言葉が出てきます。その二つの言葉は似ており概念的には同じですが微妙に意味が異なっています。改めてORMの意味をまとめてO/Rマッパーと比べてみます。

・ORM(Object-Relational Mapping)

ORMは、オブジェクト指向プログラミング言語のオブジェクトとリレーショナルデータベースの間でのデータのマッピングや変換を行うプログラミングパターンや手法のことを指します。

ORMは、オブジェクト指向言語で記述されたコードとリレーショナルデータベースのデータを自動的にマッピングし、オブジェクト指向プログラミング言語での操作でデータベースを操作できるようにします。

ORMは、データベースへのアクセスやデータの操作を抽象化し、プログラマが直接SQLを記述する必要がなくなります。

・O/Rマッパー(Object-Relational Mapper)

O/Rマッパーは、ORMを実現するための具体的なツールやフレームワークのことを指します。つまり、O/RマッパーはORMを実現するための具体的な実装やライブラリのことです。

O/Rマッパーは、オブジェクト指向プログラミング言語のコードとリレーショナルデータベースの間でのデータのマッピングや変換を行います。

O/Rマッパーは、データベースのテーブルやカラムとオブジェクトのフィールドやプロパティを自動的にマッピングし、データベースとオブジェクト指向プログラミング言語の間でデータのやり取りを容易にします。

上記のように二つの言葉は似ているようで違う言葉になります。
では最後に実装方法について簡単に解説していきます。

3. 実装

JDBCをインポートしてJavaにて実装を行います。
まずは、ORMを使用せずにデータベースにアクセスする方法です。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();

        String sql = "SELECT * FROM users";
        try (
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_database", "username", "password");
            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
        ) {
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                user.setEmail(rs.getString("email"));
                users.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

簡単に解説します。このJavaのコードでは、JDBCを使用してデータベースに接続し、PreparedStatementを使用してSQLクエリを実行します。その後、ResultSetからデータを取得し、Userオブジェクトにマッピングしてリストに追加します。

続いてORMを導入したあとにデータベースにアクセスする方法です。今回はHibernateを使用しています。

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Column;
im