質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

362閲覧

Spring default値を設定しているのに値が設定されない

JackOguro

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2023/01/21 01:09

前提

MyBatisを用いてMySQLで作成したテーブルにデータをINSERT使用としています。
その際、MySQLでNOT NULL制約、Default値の設定をしたカラムにNULLを入れようとするとエラーが発生してしまいます。
NULLが禁止されているカラムにNULLを代入するとエラーが発生すると思いますが、
Default値を設定しているので代わりにその値が入るるためエラーは発生しないと認識してました。
どのような設定をすればDefault値が設定されるのでしょうか

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • MyBatisを用いてMySQLで作成したテーブルにデータをINSERTする
  • NULLをINSERTした際に、Default値を設定したカラムはそのDefault値がNULLの代わりにINSERTされる

発生している問題・エラーメッセージ

作成したテーブルのACCOUNT_ICON(NOT NULL制約、Default値(/img/default.png))カラムにNULLをINSERT使用とすると、Default値を設定しているが、以下のエラーが表示されてしまう。
VERSIONカラムも同様の理由でエラーが発生してしまう。

### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'ACCOUNT_ICON' cannot be null

該当のソースコード

作成したテーブル
イメージ説明

エンティティクラス

java

1package com.example.model; 2 3import com.example.util.Authority; 4 5import jakarta.persistence.Version; 6import lombok.Data; 7 8@Data 9public class MUser { 10 11 private String username; 12 private String password; 13 private String phoneNumber; 14 private String mailAddress; 15 private String address; 16 private Integer age; 17 private Integer gender; 18 private String accountIcon; 19 private Authority auth; 20 21 /* 排他制御を行うためのVersion列 */ 22 @Version 23 private Integer version; 24}

xmlに記述したSQL文

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 5<!-- Mapperとxmlのマッピング --> 6<mapper namespace="com.example.repository.SpringMySQLSampleMapper"> 7 <!-- マッピング定義(M_USER) --> 8 <resultMap type="com.example.model.MUser" id="muser"> 9 <id column="user_name" property="username" /> 10 <result column="password" property="password" /> 11 <result column="phone_number" property="phoneNumber" /> 12 <result column="mail_address" property="mainAddress" /> 13 <result column="address" property="address" /> 14 <result column="age" property="age" /> 15 <result column="gender" property="gender" /> 16 <result column="account_icon" property="accountIcon" /> 17 <result column="auth" property="auth" /> 18 <result column="version" property="version" /> 19 </resultMap> 20 21 <!-- ユーザー1件の登録 --> 22 <insert id="insertOne"> 23 INSERT INTO M_USER( 24 USER_NAME, 25 PASSWORD, 26 PHONE_NUMBER, 27 MAIL_ADDRESS, 28 ADDRESS, 29 AGE, 30 GENDER, 31 ACCOUNT_ICON, 32 AUTH, 33 VERSION 34 ) 35 VALUES( 36 #{username}, 37 #{password}, 38 #{phoneNumber}, 39 #{mailAddress}, 40 #{address, jdbcType=VARCHAR}, 41 #{age, jdbcType=INTEGER}, 42 #{gender, jdbcType=INTEGER}, 43 #{accountIcon, jdbcType=VARCHAR}, 44 #{auth}, 45 #{version} 46 ) 47 </insert> 48</mapper>

レポジトリークラス

java

1package com.example.repository; 2 3import org.apache.ibatis.annotations.Mapper; 4 5import com.example.model.MUser; 6 7@Mapper 8public interface SpringMySQLSampleMapper { 9 10 /* ユーザー登録 */ 11 public int insertOne(MUser user); 12}

試したこと

エラーの原因となっているカラムのNOT NULL制約を外してNULLを代入すると、Default値は設定されずそのままNULLがテーブルにINSERTされました。

補足情報(FW/ツールのバージョンなど)

Spring Boot 3.0.1
JRE 19
mybatis-spring-boot-starter 3.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiketa

2023/01/21 01:22 編集

> NULLが禁止されているカラムにNULLを代入するとエラーが発生すると思いますが、 > Default値を設定しているので代わりにその値が入るるためエラーは発生しないと認識してました。 ここの認識が間違っているのではないかと。SpringもMyBatisも関係なく、ふつうにinsert文を実行してみればわかるとおもいます。insert文でそのカラムを指定しないときに適用されるのがdefaultで指定した値。insert文でそのカラムを指定してnullを挿入しようとしたら、それはnot null制約にかかるでしょう。 どうしてもMyBatisでdefault値を適用させたいのであれば、そのカラムの値をみて、動的SQLで分岐するのがいいのでは。https://mybatis.org/mybatis-3/ja/dynamic-sql.html
JackOguro

2023/01/21 08:17

コメントありがとうございます。 追加で質問になって申し訳ございません MybatisでValueに対象のカラムを設定していることが問題なのでしょうか。 なるべくSpringには記述し無くないのでDBで処理を行いたいです。
shiketa

2023/01/21 12:00 編集

だったら動的SQLを使われてはいかがですか、と。 INSERT INTO M_USER( <if test="username != null"> USER_NAME, </if> <if test="password != null"> PASSWORD, </if> ... ) VALUES( <if test="username != null"> #{username}, </if> <if test="password != null"> #{password}, </if>
JackOguro

2023/01/22 07:49

コメントありがとうございます! こちら理解できず申し訳ございません。 >insert文でそのカラムを指定しないときに適用されるのがdefaultで指定した値 default値を設定したカラムはvalue句を設定しないことでdefault値が設定されるということでしょうか。
shiketa

2023/01/22 12:44

> 実現したいこと > NULLをINSERTした際に、Default値を設定したカラムはそのDefault値がNULLの代わりにINSERTされる 最初のコメントにも書きましたが、SpringやらMyBatisやらのまえに、まずは、insert文を理解されてはいかがでしょう。MyBatisの先になにがあるのか知りませんが、PosgreSQLだとすればこう書いてあります。 https://www.postgresql.jp/document/13/html/sql-insert.html > 明示的または暗黙的な列リストにない各列にはデフォルト値(デフォルト値が宣言されていればその値、未宣言ならばNULL)が挿入されます。 つまり、明示的にカラムを指定したならば対応する値をvalue句で指定する必要がある、と読める。 > DEFAULT 対応する列にデフォルト値を設定します。 value句では特別な値としてDEFAULTを指定することもできる。らしい。 > 実現したいこと NULLをINSERTした際に、Default値を設定したカラムはそのDefault値がNULLの代わりにINSERTされる それを実現したいのであれば、NULLではなくDEFAULTを指定しろ、ということ。ただし、プログラムでusernameやpasswordにnullではなく"DEFAULT"を設定すると、"DEFAULT"というテキストが挿入されるので、MyBatisをつかうなら動的SQLでこうする必要があるだろうな、ということ。 INSERT INTO M_USER( USER_NAME, PASSWORD, ... ) VALUES( <if test="username != null"> #{username}, </if> <if test="username == null"> DEFAULT, </if> <if test="password != null"> #{password}, </if> <if test="password == null"> DEFAULT, </if> ここまでして、SQLの可読性を削ぐのであれば、わたしならプログラムでSpring側でデフォルト値を設定します。わたしならテーブル定義でデフォルト値は定義しません。
JackOguro

2023/01/23 12:42

コメントありがとうございます。 そうですね、確かにこの書き方をしてしますとSQLの可読性を下げてしまいますよね。 今後はSpring側で定義していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問