目次
(1) springbootプロジェクトの作成とデータベースの作成
(3) MySQLテーブルはSpring Boot(エンティティ層)にバインドされています
(4) springboot は mybatis-plus (データ層) にバインドされています
(5) データ層を論理的なビジネスに加工(サービスサービス層)
5.2 組み込みの追加、削除、変更、およびクエリ メソッド インターフェイス IUserService を作成および取得する
5.4 サービス層合成ロジック業務UserServiceImplの書き込み
6.2 ビジネス層を呼び出す UserController クラスを作成する
1. はじめに
この記事では、mybatis-plus を springboot を介して統合し、バックエンドでデータベースの追加、削除、変更、クエリを実現し、フロントエンドの URL に応答して、フロントエンドがデータを取得できるようにします。mybatis-plus テクノロジーは、煩雑なコード操作を簡素化し、追加、削除、変更、確認のための組み込みステートメントを備えており、直接呼び出してデータベースの追加、削除、変更、確認を実現します。SQL インジェクションもある程度防ぐことができます。欠点は、十分な柔軟性がないことですが、この柔軟性の問題を補うコードを自分で作成することもできます。
動画解説
Springboot は、mybatis プラスの追加、削除、変更、クエリを統合して、すぐに開始できるようにします_哔哩哔哩_bilibili
2. 準備作業
(1) springbootプロジェクトの作成とデータベースの作成
1. Spring Bootプロジェクトの導入と作成方法: SpringBoot プロジェクトの簡単な作成方法(最初のプログラムの動作含む)
2. MySQL データベースを作成し、新しいテーブルを作成する詳細な手順:
3. プロジェクトの構成
(1) Pom.xl は関連する依存関係をインポートします
必要な依存関係がいくつかあります
1. Web 依存関係。これは作成時に追加されているため、インポートする必要はありません (確認してください)。
2. Lombok 依存関係。これは作成時に追加されているため、インポートする必要はありません (確認してください)。
3. mybatis-plus の依存関係 (出典 baomidou)
4.mysqlの依存関係
5.ドルイドの依存関係 (出典 Alibaba Druid)
6. swagger2 依存関係 (これにより、アノテーション @ApiModelProperty が使用可能になります)
1.依存関係をインポートする
関連する依存関係を pom.xml ファイルにインポートします。依存関係が正常に追加されない場合は、独自の Maven 構成の問題を確認する必要があります。
メイブンのソリューション:
<!--新加入的依赖1-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!--新加入的依赖2-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!--新加入的依赖3-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<!--新加入的依赖4 @ApiModelProperty这个才能用-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
今すぐ:
(2) ymlファイルに接続データベースを設定する
2.ymlファイルを設定する
アプリケーション構成ファイルのサフィックスをわかりやすくするために yml に変更し、データベースに接続するための構成を記述してデータベースとの関連付けを確立します。特定のポート番号はデフォルトでは 8080 ですが、ポート 80 に変更しました。
ここの2行目、7行目、8行目、9行目は独自のものに変更する必要があります。
server:
port: 80
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dndata?serverTimezone=GMT%2b8
username: root
password: 123456
4. コードの書き方
データベース表示
先行上映プロジェクト!!!
(3) MySQLテーブルはSpring Boot(エンティティ層)にバインドされています
なぜこのクラスを作成するのでしょうか?
このステップはデータベースフィールドとバックエンドコードをバインドすることであることが理解できます。
3.1 エンティティパッケージの作成
プロジェクトの下に新しいエンティティ パッケージを作成し、新しいクラスを作成します。クラスの名前はUserです
命名元: クラス名はデータベースのテーブル名と同じですが、最初の文字は大文字にする必要があり、属性クラスはデータベース テーブルに対応します。
3.2 User クラスを作成する
このエンティティ クラスの属性はデータベースのフィールドに対応する必要があります。
コメントを見ながら書くのはとても簡単で、下部のコメントでは各コメントの役割も説明されています
ユーザークラス
package com.example.mybatis.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/*
* 1.使用@Data注解
* 2.使用注解@TableName(value = "user") -----user这个是对应数据库的表名
* 3.编写和数据库字段对应的属性
* 4.加上文档注解@ApiModelProperty("用户的id")---里面的文字是相当于给自己看的备注
* 5.使用@TableId(value = "id", type = IdType.AUTO) //作用是标明当前属性主键,并且type = IdType.AUTO这个代表id自增
* */
@Data //1
@TableName(value = "user") //2
public class User {
@ApiModelProperty("用户的id") //4
@TableId(value = "id", type = IdType.AUTO) //5
private Integer id; //3
@ApiModelProperty("用户名") //4
private String username; //3
@ApiModelProperty("密码") //4
private String password; //3
}
/*
* 注解的解释
* @Data:注解是这个来源于lombok,内置了set、get、ToString等属性类里面我们需要写的东西,就不用我们写了
* @TableName:注解是 MyBatis-Plus 框架中的一个注解,用于标识实体类与数据库表之间的映射关系。
* 它的作用是告诉 MyBatis-Plus 框架这个实体类对应哪个数据库表。
* @ApiModelProperty:注解是 Swagger 框架中的一个注解,
* 用于给实体类的属性(字段)添加额外的文档说明,以便在生成 API 文档时提供更详细的描述和信息。
* Swagger是一个用于生成和展示 API 文档的工具,可以帮助开发人员更好地理解和使用 API。
*
* @TableId 注解用于标识表的主键字段,帮助 MyBatis-Plus 框架了解哪个属性在数据库中扮演主键的角色,
* 以及如何生成主键值。这对于数据库操作和映射非常重要。
* */
(4) springboot は mybatis-plus (データ層) にバインドされています
なぜこのインターフェースを作成するのでしょうか?
Springbootで取得した属性クラスをmybatis-plusにバインドし、このインターフェースを他のレイヤーにバインドするためです。
4.1 マッパーパッケージの作成
プロジェクトの下にマッパーパッケージを作成します
4.2 UserMapper インターフェイスの作成
インターフェースUserMapperを作成します。命名ソースは属性クラス名 + マッパー、キャメルケースの名前は付けられます。
この時点では、mybatis-plus に組み込まれている最も独創的な追加、削除、変更、クエリを使用できますが、柔軟性が十分ではなく、最も単純な追加、削除、変更、クエリしか実行できません。
UserMapperクラス
package com.example.mybatis.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatis.entity.User;
import org.apache.ibatis.annotations.Mapper;
/*
* 1.使用@Mapper注解 ,代表这个接口被mybatis接管
* 2.继承BaseMapper<属性类名>
* */
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
/*
* @Mapper:注解是 MyBatis 框架中的一个重要标识,
* 它定义了 Mapper 接口,用于与数据库交互。使用这个注解可以简化数据库操作代码,并提供一些优势,
* 如自动生成 SQL、类型安全性等。
* */
(5) データ層を論理的なビジネスに加工(サービスサービス層)
なぜこの層なのか?
回答: この層はサービス層と呼ばれ、ビジネス層とも呼ばれます。上記のデータは完全にバインドされているため、追加、削除、変更、確認が可能ですが、最も原始的なものに過ぎず、カプセル化方法もほとんどなく、さらに複雑なページ分割クエリ方法もないため、使用する必要があります。この層では、他の人がパッケージ化したより良いメソッドやさまざまなロジックをここに書くことができます
5.1 サービスパッケージの作成
5.2 組み込みの追加、削除、変更、およびクエリ メソッド インターフェイス IUserService を作成および取得する
国会議員関係者
なぜこのインターフェイスを作成するのでしょうか?
MP (mybatis-plus) パッケージ化されたインターフェイスを継承し、必要な追加、削除、変更、およびチェックのすべてのメソッドがここに書かれています。このインターフェイスは、後の制御層メソッド。
追加、削除、変更、確認の方法が表示されないのはなぜですか?
MP によってこの IService インターフェイスにカプセル化されているため、
この IUserService インターフェイスをサービス パッケージの下に作成します
IUserServiceインターフェイス
package com.example.mybatis.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mybatis.entity.User;
//1.继承IService这个接口,<实体类名>
public interface IUserService extends IService<User> {
}
/*
IService接口里面有mybatis-plus封装好我们经常会用到的增删改查的一些方法
里面本质上还调用了上数据层mapper,是对mapper的封装优化
*/
5.3 独自に定義した UserService を作成する
この UserService クラスをサービス パッケージの下に作成します
MP公式 + カスタムロジック + データレイヤーを自分で呼び出す ---独自
5.2 すでに追加、削除、変更、確認するメソッドがあるのに、なぜこれを書くのでしょうか?
回答: 5.2 のインターフェイスは MP の組み込み CRUD メソッドを直接使用しており、通常どおり使用できますが、データ暗号化、データ検証、その他の論理処理などの組み込み CRUD を最適化したいと考えています。
また、これらの組み込みの追加、削除、変更、クエリを自分のニーズに応じてネストまたはアップグレードしてカスタマイズしたいと考えていますか?
全体として、このクラスの最下層は 5.2 インターフェイスの実装クラスです。つまり、このクラスには5.2 インターフェイスが含まれています。また、マッパー データ レイヤーへのメソッドと呼び出しをカスタマイズすることもできます。これらは 5.2 インターフェイスのメソッドよりも豊富で、煩雑な論理データ レイヤーにカスタム処理を追加するために使用されます。
package com.example.mybatis.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mybatis.entity.User;
import com.example.mybatis.mapper.UserMapper;
import org.springframework.stereotype.Service;
/*
* 1.使用@Service注解,要不然咱自己定义的类,谁知道他是服务层
* 2.继承ServiceImpl,这个是MP内置增删改查接口的一个实现,牛逼的是还能自定义直接调取数据层的数据
* 3.定义需要的方法,根据自己的需要定义,定义MP内置里面没有的
* */
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
//下面这个方法是对数据库操作时候多加了一层封装,用不到去掉也没有影响。
// 、作用可以定义密码加密、数据校验、关联数据处理、日志记录、通知或触发事件等
public boolean saveUser(User user){
return saveOrUpdate(user);
}
}
5.4 サービス層合成ロジック業務UserServiceImplの書き込み
この UserServiceImpl クラスをサービス パッケージの下に作成します
1.なぜこの実装クラスを作成するのでしょうか?
ここでは、ログイン、検証、権限などの論理サービスを形成するために 5.2 および 5.3 のメソッドが使用されているためです。
2. 5.3 を直接使用しないのはなぜですか。そこで論理メソッドを定義することは可能ではないでしょうか。
5.3 カスタム クラスは主に、データ、パスワード暗号化、およびこれらの低レベル メソッドの検証に対するいくつかの低レベル メソッドを処理するために使用されます。そしてこのクラスは、ログインや権限の検証など、5.3 の小さなメソッドによってグループ化されたビジネスを定義します。
全体として、これがビジネスの形成です。5.3 (メイン) + 5.2 (セカンダリ) + いくつかのロジックを呼び出してビジネスを形成します。
package com.example.mybatis.service.Impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mybatis.entity.User;
import com.example.mybatis.mapper.UserMapper;
import com.example.mybatis.service.IUserService;
import org.springframework.stereotype.Service;
/*
* 1.@Service--------使用@Service注解,让人知道这个是服务层
* 2.extends ServiceImpl<UserMapper, User> ---继承和UserService类里面继承的方法一样,
* 但是这里面还偷偷藏了UserService自定义的方法
* 3.implements IUserService---实现接口
* */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
//登录业务
//登录校验业务
//创建用户检查业务等等
}
5.5 ストーリー解釈サービス層のインターフェイスとクラス
非常に多くのサービス層間の関係は何ですか。これが解釈です
これら 3 つはすべてサービス層であり、呼び出すためにどれを選択する必要があるかによって異なります。
5.2 (The Landlord's Silly Son) は、 MP に組み込まれている一般的に使用される CRUD をネストするサービス インターフェイスです
家主の MP の愚かな息子のように、彼は何も持たず、父親が書いたメソッドを呼び出すだけですが、一般的に使用される CRUD のほとんどを持っている良い父親がいて、制御層は彼を直接呼び出すことができます
5.3 (サーバントの息子) は、組み込み CRUD + 独自開発の呼び出しメソッドでネストされたサービス クラスです。
このクラスには家主の愚かな息子と同じ組み込みメソッドがありますが、より進歩的であり、より強くなりたいと考えているため、基盤となるパスワード暗号化、データ検証、関連するデータ処理、ログ記録、通知などの多くのメソッドをカスタマイズして練習することができます。イベントをトリガーし、データ層と直接対話します。
このクラスは素晴らしいですか?それは完璧ですか?これらのメソッドはさまざまなロジック サービスを形成するために父親によって使用されるため、制御層は彼を呼び出しません。
5.4 (Servant) は、 5.2 Landlord’s Silly Son を実装し、5.3 Pro-Son も実装するサービス クラスです。統一
ここでは様々なビジネスが実現されています。5.3方式で構成されるログイン業務や権限検証業務など、ここに書けるものはすべて業務です。
お父さんサービスクラスです。それで十分です。ただし、これはインターフェイスではないため、制御層から直接呼び出すことはできません。設計の依存関係反転原則に従って、インターフェイスを呼び出すことで分離の効果を得ることができます。しかし、これらの記述方法を無駄にすることはできず、5.2 地主の家の愚かな息子のインターフェイスを継承して、これらのロジックをすべて引き出すのを手伝ってもらうしかありません。コントローラーコンストラクターを介した注入
(6) サービス層の皇帝を呼び出す
なぜこの層なのか?
コントロール層というからには皇帝です。何をしたいですか、教えてください。サービス層にロジック ビジネスをやらせます。
必要なデータや論理ビジネスはすべて私の制御層を通過する必要があります。取得するように私に依頼してください。
サービス層がすべて揃ったので、なぜあなたが必要なのでしょうか?
サービス層の業務はロジック業務のみで、輸出入などの通常業務となると私がやらなければなりません。
サービス層ではどれを呼び出す必要がありますか?
このインターフェイスを見つけます ----- IUserService
これは、家主 MP の CRUD を継承するだけでなく、実装クラスのすべてのビジネス ロジックも継承します。
6.1 コントローラーパッケージの作成
6.2 ビジネス層を呼び出す UserController クラスを作成する
最初の理解方法
メソッドを追加、削除、変更、確認するための一般的な式:
1
public 2 カスタム クラス名 ( データ型 4 of 3 4 )
現在のグローバル サービス クラスを返します。サービス クラスのメソッド ( 4 )
サービス内のメソッド: すべてチェック: list 、 ID によるクエリ: getById 、追加および変更: saveOrUpdate 、削除: RemoveById
1.通常、データ クエリには @GetMapping が使用され、データ変更操作には @PostMapping が使用され、削除には @PostMapping が使用されます。
フロントエンド:IDに基づいて削除またはクエリを実行したい、
バックエンド: その後、ID を取得して渡すだけで、残りは私に任せてください。コメントの後に ("/{id}") を追加するだけです。すべてに直接クエリを実行する場合は、ID を渡す必要さえありません。
フロントエンド:データフィールドがたくさんあるので、変更したり追加したりしたい
バックエンド: それをリクエストヘッダーに入れることはできません。安全ではありません。ポストリクエストを使用し、リクエスト本文に入れてください。
2.これはバックエンドから提供されることを希望するデータです。追加、削除、または変更が成功したかどうかを教えてください。そのため、ブール値を使用します。クエリの場合は、クエリで何が見つかったのかを伝える必要があります。属性クラス名を使用するだけです。
3.これは1に関連します。投稿リクエストでは @RequestBody が使用され、その他のリクエストでは @PathVariable が使用され、リクエスト ヘッダーの ID が JSON に解析され、バックエンドに送信されます。
4.これは、 1.フロントエンドによって送信されるデータ、ここで使用されるデータにも依存します。何も書かれていないのがすべて --- は属性クラス名です
2番目の理解方法
@Note ---これは、フロントエンドがバックエンドに与えたい送信定義です。
public は、バックエンドがフロントエンドに カスタム クラス名を 付けることを要求します (ポスト アノテーションは @RequestBody を使用します。それ以外の場合、 データ型は フロントエンドに対応します)。
現在のグローバル サービス クラスを返します。サービス クラス内のメソッド (データ型はフロントエンドから渡されたものに対応します)
package com.example.mybatis.controller;
import com.example.mybatis.entity.User;
import com.example.mybatis.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/*
* 1.@RestController---添加控制层注解,让springboot知道这是控制层
* 2.@RequestMapping("/user")--- user代表默认访问路径在/user下可以访问
* */
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired //4.自动注解
private IUserService userService; //3.定义调用服务层的接口
/*
*5.查询全部的数据
5.1使用 @GetMapping注解,没有括号不定义就代表使用get方式,url访问上面默认路径/user
5.2查询全部肯定使用的方法是集合<实体类>方式去自定义一个findAll方法名
5.3再用服务层返回一个集合就好了
*/
@GetMapping
public List<User> findAll(){
return userService.list();
}
/*6.根据id查询一条
6.1查询使用@GetMapping注解,既然是根据id查询,那么就要把id传给后端。但是get是不能传递请求体的,
只能传递请求头,那么只能把这个值放在请求头上面,就是这样("/{id}")放
6.2自定义一个方法名(@PathVariable 类型 id),为什么要用id呢?这不是你前端这个"/{id}"说要吗
@PathVariable这个注解的方式就是把请求头中的数字以Json传递给后端去识别,后端不能直接识别url上面的数字
6.3 再用服务层返回获取id的方法就好了
*/
@GetMapping("/{id}")
public User findById(@PathVariable Integer id){
return userService.getById(id);
}
/*7.新增和修改
需要传递body传递全部参数,
7.1对数据的操作使用@PostMapping,括号里面不定义就代表使用post方式,url访问上面默认路径/user
7.2自定义一个方法,括号里面使用(@RequestBody 属性类 自定义属性昵称)
为什么这里用Boolean而不是User,因为对数据的修改希望返回的结果就两种,要么成功,要么失败,所以用布尔值
@RequestBody这个注解用于映射传递来的json参数映射为到java对象里面,特别是适用与请求体的参数
7.3然后再用服务层返回获取的saveOrUpdate方法就好了
*/
@PostMapping
public Boolean add(@RequestBody User user){
return userService.saveOrUpdate(user);
}
/*
8.删除的方法
8.1使用@DeleteMapping注解,因为删除只需要传递一个特定的id给后端就可以了,
所以括号里面使用("/{id}")
8.2创建一个自定义的方法,删除也是要么成功要么失败,所以使用Boolean作为返回值
@PathVariable在上面已经解释过了
8.3再用服务层次返回对应的方法,括号里面的值就是上面括号里面需要的值
* */
@DeleteMapping("/{id}")
public Boolean delete(@PathVariable Integer id){
return userService.removeById(id);
}
}
/* //修改数据的另一种写法
@PostMapping("/update")
public Boolean update(@RequestBody User user){
return userService.updateById(user);
}*/
ここまででコードは全て記述できましたので、分からない場合は事前に上記のコードにアクセスして図とコメントの説明をしておいてください。
MySQL ---> 属性クラス ---> データ層マッパー インターフェース ---> ビジネス サービス層 サービス インターフェース ---> 制御層 (フロントエンドとバックエンドの相互作用)
仕様によれば、属性クラスを除き、レベルを越えてインターフェイスを呼び出すことはできません。
5. フロントエンドリクエストテスト
テスト ツールは、組み込みのアイデアを使用することも、postman やその他のリクエスト テスト ツールを使用することもできます。
具体的な試験方法