首页 > 其他分享 >TypeOrm框架(2)----创建实体

TypeOrm框架(2)----创建实体

时间:2022-11-02 19:23:21浏览次数:63  
标签:框架 Column movie 数据库 ts ---- import AppDataSource TypeOrm

TypeOrm框架----创建实体

1. 清除初始化项目中不需要的内容

Ⅰ.项目最初提供了一个User实体作为教例,我们把它删除(位置:\OrmTestProject\Entities\User.ts);

Ⅱ.然后我们要把它从数据库中抹去,操作如下:

修改代码:\OrmTestProject\data-source.ts

import "reflect-metadata"
import { DataSource } from "typeorm"
//删除了User的import

export const AppDataSource = new DataSource({
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "root",
    password: "123456",
    database: "test",
    synchronize: true,
    logging: false,
    entities: [],//删除了User实体
    migrations: [],
    subscribers: [],
})

Ⅲ.修改代码:\OrmTestProject\index.ts

import { AppDataSource } from "./data-source"

AppDataSource.initialize().then(async () => {

}).catch(error => console.log(error))

也就是把函数的内容清空。

Ⅳ.然后我们在项目终端执行:

npm start

再查询数据库时,我们便发现test数据库内什么都没有了。这便是ORM的一个作用,我们不必和数据库直接打交道,我们在代码中做的事情,ORM都会替我们完成(执行项目时)。

值得提醒的是,正常情况下可以把data-source.ts中的synchronize属性设置为false。这有个好处数据库和代码不同步。

为什么好?----如果我们的数据库有一个叫name的属性,我们在代码中把它改成Name,ORM会认为我们想删除name属性,然后创建一个叫Name的属性。这恐怕会导致我们在数据库的数据丢失!

2. 创建实体

2.1 PlayPlan实体

代码中的实体(entity),即数据库中的表格。

我们先创建一个电影的播放计划实体:

\OrmTestProject\entity\PlayPlan.ts

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class PlayPlan{

    @PrimaryGeneratedColumn()
    PlanID: number;

    @Column()
    MovieID: number;

    @Column()
    StartTime: Date;

    @Column()
    EndTime: Date;

    @Column()
    IsCompleted: boolean;

    @Column()
    SeatString: string;
}

2.2 一对多关系的创建

我们创建一个电影实体,它与电影播放计划构成一对多的关系。注意代码中对一对多关系的声明:

import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { PlayPlan } from "./PlayPlan";

@Entity()
export class Movie{

    @PrimaryGeneratedColumn()
    MovieID: number;

    @Column()
    MovieName: string;

    @Column()
    Summary: string;

    @Column()
    Footage: number;

    @Column()
    Language: string;

    @Column()
    Countryside: string;
    
    @Column()
    ReleaseTime: Date;

    @Column()
    IsDeleted: boolean;

    @Column()
    Kind: string;

    //此处为一对多关系的声明写法
    @OneToMany( type => PlayPlan, playplan => playplan.MovieID, { cascade: true })
    playPlan: PlayPlan[];

}

2.3 创建一个实例

我们修改一下index.ts的代码:

\OrmTestProject\index.ts

import { AppDataSource } from "./data-source"
import { Movie } from "./entity/Movie"

AppDataSource.initialize().then(async () => {

    let movie = new Movie;

    //输入电影信息
    movie.MovieName = "Green Book";
    movie.Countryside = "USA";
    movie.IsDeleted =false;
    movie.Kind = "Feature Film";
    movie.Language = "English";
    movie.Summary = "A story of a friendship\
                    between the two men that spans race and class, the pianist will tour \
                    from New York";
    movie.Footage = 130;
    movie.ReleaseTime = new Date("2018-9-11");
    
    //异步保存数据至数据库
    let movieRepository = AppDataSource.getRepository(Movie);
    await movieRepository.save(movie);
    console.log("Movie has been inserted into DB successfully");

}).catch(error => console.log(error))

index.ts有什么作用? ----它其实没有什么作用,重要的是它含有的函数AppDataSource.initialize(),是执行数据库初始化的入口。作为示范,我们在这里插入了一个movie,但实际中并不是在这里插入数据,我们有专门的框架层进行这些操作,会在后期博文更新。

在终端运行项目:

npm start

再查询数据库我们便能看到结果:

img

3. 后谈

我们在插入数据时使用了getRepository方法,这实际上是建立了一个数据管理仓库(称它仓储吧)。TypeOrm为我们提供了基本的CRUD操作。但我们也可以通过Repository装饰器自定义一个仓储,实现更复杂的数据库操作。
img

Repository是完全面向对象的,也就是我们对实体进行了限制(比如我们定义了一个人,他不会因为程序运行一段时间后变成了猪)。

与Repository相似的是DAO,这在JAVA中很常见了,但DAO不是完全面向对象的,它类似一个toolbox,只负责加工送进来的数据(写得不好,可能人就成猪了)。我们称这种数据与方法分离的模型为贫血模型;集合在一起,具有很好的面向对象特性的叫充血模型。

标签:框架,Column,movie,数据库,ts,----,import,AppDataSource,TypeOrm
From: https://www.cnblogs.com/feoandcode/p/16852070.html

相关文章

  • nvm & grep filter out only Node.js Latest LTS versions All In One
    nvm&grepfilteroutonlyNode.jsLatestLTSversionsAllInOne使用nvm&grep仅过滤出Node.js最新的LTS版本nvm&grep#字符串中包含空格,要使用双引号/......
  • html笔记2
    1、媒体元素音频和视频<!--音频和视频src:资源路径controls:控制条autoplay:自动播放--><videosrc=""controlsoutoplay></video><audiosrc=""controlsout......
  • 泰勒公式(学习总结)
    ·泰勒中值定理·麦克劳林展开式·常用函数的麦克劳林展开式1.泰勒中值定理拉格朗日形式的余项皮亚诺形式的余项麦克劳林展开式(取X0=0)常用函数的麦克劳林......
  • jmeter变量函数以及抓包用法
    抓包代理服务器:自己启动一个代理服务器本地,要使用代理服务器的ip和端口,使用自己启动的代理服务器操作步骤添加线程组测试计划>非测试元件>http代理服务器一定......
  • C# 数据类型取值范围
    bool型为int型,一般认为占4个字节,取值TRUE/FALSE/ERROR。sbyte型为有符号8位整数,占1个字节,取值范围在-128~127之间。bytet型为无符号16位整数,占2个字节,取值范围在0~255之间......
  • fastjson的详细用法
    fastjson的详细用法1.作用:fastjson用于将JavaBean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。2.导入依赖:<dependencies><dependency......
  • 巨杉数据库入围 IDC Innovator榜单,获评分布式数据库创新者
    近日,巨杉数据库凭借「湖仓一体」分布式数据库在金融领域的创新应用获得 IDC Innovator中国分布式数据库创新者殊荣。值得一提的是,这也是IDC在数字化转型盛典会议中首次......
  • 性能测试(7)----Java监控
    1.8堆和原空间1.7堆(普通数据放到堆)栈(基础数据放到栈) JDKbin目录下有两个java监控工具:jvisualvm(安装一个插件visualgc可以看到堆栈使用情况)和 jconsole.exe(监控......
  • 轮播图前端
    轮播图组件<template><divid="banner"><el-carouselheight="400px"><!--将banner_list循环--><el-carousel-itemv-for="iteminbanner_list":......
  • 最短路问题杂谈
    感觉这类问题好多变形,记录一下,方便复习。P1522[USACO2.4]牛的旅行CowTours由于题目的N很小,且要求任意两点之间距离,很容易想到一下暴力做法:求出题目的联通块,记id[......