- Web Engineer
- アウトバウンド営業
- Webエンジニア(経験者)
- Other occupations (19)
- Development
- Business
はじめに
わりとDBでINSERT時に自動採番したIDを、すぐ後の処理で使いたい時ってあるかなと思います。
その時の操作をMybatisを利用して対応していった時の話です。
実現したいもの
今回、ユーザ情報を登録したり、更新したり、閲覧したりした時のログをDBレコードとして残して、
ユーザ行動ログ一覧として表示したい、ということがありました。
SpringでのAPI開発で、言語はKotlin、DBはMySQLでの対応となります。
APIとして作るのは以下の3つとなります。
・新規登録用のAPI
・更新登録用のAPI
・表示用の一覧API
<ユーザ行動ログ一覧>(表示用の一覧API)
※実行日時の降順表示
今回は新規登録用のAPIに注目して話していきたいと思います。
DBの構成と取得イメージ
DBの構成としては、以下の2つのテーブルを準備しました。
・usersテーブル(ユーザ情報のテーブル)
・user_logテーブル(ユーザ行動ログのテーブル)
usersテーブルには、名前やemailなどの一般的な情報として作成します。
これに対して、user_logテーブルには、
そのuserのidを持たせ、その時の行動をuser_processに入れていきます。
それぞれidは自動採番されるようにしています。
【テーブル構成】
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE user_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL, // 外部キー。usersテーブルのidと紐付く
user_process VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
この2つのテーブルを以下のようなSQLで取得すれば、
最初の一覧が表現出来るかなと。
【取得SQL】
SELECT
users.name,
user_log.user_process,
user_log.created_at
FROM
users
INNER JOIN
user_log
ON
users.id = user_log.user_id
ORDER BY
user_log.created_at DESC
新規登録の時のIDはどうやって取得するか
新規登録の時は、1つのAPI処理の中でusersテーブルに登録しつつ、user_logテーブルにも登録する処理を一度に行うとします。
ここで、新規登録時のusersテーブルのidを、どのようにuser_logテーブルのuser_idに渡すかを考えます。
usersテーブルのidは自動採番なのでINSERT処理内で作られます。
なのであらかじめidを決めて設定する、といったことは出来ない形となります。
以下に簡単なMapperの例を。
DB処理はMybatisのアノテーション利用してのアクセスです。
【userMapper】
@Insert(
"""
INSERT INTO users(
name,
email
) VALUES (
#{name},
#{email}
)
"""
)
fun insert(user: User): Int
【userLogMapper】
@Insert(
"""
INSERT INTO user_log (
user_id,
user_process
) VALUES (
#{userId},
#{userProcess}
)
"""
)
fun insert(userLog: UserLog): Int
【Userのdataクラス】
data class User(
val id: Long?,
val name: String?,
val email: String?
)
【UserLogのdataクラス】
data class UserLog(
val id: Long?,
val userId: Long?,
val userProcess: String?,
)
【Serviceクラス】
fun insertUser(){
// 入力ユーザ情報
val user = User(
id = null,
name = "ユーザA",
email = "aaa@bbb.com"
)
// userResult には登録件数(1)が返ってくる
val userResult = userMapper.Insert(user = user)
val user = UserLog(
id = null,
userId = ?, //← userのidをどこから取るべきか?
userProcess = "新規登録"
)
val userLogResult = userLogMapper.Insert(userLog = userLog)
}
まず考えられるのは、userのinsert後にselect文で取得する方法です。
MySQLだと「SELECT LAST_INSERT_ID」といったものがあります。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/53015
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
フリーランスエンジニア大募集中!
現在、「WEBエンジニア」「フロントエンジニア」「データサイエンティスト」など、様々な職種のフリーランスエンジニア様を募集中です。まずは以下よりお気軽にご応募ください!
採用ページはこちら:https://itanken.com/register
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。
Wantedly:https://www.wantedly.com/companies/rightcode
コーポレート:https://rightcode.co.jp/