商品管理のデモ

公開日: 2026-07-30 20:15 更新日: 2026-07-30 20:15 1363文字 7 min read ... ページビュー

この記事では、Spring Boot、MyBatis-Plus、My SQL、Druidに基づく商品とカテゴリページング関連クエリの実装を示します。リバースエンジニアリングによりベースコードを生成し、ページングプラグインを設定し、Mapperで商品表とカテゴリテーブルの関連クエリを実装し、最終的にテストを通じてページング機能と関連フィールドの正しさを検証し、SQLマッピングエラー、ページングが有効でない、フィールドの曖昧さなどの一般的な問題を指摘します。

商品管理のデモ

この例では、Spring Boot、MyBatis-Plus、My SQL、およびDruidを使用して、商品とカテゴリのページング関連クエリを実装します。

1.データベースの準備

java2601データベースを作成し、goods.sqlから表構造とテストデータをインポートします。例では、次のテーブルが少なくとも2つ必要です。

  • goods:商品表。
  • category:商品カテゴリー表。

商品テーブルのcidは、関連付けられたカテゴリテーブルのcidに使用されます。

2. Spring Bootプロジェクトの作成

依存性の導入

pom.xmlには以下の依存が加えられている。バージョン番号は、コースプロジェクトのSpring Bootバージョンに従って一括管理できます。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
        <version>3.5.6</version>
    </dependency>

    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-3-starter</artifactId>
        <version>1.2.23</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

データソースおよびMyBatis-Plus

application.ymlでデータベース接続とMyBatis-Plusを構成するには、次の手順に従います。

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://localhost:3306/java2601?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
      initial-size: 2
      min-idle: 3
      max-active: 10
      max-wait: 10000

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  type-aliases-package: com.hyxy.goods.po
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      id-type: auto
      # table-prefix: tb_
      # logic-delete-field: deleteFlag
      # logic-delete-value: 1
      # logic-not-delete-value: 0

開発環境ではユーザー名とパスワードを直接書き込むことができ、実際のプロジェクトでは環境変数または外部設定を介してデータベース資格情報を管理する必要があります。

ディレクトリ構造を作成する

コントローラ、ビジネス層、データアクセス層、およびエンティティークラスごとに下請けすることをお勧めします。

image-001
image-001

リバースエンジニアリングによるベースコードの生成

MyBatis-Plusコードジェネレータを使用して、エンティティークラス、Mapper、Service、および対応するXMLファイルを生成できます。

image-002
image-002

ビルド後にパッケージ名、テーブル名、プライマリキーポリシー、ビルドファイルの保存場所をチェックする必要があります。すべての構成が現在のプロジェクトに準拠していると直接仮定することはできません。

3. Mapperインターフェースのスキャン

起動クラスで@MapperScanを使用して、Mapperインターフェイスを統合スキャンするには:

package com.hyxy.goods;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.hyxy.goods.mapper")
public class GoodsApplication {

    public static void main(String[] args) {
        SpringApplication.run(GoodsApplication.class, args);
    }
}

@MapperScanを使用すると、通常、各 Mapperインターフェイスに@Mapperを追加する必要はありません。2つの方法のいずれかを選択できます。

package com.hyxy.goods.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hyxy.goods.po.Category;

public interface CategoryMapper extends BaseMapper<Category> {
}
package com.hyxy.goods.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hyxy.goods.po.Goods;

public interface GoodsMapper extends BaseMapper<Goods> {
}

四、ページングプラグインの設定

configパッケージで構成クラスを作成し、MyBatis-Plusページングインターセプタを登録するには:

package com.hyxy.goods.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

この教材はMyBatis-Plus 3.5.6を使用します。3.5.9以降にアップグレードすると、ページングプラグイン関連のパーサーはオプションの依存関係に分割され、対応するバージョンの公式指示に従ってモジュールを補足する必要があります。

五、商品とカテゴリーの関連検索の実現

商品を照会すると、所属カテゴリ名も同時に表示されます。

商品エンティティークラスへの非表字セグメントの追加

cnameは関連クエリからのもので、goodsテーブルの実際のフィールドではないため、@TableField(exist = false)が必要です。

package com.hyxy.goods.po;

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;

@Data
public class Goods {

    // 省略 goods 表中的其他字段

    @TableField(exist = false)
    private String cname;
}

Mapperインターフェイスでのクエリ·メソッドの宣言

ページングパラメータはメソッドパラメータのリストの前に配置し、クエリ条件は@Paramで明示的に名前を付けます。

package com.hyxy.goods.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hyxy.goods.po.Goods;
import org.apache.ibatis.annotations.Param;

public interface GoodsMapper extends BaseMapper<Goods> {

    IPage<Goods> selectJoinCategory(
            Page<Goods> page,
            @Param("gname") String gname,
            @Param("cid") Integer cid
    );
}

Mapper XMLの作成

resources/mapperディレクトリにGoodsMapper.xmlを作成します。namespaceは、Mapperインタフェースの完全修飾クラス名と一致している必要があります。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hyxy.goods.mapper.GoodsMapper">

    <select id="selectJoinCategory" resultType="Goods">
        SELECT
            g.gid,
            g.gname,
            g.price,
            g.stock,
            g.cid,
            g.sales,
            g.onsale,
            g.createtime,
            c.cname AS cname
        FROM goods AS g
        LEFT JOIN category AS c ON g.cid = c.cid
        <where>
            <if test="gname != null and gname != ''">
                AND g.gname LIKE CONCAT('%', #{gname}, '%')
            </if>
            <if test="cid != null">
                AND g.cid = #{cid}
            </if>
        </where>
        ORDER BY g.gid DESC
    </select>

</mapper>

2つのテーブルに同じフィールドが存在する場合の曖昧さを避けるため、関連クエリ内の列にテーブルエイリアスを追加する必要があります。

VI.試験の準備

Spring Bootテストクラスを使用してページングと関連付けのクエリ結果を検証するには、次の手順に従います。

package com.hyxy.goods;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hyxy.goods.mapper.GoodsMapper;
import com.hyxy.goods.po.Goods;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class GoodsApplicationTests {

    @Resource
    private GoodsMapper goodsMapper;

    @Test
    void selectJoinCategory() {
        Page<Goods> page = new Page<>(1, 3);

        IPage<Goods> pageResult = goodsMapper.selectJoinCategory(
                page,
                null,
                null
        );

        pageResult.getRecords().forEach(System.out::println);
        System.out.println("总记录数:" + pageResult.getTotal());
        System.out.println("总页数:" + pageResult.getPages());
    }
}

テストでは、コンソールがページング制限付きのSQLを生成していることを確認し、各商品オブジェクトにcnameが正しくマッピングされていることを確認します。

VII.よくあるご質問

Mapperメソッドで対応するSQLが見つかりませんでした

以下をチェックする。

  • XMLのnamespaceがMapperインタフェース完全修飾名と一致するかどうか。
  • <select>idがインタフェースメソッド名と一致するかどうか。
  • mapper-locationsがXMLファイルのあるディレクトリを上書きするかどうか。

ページングが有効ではない

MybatisPlusInterceptorPaginationInnerInterceptorが登録されていることを確認し、ページングパラメータがMapperメソッドのパラメータリストの前にあることを確認します。

カテゴリ番号の条件がエラーまたは問合せ結果の例外

マルチテーブル·クエリでg.cidを使用する場合は、テーブル別名なしでcidを直接書き込まないでください。

気に入ったならばコメントを残してくださいね~

... ページビュー
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka