EntityManager:
实体管理器可以对实体进行insert, update, delete, load 等操作
const user = await entityManager.findOne(User, 1);
const entityManager = getManager();
或者
getConnection().manager
实体管理器获取连接:
const connection = manager.connection;
实体管理器获取查询运行器:
const queryRunner = manager.queryRunner;
实体管理器开启事务:
await manager.transaction(async manager => {
})
执行sql:
const rawData = await manager.query(`SELECT * FROM USERS`);
实体管理器创建QueryBuilder:
const users = await manager
.createQueryBuilder()
.select()
.from(User, "user")
.where("user.name = :name", { name: "John" })
.getMany();
实体管理器查询实体是否定义主列:
if (manager.hasId(user)) {
// ... 做一些需要的操作
}
实体管理器获取实体主列属性值:
const userId = manager.getId(user); // userId === 1
实体管理器创建新的实例:
const user = manager.create(User); // same as const user = new User();
const user = manager.create(User, {
id: 1,
firstName: "Timber",
lastName: "Saw"
}); // 和 const user = new User(); user.firstName = "Timber"; user.lastName = "Saw"; 一样
实体管理器将多个实体合并为一个实体
const user = new User();
manager.merge(User, user, { firstName: "Timber" }, { lastName: "Saw" }); // 和user.firstName = "Timber"; user.lastName = "Saw";一样
实体管理器preload
:
const partialUser = {
id: 1,
firstName: "Rizzrak",
profile: {
id: 1
}
};
const user = await manager.preload(User, partialUser);
实体管理器save:
await manager.save(user);
await manager.save([category1, category2, category3]);
实体管理器remove:
await manager.remove(user);
await manager.remove([category1, category2, category3]);
实体管理器插入或插入数据组:
await manager.insert(User, {
firstName: "Timber",
lastName: "Timber"
});
await manager.insert(User, [
{
firstName: "Foo",
lastName: "Bar"
},
{
firstName: "Rizz",
lastName: "Rak"
}
]);
实体管理器更新update:
await manager.update(User, { firstName: "Timber" }, { firstName: "Rizzrak" });
// 执行 UPDATE user SET firstName = Rizzrak WHERE firstName = Timber
await manager.update(User, 1, { firstName: "Rizzrak" });
// 执行 UPDATE user SET firstName = Rizzrak WHERE id = 1
实体管理器delete
:
await manager.delete(User, 1);
await manager.delete(User, [1, 2, 3]);
await manager.delete(User, { firstName: "Timber" });
count, increment, decrement, find, findAndCount, findByIds,findOne,findOneOrFail,
getRepository()
getCustomRepository()
release()
Repository:
作用和EntityManager一样,但操作仅限于具体实体
getRepository()
或者
getConnection().getRepository()
或者
getManager().getRepository()
存储库和管理器find
方法都接受可用于查询所需数据的特殊选项,而无需使用QueryBuilder
find方法
参数是{}对象:
select属性:指定对象的属性
relations属性:
关系需要加载主体
join属性:
where属性:
or运算符:
order属性:
skip偏移:用于分页
take属性:limit,用于分页
cache属性:
lock属性:启用锁
内置运算符:
Not ,LessThan , LessThanOrEqual, MoreThan, MoreThanOrEqual, Equal, Like,ILike, Between, In ,Any, IsNull, Raw
存储库使用EntityManager:
const manager = repository.manager;
存储库访问metadata
:
const metadata = repository.metadata;
存储库使用查询运行器:
const queryRunner = repository.queryRunner;
存储库获取管理的实体目标类:
const target = repository.target;
存储库创建查询构建器:
const users = await repository
.createQueryBuilder("user")
.where("user.name = :name", { name: "John" })
.getMany();
hasId
,getId, create,preload, save,remove,insert ,update, delete, count,increment,decrement, find,findAndCount, findByIds, findOne, findOneOrFail,Query, clear
自定义存储库:
为单个实体创建存储库,并创建查询方法:
@EntityRepository(User)
export class UserRepository extends Repository<User> {
}
使用存储库:
import { getCustomRepository } from "typeorm";
import { UserRepository } from "./repository/UserRepository";
const userRepository = getCustomRepository(UserRepository); // 或connection.getCustomRepository或manager.getCustomRepository()
const user = userRepository.create(); // 和 const user = new User();一样
user.firstName = "Timber";
user.lastName = "Saw";
await userRepository.save(user);
const timber = await userRepository.findByName("Timber", "Saw");
typeorm中EntityManager和repository什么区别?
Repository 是一个特定于实体类的抽象层。当你定义了一个实体类后,TypeORM 会自动为你创建一个对应的 Repository。例如,如果你有一个 User
实体,那么你就会有一个 UserRepository
。这个 Repository 提供了一些基本的方法来对实体进行 CRUD 操作,比如 save()
, findOne()
, find()
, remove()
等等。
Repository 是类型安全的,意味着它的方法是针对特定实体类型的。使用 Repository 通常更易于理解和维护,因为你不需要处理低级别的事务管理或手动管理连接。
EntityManager
则是一个更底层的概念,它提供了对整个 ORM 功能的访问,包括事务管理和更复杂的查询功能。EntityManager
可以用于任何实体,并且允许你执行跨多个实体的操作。它提供了一些额外的方法,如 createQueryBuilder()
, transaction()
等。EntityManager
是非类型安全的,因为它可以用于任何实体类型。这意味着你需要显式地指定实体类型,以便正确地处理结果。
使用场景
- Repository 适用于大多数日常开发需求,特别是当你的操作仅限于单一实体时。
- EntityManager 更适合需要进行复杂事务管理或多实体操作的情况。