Struts2.1.8+Spring3.0+Ibatis2.3.4集成(二)

来源:互联网 发布:英国皇家戏剧学院 知乎 编辑:程序博客网 时间:2024/05/18 01:43

Ibatis Dao设计

 

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);      

    }  

}