iBATIS SQLMap 透過 SqlMapClient 介面提供資料庫操作。典型啟動流程:
public void insert(Person p) {
String resource = "com/Jdnis/ibatis/map/sql-map-config.xml";
SqlMapClient sqlMap = null;
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
// 手動事務控制
sqlMap.startTransaction();
sqlMap.insert("insertPerson", p);
sqlMap.commitTransaction();
System.out.println("資料插入成功");
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
System.out.println("主鍵 " + p.getId() + " 衝突!無法插入資料");
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Resources.getResourceAsReader():從 classpath 載入設定檔。SqlMapClientBuilder.buildSqlMapClient():建立單例 SqlMapClient,執行緒安全。startTransaction() / commitTransaction() / endTransaction() 必須成對出現,確保連線正確歸還池中。iBATIS 提供簡單的批次介面,適用於大量寫入場景:
// 1. 開啟批次模式
sqlMap.startBatch();
// 2. 連續執行同類型的 insert/update/delete
for (Person p : personList) {
sqlMap.insert("insertPerson", p); // 實際未送資料庫,累積在批次中
}
// 3. 一次性送出
int[] results = sqlMap.executeBatch(); // 返回各條語句影響筆數陣列
addBatch() 優化。startTransaction() ~ commitTransaction()),確保原子性。executeBatch(),避免 OOM。在 Spring 管理下,通常不直接操作 SqlMapClient,而是透過 SqlMapClientTemplate 或注入 DAO 介面。批次操作可使用 SqlMapClientTemplate.executeWithListResult() 配合 SqlMapClientCallback 實現,或直接取得 sqlMapClient 調用上述原生 API(需關閉模板的自動事務管理)。
掌握核心 API 後,可根據專案架構靈活選擇「模板簡化」或「原生控制」兩種風格。