Ibatis Dao设计
import java.io.Serializable;
import java.util.List;
/**
* GenericDao DAO层泛型接口,定义基本的DAO功能
* @author Edwin
* @since 1.0
* @param <T> 实体类
* @param <PK> 主键类,必须实现Serializable接口
*
*/
public abstract interface IGenericDao<T, PK extends Serializable> {
/**
* 插入一个实体(在数据库INSERT一条记录)
* @param entity 实体对象
*/
public abstract void insert(T entity);
/**
* 修改一个实体对象(UPDATE一条记录)
* @param entity 实体对象
* @return 修改的对象个数,正常情况=1
*/
public abstract int update(T entity);
/**
* 按主键删除记录
* @param primaryKey 主键对象
* @return 删除的对象个数,正常情况=1
*/
public abstract int delete(PK primaryKey);
/**
* 查询整表总记录数
* @return 整表总记录数
*/
public abstract int count();
/**
* 按主键取记录
* @param primaryKey 主键值
* @return 记录实体对象,如果没有符合主键条件的记录,则返回null
*/
public abstract T get(PK primaryKey);
/**
* 取全部记录
* @return 全部记录实体对象的List
*/
public abstract List<T> select();
/**
* 批量插入
* @param list
*/
public abstract void batchInsert(final List<T> list);
/**
* 批量修改
* @param list
*/
public abstract void batchUpdate(final List<T> list);
/**
* 批量删除
* @param list
*/
public abstract void batchDelete(final List<PK> list);
}
import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import org.springframework.orm.ibatis.SqlMapClientCallback;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapExecutor;
import com.ibatis.sqlmap.engine.execution.SqlExecutor;
import com.ibatis.sqlmap.engine.impl.ExtendedSqlMapClient;
import com.edwin.common.tools.ReflectUtil;
import com.edwin.dao.IGenericDao;
import com.edwin.dao.ibatis.ext.LimitSqlExecutor;
public class BaseDao<T, PK extends Serializable> extends SqlMapClientDaoSupport implements
IGenericDao<T, PK> {
// sqlmap.xml定义文件中对应的sqlid
public static final String SQLID_INSERT = "insert";
public static final String SQLID_UPDATE = "update";
public static final String SQLID_DELETE = "delete";
public static final String SQLID_SELECT = "select";
public static final String SQLID_SELECT_PK = "selectPk";
public static final String SQLID_COUNT = "count";
private String sqlmapNamespace = "";
private SqlExecutor sqlExecutor;
public SqlExecutor getSqlExecutor() {
return sqlExecutor;
}
public void setSqlExecutor(SqlExecutor sqlExecutor) {
this.sqlExecutor = sqlExecutor;
}
public void setEnableLimit(boolean enableLimit) {
if (sqlExecutor instanceof LimitSqlExecutor) {
((LimitSqlExecutor) sqlExecutor).setEnableLimit(enableLimit);
}
}
public void initialize() throws Exception {
if (sqlExecutor != null) {
SqlMapClient sqlMapClient = getSqlMapClientTemplate()
.getSqlMapClient();
if (sqlMapClient instanceof ExtendedSqlMapClient) {
ReflectUtil.setFieldValue(((ExtendedSqlMapClient) sqlMapClient)
.getDelegate(), "sqlExecutor", SqlExecutor.class,
sqlExecutor);
}
}
}
/**
* sqlmapNamespace,对应sqlmap.xml中的命名空间
*
* @return
*/
public String getSqlmapNamespace() {
return sqlmapNamespace;
}
/**
* sqlmapNamespace的设置方法,可以用于spring注入
*
* @param sqlmapNamespace
*/
public void setSqlmapNamespace(String sqlmapNamespace) {
this.sqlmapNamespace = sqlmapNamespace;
}
public int count() {
Integer count = (Integer) getSqlMapClientTemplate().queryForObject(
sqlmapNamespace + "." + SQLID_COUNT);
return count.intValue();
}
public int delete(PK primaryKey) {
int rows = getSqlMapClientTemplate().delete(
sqlmapNamespace + "." + SQLID_DELETE, primaryKey);
return rows;
}
public T get(PK primaryKey) {
return (T) getSqlMapClientTemplate().queryForObject(
sqlmapNamespace + "." + SQLID_SELECT_PK, primaryKey);
}
public void insert(T entity) {
getSqlMapClientTemplate().insert(sqlmapNamespace + "." + SQLID_INSERT,
entity);
}
public List<T> select() {
return getSqlMapClientTemplate().queryForList(
sqlmapNamespace + "." + SQLID_SELECT);
}
public int update(T entity) {
return getSqlMapClientTemplate().update(
sqlmapNamespace + "." + SQLID_UPDATE, entity);
}
public void batchInsert(final List<T> list){
SqlMapClientCallback callback = new SqlMapClientCallback() {
public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
executor.startBatch();
for (T member : list) {
executor.insert(sqlmapNamespace + "." + SQLID_INSERT, member);
}
executor.executeBatch();
return null;
}
};
this.getSqlMapClientTemplate().execute(callback);
}
public void batchUpdate(final List<T> list){
SqlMapClientCallback callback = new SqlMapClientCallback() {
public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
executor.startBatch();
for (T member : list) {
executor.update(sqlmapNamespace + "." + SQLID_UPDATE, member);
}
executor.executeBatch();
return null;
}
};
this.getSqlMapClientTemplate().execute(callback);
}
public void batchDelete(final List<PK> list){
SqlMapClientCallback callback = new SqlMapClientCallback() {
public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
executor.startBatch();
for (PK member : list) {
executor.delete(sqlmapNamespace + "." + SQLID_DELETE, member);
}
executor.executeBatch();
return null;
}
};
this.getSqlMapClientTemplate().execute(callback);
}
}