如何快速更改ORM数据库中的许多记录?

时间:2016-12-18 13:19:16

标签: java sqlite orm ormlite

情况:我需要使用 ORMLite DAO 更改数据库中的许多记录(例如,10 000条记录)。所有记录仅在一个表中,在一列中更改,并更改已指定id的记录。

问题:如何使用 ORMLite DAO 一次更新数据库中的多条记录?

现在我使用以下代码更新记录:

imagesDao.update(imageOrmRecord);

但是在周期中更新记录非常慢(100条记录\秒)。

我认为真正的更新记录,使用SQL代码,但这是不可取的......

2 个答案:

答案 0 :(得分:1)

SQL是一种面向集合的语言。 ORM的重点是将其抽象为对象。 因此,当您想要更新一堆对象时,您必须浏览这些对象。 (您已经遇到了object-relational impedance mismatch;还阅读了The Vietnam of Computer Science。)

ORMLite为您提供了一个后门to execute raw SQL

someDao.executeRaw("UPDATE ...");

但如果您唯一的问题是性能,则可能是由自动提交模式引起的,这会为每个语句增加事务开销。使用callBatchTasks()可以解决此问题。

答案 1 :(得分:0)

  

问题:如何使用ORMLite DAO一次更新数据库中的多条记录?

这取决于您正在进行的更新。您当然可以使用UpdateBuilder来对对象进行批量更新。

UpdateBuilder<Account, String> updateBuilder = accountDao.updateBuilder();
// update the password to be "none"
updateBuilder.updateColumnValue("password", "none");
// only update the rows where password is null
updateBuilder.where().isNull(Account.PASSWORD_FIELD_NAME);
updateBuilder.update();

或类似的东西:

// update hasDog boolean to true if dogC > 0
updateBuilder.updateColumnExpression("hasDog", "dogC > 0");

您应该能够以这种方式完成使用原始SQL所做的大部分更新。

但是,如果您需要进行每个实体更新,那么您需要为每个实体更新dao.update(...)。我当时要做的是在事务中执行此操作以使更新更快。请参阅this answer