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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Spring

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

MyBatis

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

Q&A

2回答

7285閲覧

Parameter 'sampleId' not found. Available parameters are [arg1, arg0, param1, param2 DBへinsertができない

Rivermouth

総合スコア19

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

Spring

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

MyBatis

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

0グッド

0クリップ

投稿2020/09/04 02:54

やりたい事

MyBatisを使用したinsert処理
入力画面からidとnameを入力し、DBへinsert

エラー

11:07:01.744 [http-nio-8080-exec-9] DEBUG org.springframework.web.servlet.DispatcherServlet - Failed to complete request: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'sampleId' not found. Available parameters are [arg1, arg0, param1, param2] SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [/web_sample] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'sampleId' not found. Available parameters are [arg1, arg0, param1, param2]] with root cause [Fri Sep 04 11:07:01 JST 2020]

わからない事

・Parameter "sampleId"が見つからないという事はどういう事なのか。
入力したsampleIdとsampleNameをSQL文に渡し、insertしているので、sampleIdが見つからないという事はないと思うのですが、、

・Available parameters are [arg1, arg0, param1, param2]の意味

UserController.java

package group.study.dev.sample.search.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import group.study.dev.dto.sample.SampleDto; import group.study.dev.sample.search.service.UserService; import group.study.dev.web.common.controller.AbstractController; @Controller //@RequestMapping(value = "/search") public class UserController extends AbstractController { @Autowired private UserService userService; @GetMapping("/search") public String goSearch() { return "search/search"; } @GetMapping("/insert") public String goInsert() { return "search/insert"; } @PostMapping("/insert") public String postInsert(@RequestParam("sampleId")String sampleId, @RequestParam("sampleName")String sampleName, Model model) { System.out.println("sampleId = " + sampleId); System.out.println("sampleName = " + sampleName); userService.insert(sampleId, sampleName); return "search/insert"; } @PostMapping("/result") public String postSearch(@RequestParam("sampleId")String sampleId, Model model) { SampleDto list = userService.selectOne(sampleId); model.addAttribute("list", list); return "search/search"; } }

UserService.java

package group.study.dev.sample.search.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import group.study.dev.dao.sample.SampleDao; import group.study.dev.dto.sample.SampleDto; import group.study.dev.sample.search.model.UserModel; import group.study.dev.web.common.controller.AbstractController; @Service public class UserService extends AbstractController{ @Autowired private SampleDao sampleMapper; private SampleDto sampleDto; public SampleDto selectOne(String sampleId){ UserModel userModel = new UserModel(); userModel.setSampleDto(sampleMapper.selectOne(sampleId)); return userModel.getSampleDto(); } public void insert(String sampleId, String sampleName) { sampleMapper.insert(sampleId, sampleName); } }

UserModel.java

package group.study.dev.sample.search.model; import java.util.List; import group.study.dev.dto.sample.SampleDto; import group.study.dev.web.common.controller.AbstractController; import lombok.Data; @Data public class UserModel extends AbstractController{ private SampleDto sampleDto; private List<SampleDto> sampleList;//コントローラのリスト名と同じにする }

SampleDto.java

package group.study.dev.dto.sample; import lombok.Data; @Data public class SampleDto { private String sampleId; private String sampleName; }

SampleDao.java

ackage group.study.dev.dao.sample; import java.util.List; import org.apache.ibatis.annotations.Mapper; import group.study.dev.dto.sample.SampleDto; @Mapper public interface SampleDao { public List<SampleDto> selectAll(); public SampleDto selectOne(String sampleId); public boolean insert(String sampleId, String sampleName); public boolean updateOne(SampleDto sampleDto); public boolean deleteOne(String userId); }

SampleMapper.xml

<?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"> <mapper namespace="group.study.dev.dao.sample.SampleDao"> <resultMap type="group.study.dev.dto.sample.SampleDto" id="user"> <id column="sample_id" property="sampleId" /> <id column="sample_name" property="sampleName" /> </resultMap> <select id="selectAll" resultType="group.study.dev.dto.sample.SampleDto"> select sample_name, sample_id from public.sample_table where sample_id = 'S003'; </select> <select id="selectOne" parameterType="string" resultType="group.study.dev.dto.sample.SampleDto"> select sample_id as sampleId, sample_name as sampleName from sampletable where sample_id = #{sampleId} </select> <insert id="insert" parameterType="group.study.dev.dto.sample.SampleDto"> insert into sampletable(sample_id,sample_name) values (#{sampleId}, #{sampleName}) </insert> </mapper>

search.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String method = request.getMethod(); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>hoge</title> </head> <body> <% if ("GET".equals(method)) { %> <h1>HOME</h1> <div> <form method="post" action="/web_sample/search/result"> <input type="text" name="sampleId" /> <button type="submit" value="submit">送信</button> </form> </div> <div> <form method="post" action="/web_sample/search/insert"> <button type="submit" value="insert">新規登録</button> </form> </div> <% } else { %> <h1>検索結果</h1> <table border="1" bordercolor="#333333"> <tr> <th>ID</th> <th>NAME</th> </tr> <tr> <td><c:out value="${list.sampleId}" /></td> <td><c:out value="${list.sampleName}" /></td> </tr> </table> <% } %> </body> </html>

insert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>新規登録画面</title> </head> <body> <form method="post" action="/web_sample/insert"> ID:<input type="text" name="sampleId"> NAME:<input type="text" name="sampleName"> <button type="submit" value="登録">登録</button> </form> </body> </html>

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

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

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

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

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

A-pZ

2020/09/04 04:25

mapperインタフェースの不備ではないでしょうか
Rivermouth

2020/09/04 04:59

SampleDaoに不備があるという事でしょうか?
Rivermouth

2020/09/04 05:06

単純にsampleIdとsampleNameを入力し、それをSQL文に渡し、insertを実行したいだけなのですが、どこが間違えているのか分からないので、アドバイスを頂けないでしょうか?
A-pZ

2020/09/04 06:27

なるほど。 他の確認をしたいのですが、同じマッピング定義をしているSELECTなどは動作している、で間違いないでしょうか?
Rivermouth

2020/09/04 06:48

すみません。SampleDaoの public boolean insert(String sampleId, String sampleName); をpublic void insert(SampleDto sampleDto);に変更し、それに合うように他も変更したら、うまくやりたいことができました。ただ、なぜこのように変更したら動くようになったのかは分かりません。。
A-pZ

2020/09/04 06:56

なるほど、これは罠っぽいところですが、、、MyBatisは変数のマッピング定義を、メソッドの引数から自動的に探し当てるのですが、String型を渡した場合は直接探せません。このとき、MyBatisの@Paramで、SQL内のパラメータ名を直接指定する方法があります。SampleDtoを指定したときに、SQLで指定した同じ変数名のフィールドを自動的に探すようMyBatisが動きます。わかりにくい説明で失礼しました。
Rivermouth

2020/09/04 09:01

public boolean insert(String sampleId, String sampleName); のように引数をString型で書いてしまうと、MyBatisは自動的にマッピングする事はできないので、MyBatisの@ParamでSQL内のパラメータ(sampleId, sampleName)を直接指定する必要があるという事ですね。 ただ、SampleDtoクラスの変数を引数とした場合には、MyBatisがSQLで指定したパラメータ(sampleId, sampleName)を自動的に探してくれるという事でしょうか?
guest

回答2

0

The octordle game is still available for free to provide a source of light enjoyment; if you do play, please provide feedback to help me improve it.

投稿2023/05/23 08:42

fondemi

総合スコア20

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

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

0

質問の内容から、あらためて回答に記載します。

Mybatisのデフォルトの動作としては、メソッドに指定したクラスの子要素の名前から値を取得します。その際、getXxxx の名前のメソッドから値を取得しようと試みます。

ところが型がStringの (例えば sampleId )の場合、getSampleId() メソッドを探索しますが、しかしString型にはそのようなメソッドはないため、Mybatisは他にアクセス可能なフィールドして候補に出すのが、arg1(2番目の引数), arg0(1番目の引数), param1(引数の1番目を示す別の名前。, param2(2番目の引数)を調べます。

これらの値はSQL内で名前の指定を省略する際にに使えますが、しかしこれはあまり良い方法ではありません。
なぜなら、もしSQL定義やメソッドの引数が変わったときに、このバインド変数が名前で指定していないと、この順番の数値を変えなければならなくなり、これはメンテナンス性に乏しくなるため適していません。

これを回避するためにも、Mybatisのアノテーションである @Param で名前を指定するか、ないしは 何らかのValueObjectに変数を持たせて、その変数名を指定する方法が一番良いです。

投稿2020/09/06 06:12

A-pZ

総合スコア12011

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問