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,只负责加工送进来的数据(写得不好,可能人就成猪了)。我们称这种数据与方法分离的模型为贫血模型;集合在一起,具有很好的面向对象特性的叫充血模型。

原文地址:http://www.cnblogs.com/feoandcode/p/16852070.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性