更新数据

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'

实体对象更新

按实体对象更新记录时,不能使用setfilter函数,直接将对象传入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);

results matching ""

    No results matching ""