目次
ActiveRecord の概要
ActiveRecord (Active Record、AR と呼ばれる) は、モデル クラスがリレーショナル データベースのテーブルに対応し、モデル クラスのインスタンスがテーブル内のレコードの行に対応することを特徴とするドメイン モデル パターンです。ActiveRecord は、データ オブジェクトに対して CRUD 操作を実行することにより、解釈された動的言語 (PHP、Ruby など) で広く愛されてきました。Java は準静的 (コンパイル済み) 言語として、ActiveRecord の優雅さを賞賛することしかできないため、MP は AR の道についてもいくつかの調査を実行しました。必要なのは、エンティティ クラスに Model クラスを継承させ、次のメソッドを実装することだけです。主キーを指定して開く ARツアー。
例証します:
- エンティティ クラスは、強力な CRUD 操作を実行するためにモデル クラスを継承するだけで済みます。
- プロジェクト内の対応するエンティティに注入する必要がある BaseMapper
ActiveRecord モードの CRUD には、
対応するオリジナルのマッパーがあり、baseMapper を継承し、この AR モードを使用できる必要があります。
ActiveRecordの実装
次に、ActiveRecordの実装手順を見てみましょう。
【1 】エンティティクラスにModel<User>クラスを継承させる
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User extends Model<User> {
private Long id;
private String name;
private Integer age;
private String email;
}
Model クラスには、追加、削除、変更、確認のためのメソッドがいくつか用意されていることがわかります。そのため、エンティティ クラス オブジェクトを直接使用して、これらの追加、削除、変更、確認メソッドを呼び出すことができます。これにより、操作の構文が簡素化されますが、最下位層は依然として UserMapper を必要とするため、永続化層インターフェイスは省略できません
[2] ActiveRecordモードの追加、削除、変更、クエリのテスト
データの追加
@Test
void activeRecordAdd(){
User user = new User();
user.setName("wang");
user.setAge(35);
user.setEmail("[email protected]");
user.insert();
}
データを削除する
@Test
void activeRecordDelete(){
User user = new User();
user.setId(8L);
user.deleteById();
}
データを変更する
@Test
void activeRecordUpdate(){
User user = new User();
user.setId(6L);
user.setAge(50);
user.updateById();
}
クエリデータ
@Test
void activeRecordSelect(){
User user = new User();
user.setId(6L);
User result = user.selectById();
System.out.println(result);
}
SimpleQuery の概要
SimpleQuery は、selectList クエリの結果を Stream でカプセル化できるため、指定された結果を返すことができ、API の呼び出しが簡素化されます。
SimpleQueryの実装
リスト
@SafeVarargs
public static <E, A> List<A> list(
LambdaQueryWrapper<E> wrapper,
SFunction<E, A> sFunction,
boolean isParallel,
Consumer<E>... peeks) {
return list2List(Db.list(wrapper.setEntityClass(getType(sFunction))), sFunction, isParallel, peeks);
}
パラメータ:
ラッパー – 条件付きコンストラクター
sFunction – 必須列
isParallel – 並列フロー
ピークかどうか – フォローアップ操作
コレクションのフィールドベースのカプセル化を示します。
@Test
void testList2(){
List<String> names = SimpleQuery.list(
new LambdaQueryWrapper<User>().eq(User::getName, "Mary"),
User::getName,
e -> Optional.of(e.getName()).map(String::toLowerCase).ifPresent(e::setName));
System.out.println(names);
}
地図
@SafeVarargs
public static <E, A, P> Map<A, P> map
(LambdaQueryWrapper<E> wrapper,
SFunction<E, A> keyFunc,
SFunction<E, P> valueFunc,
boolean isParallel,
Consumer<E>... peeks)
{
return list2Map(Db.list(wrapper.setEntityClass(getType(keyFunc))), keyFunc, valueFunc, isParallel, peeks);
}
ラッパーとキーを渡し、条件に従ってデータベースから対応するリストをクエリし、マップパラメータにカプセル化します。
ラッパー
– 条件付きコンストラクター
keyFunc – キー
valueFunc – 値
isParallel – ピークを並列でストリーミングするかどうか
– 可能性のある後続の操作マップにカプセル化するときに必要、渡す必要はありません
すべてのオブジェクトが ID とエンティティの形式で Map コレクションとしてカプセル化されていることを示します。
@Test
void testMap(){
//将所有元素封装为Map形式
Map<Long, User> idEntityMap = SimpleQuery.keyMap(
new LambdaQueryWrapper<>(), User::getId);
System.out.println(idEntityMap);
}
ID とエンティティの形式で単一オブジェクトを Map コレクションとしてカプセル化する方法を示します。
@Test
void testMap2(){
//将单个元素封装为Map形式
Map<Long, User> idEntityMap = SimpleQuery.keyMap(
new LambdaQueryWrapper<User>().eq(User::getId,1L), User::getId);
System.out.println(idEntityMap);
}
デモでは、 IDと名前で構成されるマップのみが必要です
@Test
void testMap3(){
//只想要只想要id和name组成的map
Map<Long, String> idNameMap = SimpleQuery.map(
new LambdaQueryWrapper<>(), User::getId, User::getName);
System.out.println(idNameMap);
}
グループ
デモのグループ化効果
@Test
void testGroup(){
Map<String, List<User>> nameUsersMap = SimpleQuery.group(
new LambdaQueryWrapper<>(), User::getName);
System.out.println(nameUsersMap);
}
同じ名前がグループであり、その名前がマップのキーとして使用され、同じ名前が値として List コレクションに配置されます。