商品管理のデモ
この例では、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開発環境ではユーザー名とパスワードを直接書き込むことができ、実際のプロジェクトでは環境変数または外部設定を介してデータベース資格情報を管理する必要があります。
ディレクトリ構造を作成する
コントローラ、ビジネス層、データアクセス層、およびエンティティークラスごとに下請けすることをお勧めします。

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

ビルド後にパッケージ名、テーブル名、プライマリキーポリシー、ビルドファイルの保存場所をチェックする必要があります。すべての構成が現在のプロジェクトに準拠していると直接仮定することはできません。
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ファイルのあるディレクトリを上書きするかどうか。
ページングが有効ではない
MybatisPlusInterceptorとPaginationInnerInterceptorが登録されていることを確認し、ページングパラメータがMapperメソッドのパラメータリストの前にあることを確認します。
カテゴリ番号の条件がエラーまたは問合せ結果の例外
マルチテーブル·クエリでg.cidを使用する場合は、テーブル別名なしでcidを直接書き込まないでください。
気に入ったならばコメントを残してくださいね~