save方法与update、updateById这三个方法都有更新数据库的作用,其中save方法在何时会更新何时会保存已经实验过了,现在主要区分一下这几个方法的使用
1.最正常的更新,更新一个已存在实体:
实体:
import { Entity , PrimaryGeneratedColumn , Column ,PrimaryColumn} from 'typeorm'
@Entity()
export class User{
@PrimaryColumn({
type:'int'
})
id:number
@Column({
type:'varchar'
})
name:string
}
import { createConnection,Repository } from 'typeorm'
import { User } from './User'
createConnection({
name:'test',
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: '123456',
database: "test",
synchronize:true,
dropSchema:true,
charset:'UTF8',
entities: [
User
]
}).then(async (connection)=>{
let userRepository = connection.getRepository(User)
let user = userRepository.create({id:1,name:'张三'})
let result = await userRepository.save(user)
console.log(user)
let result1 = await userRepository.update(user,{name:'李四'})
console.log(user)
console.log(result1)
})
输出:
User { id: 1, name: '张三' }
User { id: 1, name: '张三' }
undefined
可以看到,update与insert一样,都是直接对数据库执行操作,不返回数据,也不对被更新实体进行更改
updateById:基本与update一样,也不返回任何东西
save:
then(async (connection)=>{
let userRepository = connection.getRepository(User)
let user = userRepository.create({id:1,name:'张三'})
let result = await userRepository.save(user)
console.log(user)
let result1 = await userRepository.save({id:1,name:'李四'})
console.log(user)
console.log(result1)
})
输出:
User { id: 1, name: '张三' }
User { id: 1, name: '张三' }
{ id: 1, name: '李四' }
save方法会返回更新后的实体,当然也就是它操作的实体
save方法的更新功能不是明确指定的,而是在其内部进行判断执行的,这是与update方法最主要的区别,在save中会有一个加载执行实体的步骤update:
then(async (connection)=>{
let userRepository = connection.getRepository(User)
let user = userRepository.create({id:1,name:'张三'})
let result = await userRepository.save(user)
let result1 = await userRepository.update({id:2},{name:'李四'})
console.log(result1)
})
输出:undefined
这里有些出乎意料,因为更新不存在实体,竟然没有报错,其实数据库本身就是这样的设定:
update user set name="李四" where id=1;
输出:
Query OK, 1 row affected (0.12 sec)
Rows matched: 1 Changed: 1 Warnings: 0
可见,在数据库中执行更新,会返回收到影响的行数
如果更新不存在的行:
update user set name="李四" where id=2;
输出:
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
此时,受到影响、匹配的行都为0,但是没有报错,这个特性延续到了update方法
save:当操作不存在于数据库实体时,会直接保存,没必要演示了
3.不正常的更新,更新id
update:
then(async (connection)=>{
let userRepository = connection.getRepository(User)
let user = userRepository.create({id:1,name:'张三'})
let result = await userRepository.save(user)
let result1 = await userRepository.updateById(1,{id:2,name:'李四'})
console.log(result1)
})
此时数据库为:
+----+--------+
| id | name |
+----+--------+
| 2 | 李四 |
说明update方法,可以更改id
save:无法做到更改数据id,id改变后只能将实体作为新数据插入,这是一个很大而且基本没啥用的区别