提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本章节主要了解typeOrm框架EntityManager和Repository,学习常见的sql语句
一、EntityManager
使用 EntityManager,你可以(insert, update, delete, load 等)任何实体。 EntityManager 就像放一个实体存储的集合,参考示例:
import { User } from './entity/User.js';
await AppDataSource.initialize();
const user = await AppDataSource.manager.findOne(User,{where: {
id:'1'
}}); // 等价于sql select * from user where id = 1;
console.log('user: ' + JSON.stringify(user));
二、Repository
Repository 就像 EntityManager 一样,但其操作仅限于具体实体。类似于Mybatis 中的 DAO 层,参考如下示例:
const userZs = await AppDataSource.getRepository(User).findOneBy({
name : 'jacky'
});
console.log('使用Repository查询' + JSON.stringify(userZs));
三、Find 选项
EntityManager 和 Repository 都支持find方法,提供一些简单的单表或者关联查询
- select - 表示必须选择对象的哪些属性
- relations - 表示查询实体的关联实体
- join - 执行表连接,和relations类似,但join更加灵活
- where- 添加sql查询条件
完整的find语句示例如下:
import {AppDataSource} from './datasource.js'
import { Clazz } from './entity/Clazz.js';
import { Student } from './entity/Student.js';
import { Teacher } from './entity/Teacher.js';
await AppDataSource.initialize();
const t = await AppDataSource.manager.find(Teacher,{
select : ['name','age','code'],
relations:['clazzes','course'],
where: {
name:'jack'
},
order:{
name : 'desc'
}
});
console.log('查询老师及学科信息:' + JSON.stringify(t));
const clazzOne = await AppDataSource.manager.findOne(Clazz,{
where:{
name:'一班'
}
});
const student = new Student();
student.code = '93e791e1-a487-434b-baca-3bc25f43b1fd';
student.clazz = clazzOne;
await AppDataSource.getRepository(Student)
.save(student) // 数据库已存在会更新,不存在则插入,相当于insertOrUpdate
const stuList = await AppDataSource.getRepository(Student).find({
relations:['clazz','courseList'],
take : 10, // limit 10
skip : 0 // offset
});
console.log ('分页查询学生:' + JSON.stringify(stuList));
四、自定义Repository
有时需要执行一些复杂或者灵活的sql,可以自定义Repository方法。同Mybatis中 Mapper 层自定义的方法一样。
- 如何创建自定义 Repository
可以使用 Repository 类的 .extend 方法:
const userRepository = AppDataSource.getRepository(User).extend({
findByNameAndAge(name,age) {
return this.createQueryBuilder('user')
.where("user.name = :name", { name })
.andWhere("user.age = :age", { age })
.getMany()
}
});
const extendRepoQueryResult = userRepository.findByNameAndAge('jack',22);
console.log('自定义Repository查询结果:' + JSON.stringify(extendRepoQueryResult));
五、EntityManager API
以下是一些 EntityManager 常用的 API:
// EntityManager Api
// 1. query 执行原始的sql语句
const manager = AppDataSource.manager;
const usrArr = await manager.query('select * from user where name = ?','jacky');
console.log('query 执行原始的sql语句 ' + JSON.stringify(usrArr));
// 使用标签函数
async function query(sqlTemplate, ...params) {
const sql = sqlTemplate.join('?');
const result = await manager.query(sql,params);
return result;
}
const usernameParam = 'jacky';
const ageParam = 22;
query`select * from user where name = ${usernameParam} and age = ${ageParam}`
.then(res => {
console.log('query successfully =====>' + JSON.stringify(res));
}).catch(error => {
console.log('query error ====>' + error);
});
// getId - 获取给定实体的主键列属性值。 如果实体具有复合主键,则返回的值将是包含主键列名称和值的对象
const jackyInfo = await manager.findOne(User,{
where:{
name:'jacky'
}
})
const primaryKey = manager.getId(jackyInfo);
console.log('获取主键:' + primaryKey);
// create - 创建User的新实例。可以选择使用属性对象文字创建要写入新创建的用户对象的属性
const newUser = manager.create(User,{
name: 'edison',
age: 24
});
await manager.save(newUser);
console.log('insert newUser success and newUser code is: ' + newUser.id);
// merge -合并多个实体为一个实体
const createUser = new User();
manager.merge(User, createUser, { name: "Bob" }, { age: 88 }); // 相当于 createUser.name = "Bob"; createUser.age = 88;
console.log('merge user props ' + JSON.stringify(createUser));
// preload - 从给定的普通JavaScript对象创建一个新实体。如果实体已经存在于数据库中,则加载它(以及与之相关的所有内容),
// 用新对象中的所有值替换它的值,并返回新实体。新实体实际上是从数据库实体加载的,所有属性都用新对象替换了。
const preUser = {
id:13,
name : 'edison222'
};
const replaceUser = await manager.preload(User,preUser);
console.log('从数据库加载edison和preUser合并:' + JSON.stringify(replaceUser));
// upsert - 插入新实体或实体数组,除非它们已经存在,否则将更新它们。等价于Mybatis updateOrInsert
await manager.upsert(
User,
[
{ name: "edison", age: 100 },
{ name: "特朗普", age: 72 },
],
["name"],
);
// findAndCount - 查找与给定条件匹配的entity。同时计算满足给定条件的所有实体的数量,但忽略分页条件
const [users,userCnt] = await manager.findAndCount(User,{
age: 22
});
console.log('年龄为22的用户为: ',JSON.stringify(users),'年龄为22的用户数量为:',userCnt);
// findOneOrFail - 查找与给定的FindOptions匹配的第一个实体。 如果没有匹配的实体,则拒绝返回的 Promise。
manager.findOneOrFail(User,{
name: '张飞'
}).then(res => {
console.log('张飞存在:' + JSON.stringify(res));
}).catch(error => {
console.log('张飞不存在:' + error);
});
六、Repository API
Repository API 和 EntityManager API 几乎一样,不再重复记录。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了 Repository 和 EntityManager 提供的 sql 查询,后续章节会继续学习较为复杂的 sql 语句。
标签:const,name,Repository,Javascript,全栈,manager,log,console,TypeOrm From: https://blog.csdn.net/weixin_42697184/article/details/143770821