首页 > 编程语言 >【全栈开发(TypeOrm-Javascript)学习笔记三】

【全栈开发(TypeOrm-Javascript)学习笔记三】

时间:2024-11-16 17:48:37浏览次数:3  
标签:const name Repository Javascript 全栈 manager log console TypeOrm

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

本章节主要了解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

相关文章

  • JavaScript判断用户设备类型:PC端与移动端的区分方法
    在JavaScript中,可以通过检查用户代理字符串(UserAgentString)来判断用户设备类型,即访问网站的是PC端还是移动端设备。用户代理字符串是浏览器在发送HTTP请求时附带的一段信息,它包含了浏览器类型、版本、操作系统以及设备类型等信息。以下是一个简单的示例代码,用于判断用户......
  • 前端必知必会-JavaScript if、else 和 else if
    文章目录JavaScriptif、else和elseif条件语句if语句else语句elseif语句总结JavaScriptif、else和elseif条件语句用于根据不同的条件执行不同的操作。条件语句编写代码时,您经常希望针对不同的决策执行不同的操作。您可以在代码中使用条件语句来执行......
  • 前端必知必会-JavaScript Switch 语句
    文章目录JavaScriptSwitch语句JavaScriptSwitch语句break关键字default关键字常见代码块switch详细信息严格比较总结JavaScriptSwitch语句switch语句用于根据不同的条件执行不同的操作。JavaScriptSwitch语句使用switch语句从多个代码块中选择一个......
  • javaScript交互补充3(JSON数据)
    3.1、JSON(1)、定义:JSON数据格式JavaScriptObjectNotation缩写即js对象表示法由于JS中的对象只有JS自己认识,其他的语言都不认识,所以引入了JSON,JSON就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别,并且可以转换为任意语言中的对象,JSON在开发中主要用来数据的......
  • javaScript交互补充4(本地存储)
    localstorage、Sessionstorage是WebStorage,H5的本地存储机制。是本地存储,存储在客户端,以键/值对的形式存储的,通常以字符串存储。是针对HTML4中Cookie存储机制的一个改善,由于Cookie存储机制有很多缺点,HTML5不再使用它,转而使用改良后的WebStorage存储机制。4.1、Cookie(1......
  • javaScript交互补充(元素的三大系列)
    1、元素的三大系列1.1、offset系列1.1.1、offset初相识使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等获得元素距离带有定位祖先元素的位置获得元素自身的大小(宽度高度)注意:返回的数值都不带单位offset系列常用属性offset系列属性作用element.offset......
  • 代理模式在JavaScript中的恋爱应用笔记
    一、引言在面向对象编程的世界里,代理模式犹如一位巧妙的媒人,巧妙地连接了两个对象之间的交互,而无需直接显式地引用彼此。这种模式不仅降低了系统的耦合度,还使得代码更加灵活、可扩展。而在JavaScript的世界里,代理模式更是展现出了其独特的魅力。今天,我将结合恋爱场景,为大家......
  • 解码JavaScript作用域:var a = 1; 背后的故事
    1、引言JavaScript是一种广泛使用的编程语言,其灵活的语法和强大的功能使其成为前端开发的首选语言。然而,对于初学者来说,理解JavaScript中的作用域机制可能会有些困难。本文将通过一句简单的代码vara=1;,深入解析JavaScript的执行机制和作用域管理。2、变量声明与......
  • 【JavaScript】LeetCode:96-100
    文章目录96单词拆分97最长递增子序列98乘积最大子数组99分割等和子集100最长有效括号96单词拆分动态规划完全背包:背包-字符串s,物品-wordDict中的单词,可使用多次。问题转换:s能否被wordDict中的单词组成。dp[i]:长度为i的字符串s[0,i]能否被wordDict组成,dp[i]=......
  • 【JavaScript】LeetCode:91-95
    文章目录91不同路径92最小路径和93最长回文子串94最长公共子序列95编辑距离91不同路径动态规划dp[i][j]:从[0,0]到[i,j]的路径条数。dp[i][j]=从[0,0]到[i,j]上面一格的路径条数+从[0,0]到[i,j]左边一格的路径条数。初始化:因为第一行的格子只能由左......