0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SIerに入って8年ぐらい経ったのでいろいろ棚卸しをしてみる。【vol.002 JDBC】

Last updated at Posted at 2019-04-13

出会い

2011年に現在の部署に新卒で配属されて、翌2012年の年明けに製造業系のPOCシステム開発にアサインされた。
Java6、Strutsと今となっては懐かしい技術での開発で、自分にとっては初のコーディングPJでもある。
O/Rマッパーは、当時のiBATISでSqlMapConfigにDBへの接続設定やらSQL、マッピング定義を書く。

そんな案件でJDBCと出会った。

JDBCとは

「JDBC(Java Data Base Connectivity)」はJavaからデータベースを呼び出すためのAPIです。
正確には直接Javaがデータベースを操作するのではなく、「JDBCドライバ」を介してデータベースを操作することになります。
Javaからは「JDBCドライバ」に対して命令を出し、JDBCドライバがその命令に従いデータベースで処理を実行し、そしてその結果を返します。
JDBC 1章 JDBC API 1.1. JDBCドライバ

  • 基本的にJavaからDBに対してCRUDのSQLを投げるやつである。
  • Insert、Update、Deleteしてデータ操作したり、Selectでデータ取得したりする。
  • SQLは、Javaのクラスに書くのでその点、密結合である。
  • SQLをゴリゴリとクラスに書くあたり、C#のDapperと親しいものを感じる。
  • クラスへのマッピングは自動でやってくれないので、ResultSetから一つ一つ取り出してSetしてあげる手のかかる子である。
  • ドライバー(com.xxx.jdbc.Driver)を差し替えるだけで、各DB製品(Oracle, Postgres, etc)に対応する。

振り返ってみて

  • 今どきJavaでO/Rマッパー(JPAHibernateMyBatis)を使わないPJなんてないだろうことを考えると、非常に原始的な仕組みなのでいい出会いだったと思う。
  • 以下の処理を自分でコーディングするので、DBアクセス周りの仕組みを理解するには良い。
  • DBにコネクションつなぐ。
  • トランザクションを張る。
  • SQLを発行する。
  • 結果をクラスへマッピングする。
  • 最近の若手だといきなりJPAで、以下の環境でコーディングしたりする人もいると思う。
    • DBへの接続やトランザクション周りは共通クラスで隠蔽されている。
    • SQLは自動発行される。
    • 自動でクラスにマッピングしてくれる。
  • 便利になった分、仕組みを理解せずに動くもの作れる。
  • 仕組みを理解していないと、DBアクセス周りで障害が起きたときに対応できない。
  • と思うので、若手のOJTの時はいろいろ説明するようにしている。
  • もはや大規模な開発で使用するには生産性が悪すぎるので、PJで本番コードに乗るもので採用しようとは思わない。
  • ただ、新人研修とか配属後のOJTでは簡単なツール作りとかで使用するといいかもしれない。

どんなところで使ったのか。

  • 初めて使ったときは、わざわざO/Rマッパー(iBatis)をプロジェクトに設定するほどじゃない簡単なツール作りで使った。
  • テキストファイルをReadして、そのReadした内容を使ってDB操作をするような簡単なツール。
  • その後、何年か後にUnitテスト周りのDBアクセスで作り込みをするときに使った。
  • 当時出ていたDBUnitとかのライブラリーだとかゆいところに手が届かず、ゴリゴリとコーディングした気がする。

サンプルで実装してみる。


package sample.jdbc.dao;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import sample.jdbc.model.Worker;

public class SampleDao {

	public static SampleDao instance = new SampleDao();

	private SampleDao () {

	}

	public List<Worker> select() throws SQLException {

		var connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres");
		var statment = connection.createStatement();

        var sql = "select * from worker";
        var resultSet = statment.executeQuery(sql);

        var workerList = new ArrayList<Worker>();

        while(resultSet.next()){

            var worker = new Worker();

            worker.setId(resultSet.getString("id"));
            worker.setName(resultSet.getString("name"));
            worker.setAge(String.valueOf(resultSet.getInt("age")));
            worker.setDepartment(resultSet.getString("department"));

            workerList.add(worker);
        }

        resultSet.close();
        statment.close();
        connection.close();

        return workerList;
	}

	public int insert() throws SQLException {

		var connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres");
		connection.setAutoCommit(false);

		var statment = connection.createStatement();

        var sql = "insert into worker values ('0001', 'k.jarrett', 73, 'music');";

        var resultCount = statment.executeUpdate(sql);

        connection.commit();
        statment.close();
        connection.close();

        return resultCount;
	}

	public int update() throws SQLException {

		var connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres");
		connection.setAutoCommit(false);

		var statment = connection.createStatement();

        var sql = "update worker set age = 74 where id = '0001'";

        var resultCount = statment.executeUpdate(sql);

        connection.commit();
        statment.close();
        connection.close();

        return resultCount;
	}

	public int delete() throws SQLException {

		var connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres");
		connection.setAutoCommit(false);

		var statment = connection.createStatement();

        var sql = "delete from worker where id = '0001'";

        var resultCount = statment.executeUpdate(sql);

        connection.commit();
        statment.close();
        connection.close();

        return resultCount;
	}
}

サンプルプロジェクトごとGitHubにプッシュしています。
https://github.com/TsJazz27Sumin/jdbcSample/tree/master/src/sample/jdbc

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?