Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Mybatis-spring 更新処理ができない

解決したいこと

商品情報の更新処理をmybatisを用いて行いたい。

発生している問題・エラー

Mapper method 'com.example.demo.repository.ProductMapper.update attempted to return null from a method with a primitive return type (int).

エラーの発生し、更新処理が行われない。

わかる人がいれば教えてただきたいです。
よろしくお願いします。

該当するソースコード

java 8
spring 2.7.0
mybatis-spring-boot-starter 2.2.2
thymeleaf

Entity

@Data
public class Product {

    private int id;

    private String name;
}

Form

@Data
public class ProductForm {

    @NotNull(message = "製品名/単位を入力してください")
    @Size(min = 1, max = 100, message = "100文字以下で入力してください")
    private String name;
}

Mapper

public interface ProductMapper {

    @Select("UPDATE products SET name = #{name} WHERE id = #{id}")
    int update(Product product);
}

Service

@Service
@RequiredArgsConstructor
public class ProductSericeImpl implements ProductService {

    private final ProductMapper productMapper;

    @Override
    public void update(Product product) {
        productMapper.update(product);
    }

}

Controller

@Controller
@RequiredArgsConstructor
public class ProductController {

    private final ProductService productService;
    
@PostMapping("/update")
    public String update(
        @Validated @ModelAttribute ProductForm productForm,
        BindingResult result,
        Model model,
        RedirectAttributes redirectAttributes
        ) {

        Product product = makeProduct(productForm);

        if (result.hasErrors()) {
            model.addAttribute("title", "商品情報 編集画面");
            model.addAttribute("product", productForm);

            return "product/edit";
        } else {

            productService.update(product);
            redirectAttributes.addFlashAttribute("complete", "変更が完了しました");

            return "redirect:/product/list";
        }

private Product makeProduct(ProductForm productForm) {
        Product product = new Product();

        product.setName(productForm.getName());

        return product;
    }

}

thymeleaf

<form th:action="@{/product/update}" method="post" th:object="${productForm}">
        <div class="mt-3">
            <label for="productInput" class="form-label">商品名/単位</label>
            <input type="text" name="name" class="form-control" id="name" th:value="*{name}">
            <div class="text-danger mb-4" th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></div>
        </div>
        <div class="text-center mt-3">
            <button type="submit" class="btn btn-primary">保存</button>
            <a class="btn btn-secondary" th:href="@{/product/list}">キャンセル</a>
        </div>
    </form>

自分で試したこと

Mapper updateの返り値をvoidに変更してみたが、その場合エラーは発生しなかったものの更新処理が行われなかった。

1

1Answer

@update("UPDATE products SET name = #{name} WHERE id = #{id}")
int update(Product product);

ですかね?
idでの検索ならbooleanで受けても良さそうです。

1Like

Comments

  1. @changshangq

    Questioner

    回答ありがとうございます。上記の部分を変更したところエラーが解消されました。
    しかし、データの更新が行われていない状態が発生しています。何か考えられる原因はあるでしょうか。
    ちなみにデータベースはmysqlを使用しています。
  2. @changshangq

    Questioner

    デバッグを実行した結果、FormからEntityにデータを詰め替える際にidが渡されていないことがわかりました。
    それを修正したところ、無事更新処理が出来ました。

Your answer might help someone💌