下面把代碼寫出來,希望大家批評指正.
首先domain對象.在這裡使用的註解的方式,都是比較新的版本.
User.java
複製代碼 代碼如下:package com.bao.sample.s3h4.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.bao.sample.base.domain.BaseDomain;
@Entity
@Table(name = "t_user")
public class User extends BaseDomain {
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String password;
/**
* @Description 註解最好標記在get方法上.注意:採用一致的標記方式,註解是以Id的標記方式為準的,如果標記在get方法上,則忽略property上的註解.
* @return
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(nullable = false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Column(nullable = false)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
super();
}
public User(int id, String username, String password) {
super();
this.id = id;
this.username = username;
this.password = password;
}
}
接下來是Dao介面,繼承一個BaseDao介面. 複製代碼 代碼如下:package com.bao.sample.s3h4.dao;
import java.util.List;
import com.bao.sample.base.dao.BaseDao;
import com.bao.sample.s3h4.domain.User;
public interface UserBatchDao extends BaseDao<User> {
/**
* @Description 批量增加操作
* @return -1:操作失敗;0:執行正常;>0:執行成功的數目
*/
public int batchAddUsingJdbc(List<User> users);
public int batchAddUsingHibernate(List<User> users);
public int batchAddUsingJdbcTemplate(List<User> users);
}
UserBatchDao的實現: 複製代碼 代碼如下:UserBatchDaoImpl
package com.bao.sample.s3h4.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate4.SessionFactoryUtils;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.bao.sample.base.dao.BaseDaoImpl;
import com.bao.sample.s3h4.domain.User;
/**
*
* @Description 三種批量增加方法,執行效率依次是jdbc、jdbcTemplate、hibernate.<br />jdbc和jdbcTemplate執行效率相近,不過jdbcTemplate可以使用事務註解控制,所以優先選擇.
* @author Bob hehe198504@126.com
* @date 2012-8-13
*/
@Repository("userBatchDao")
public class UserBatchDaoImpl extends BaseDaoImpl<User> implements UserBatchDao {
@Resource
protected JdbcTemplate jdbcTemplate;
/**
* 執行10W條記錄,大致耗時15188ms
*/
@Override
public int batchAddUsingJdbc(List<User> users) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "insert into t_user (username,password) values (?,?)";
try {
conn = SessionFactoryUtils.getDataSource(sessionFactory).getConnection();
conn.setAutoCommit(false);
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < users.size(); i++) {
int j = 1;
pstmt.setString(j++, users.get(i).getUsername());
pstmt.setString(j++, users.get(i).getPassword());
pstmt.addBatch();
}
pstmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
} finally {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return result;
}
/**
* 執行10W條記錄,大致耗時131203ms,大致是jdbc或jdbcTemplate的10倍.
*/
@Override
// @Transactional(noRollbackFor = RuntimeException.class)
@Transactional
public int batchAddUsingHibernate(List<User> users) {
Session session = this.getSession();
for (int i = 0; i < users.size(); i++) {
session.save(users.get(i));
// 添加20條以後,強制入庫
// clear()清空緩衝
// postgres資料庫的隔離等級是已提交讀(Read committed),
// 所以flush以後,資料看不到,只有commit後才能看到資料,
// 如果失敗,rollback,前面的flush的資料不會入庫
if (i % 20 == 0) {
session.flush();
session.clear();
}
}
return 0;
}
/**
* 執行10W條記錄,大致耗時15671ms
*/
// @Transactional(noRollbackFor = RuntimeException.class)
@Transactional
public int batchAddUsingJdbcTemplate(List<User> users) {
String sql = "insert into t_user (username,password) values (?,?)";
final List<User> tempUsers = users;
final int count = users.size();
BatchPreparedStatementSetter pss = new BatchPreparedStatementSetter() {
// 為prepared statement設定參數。這個方法將在整個過程中被調用的次數
public void setValues(PreparedStatement pstmt, int i) throws SQLException {
int j = 1;
pstmt.setString(j++, tempUsers.get(i).getUsername());
pstmt.setString(j++, tempUsers.get(i).getPassword());
}
// 返回更新的結果集條數
public int getBatchSize() {
return count;
}
};
jdbcTemplate.batchUpdate(sql, pss);
return 0;
}
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
}
外圍的架構沒有附上,有需要可以留言,我提供打包下載.
作者:聽雨軒