最近在做項目時遇到一個問題,springboot+mybatis項目,執行批量更新語句,坐了分批次執行批量更新,控制台打印更新成功,然后程序還沒跑完,我就關閉程序了。可是當我回到數據庫里面查看的時候,發現數據並沒有改變,特此去研究了一下。
示例
Map<String, Object> map = new HashMap<>();
Integer count = mapper.getCount();
int size = 100;
int m = count/size;
map.put("size", size);
for (int i = 0; i <= m; i++) {
map.put("startIndex", i * size);
List<NewsContentDO> contents = mapper.getAllNewsContentBy(map);
for (NewsContentDO newsContentDO : contents) {
String path = "/Users/admin/Desktop/pdf";
newsContentDO.setPdfUrl(path);
}
mapper.updateBatch(contents);
}
打開mybatis的日志,控制台會打印每次批量更新方法的日志,顯示更新成功,改變行數等信息。但是這個時候停止程序,數據庫是沒有任何變化的。
這個原因是因為mybatis默認不是自動提交事務的, 所以其實沒有修改數據庫,剛剛新增完后立即返回的結果,是從mybatis為了提高性能設置的緩存里讀取的,不是從數據庫讀取的。
解決方法
- 設定自動提交openSession( autoCommit=true)
public static SqlSession createSqlSession() {
sqlSession = getSqlSessionFactory().openSession(true);
return sqlSession;
}
- 在代碼里面寫上commit
sqlSession.commit();