更新数据
QtDao更新数据可以按条件更新,也可以按实体对象更新。使用函数_update<E>
返回一个UpdateBuilder<E>
对象,再调用build()
函数创建Update<E>
对象进行更新数据操作:
template<typename E>
Insert<E> dao::_update<E>().build()
条件更新
按条件更新记录时,对UpdateBuilder<E>
使用set
函数设置需要更新的字段,使用filter
函数设置更新条件。使用如下:
User::Fields field;
int effectRows = dao::_update<User>()
.set(field.age = 19, field.score = 120)
.filter(field.name == "Alice")
.build().update();
等同于使用如下sql语句:
update User set age = 19, score = 120 where name = 'Alice'
实体对象更新
按实体对象更新记录时,不能使用set
与filter
函数,直接将对象传入update
函数即可:
User::Fields field;
auto user = dao::_select<User>().filter(field.name == "Alice").build().unique();
user.setAge(19);
user.setScore(120);
int effectRows = dao::_update<User>().build().update(user);
注意:按实体对象更新采用的方法和条件更新一致,不同的是,按实体对象更新时内部将自动提取表
primary key
字段作为更新条件,其他字段作为更新的字段,因此,使用实体对象更新方法时,必须确保操作的表设置了primary key
字段。
批量更新
使用updateBatch()
函数进行批量更新。对于使用条件更新,对field
成员使用QList<T>
列表即可,但需要确保set
条件和filter
条件值列表大小一致:
auto userNames = QStringList() << "Alice" << "Bob";
auto ages = QList<int>() << 19 << 20;
auto scores = QList<int>() << 120 << 130;
User::Fields field;
int effectRows = dao::_update<User>()
.set(field.age = ages, field.score = scores)
.filter(field.name == userNames)
.build().updateBatch();
对于使用实体对象更新,传入对象列表即可:
UserList users;
users << User("Alice", 18, 100);
users << User("Bob", 19, 120);
dao::_update<User>().build().updateBatch(users);