Package javacommon.base

Source Code of javacommon.base.BaseIbatis3Dao$SqlSessionTemplate

package javacommon.base;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.dao.support.DaoSupport;
import org.springframework.util.Assert;

import cn.org.rapid_framework.beanutils.PropertyUtils;
import cn.org.rapid_framework.page.Page;
import cn.org.rapid_framework.page.PageRequest;

/**
* @author badqiu
* @version 1.0
*/
public abstract class BaseIbatis3Dao<E,PK extends Serializable> extends DaoSupport implements EntityDao<E,PK> {
    protected final Log log = LogFactory.getLog(getClass());
   
    private SqlSessionFactory sqlSessionFactory;
    private SqlSessionTemplate sqlSessionTemplate;
  protected void checkDaoConfig() throws IllegalArgumentException {
    Assert.notNull(sqlSessionFactory,"sqlSessionFactory must be not null");
  }

  public SqlSessionFactory getSqlSessionFactory() {
    return sqlSessionFactory;
  }

  public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
    this.sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
  }

    public SqlSessionTemplate getSqlSessionTemplate() {
      return sqlSessionTemplate;
    }
   
    public Object getById(PK primaryKey) {
        Object object = getSqlSessionTemplate().selectOne(getFindByPrimaryKeyStatement(), primaryKey);
        return object;
    }
   
  public void deleteById(PK id) {
    int affectCount = getSqlSessionTemplate().delete(getDeleteStatement(), id);
  }
 
    public void save(E entity) {
    prepareObjectForSaveOrUpdate(entity);
    int affectCount = getSqlSessionTemplate().insert(getInsertStatement(), entity);     
    }
   
  public void update(E entity) {
    prepareObjectForSaveOrUpdate(entity);
    int affectCount = getSqlSessionTemplate().update(getUpdateStatement(), entity);
  }
 
  /**
   * 用于子类覆盖,在insert,update之前调用
   * @param o
   */
    protected void prepareObjectForSaveOrUpdate(E o) {
    }

    public String getIbatisMapperNamesapce() {
        throw new RuntimeException("not yet implement");
    }
   
    public String getFindByPrimaryKeyStatement() {
        return getIbatisMapperNamesapce()+".getById";
    }

    public String getInsertStatement() {
        return getIbatisMapperNamesapce()+".insert";
    }

    public String getUpdateStatement() {
      return getIbatisMapperNamesapce()+".update";
    }

    public String getDeleteStatement() {
      return getIbatisMapperNamesapce()+".delete";
    }

    public String getCountStatementForPaging(String statementName) {
    return statementName +".count";
  }
   
  protected Page pageQuery(String statementName, PageRequest pageRequest) {
    return pageQuery(getSqlSessionTemplate(),statementName,getCountStatementForPaging(statementName),pageRequest);
  }
 
  public static Page pageQuery(SqlSessionTemplate sqlSessionTemplate,String statementName,String countStatementName, PageRequest pageRequest) {
   
    Number totalCount = (Number) sqlSessionTemplate.selectOne(countStatementName,pageRequest);
    if(totalCount == null || totalCount.longValue() <= 0) {
      return new Page(pageRequest,0);
    }
   
    Page page = new Page(pageRequest,totalCount.intValue());
   
    //其它分页参数,用于不喜欢或是因为兼容性而不使用方言(Dialect)的分页用户使用. 与getSqlMapClientTemplate().queryForList(statementName, parameterObject)配合使用
    Map filters = new HashMap();
    filters.put("offset", page.getFirstResult());
    filters.put("pageSize", page.getPageSize());
    filters.put("lastRows", page.getFirstResult() + page.getPageSize());
    filters.put("sortColumns", pageRequest.getSortColumns());
   
    Map parameterObject = PropertyUtils.describe(pageRequest);
    filters.putAll(parameterObject);
   
    List list = sqlSessionTemplate.selectList(statementName, filters,page.getFirstResult(),page.getPageSize());
    page.setResult(list);
    return page;
  }
 
  public List findAll() {
    throw new UnsupportedOperationException();
  }

  public boolean isUnique(E entity, String uniquePropertyNames) {
    throw new UnsupportedOperationException();
  }
 
  public void flush() {
    //ignore
  }
 
  public static class SqlSessionTemplate {
    SqlSessionFactory sqlSessionFactory;
   
    public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
      this.sqlSessionFactory = sqlSessionFactory;
    }

    public Object execute(SqlSessionCallback action)  {
      SqlSession session = null;
      try {
        session = sqlSessionFactory.openSession();
        Object result = action.doInSession(session);
        return result;
      }finally {
        if(session != null) session.close();
      }
    }
   
    public Object selectOne(final String statement,final Object parameter) {
      return execute(new SqlSessionCallback() {
        public Object doInSession(SqlSession session) {
          return session.selectOne(statement, parameter);
        }
      });
    }
   
    public List selectList(final String statement,final Object parameter,final int offset,final int limit) {
      return (List)execute(new SqlSessionCallback() {
        public Object doInSession(SqlSession session) {
          return session.selectList(statement, parameter, new RowBounds(offset,limit));
        }
      });
    }

    public List selectList(final String statement,final Object parameter) {
      return (List)execute(new SqlSessionCallback() {
        public Object doInSession(SqlSession session) {
          return session.selectList(statement, parameter);
        }
      });
    }
   
    public int delete(final String statement,final Object parameter) {
      return (Integer)execute(new SqlSessionCallback() {
        public Object doInSession(SqlSession session) {
          return session.delete(statement, parameter);
        }
      });
    }
   
    public int update(final String statement,final Object parameter) {
      return (Integer)execute(new SqlSessionCallback() {
        public Object doInSession(SqlSession session) {
          return session.update(statement, parameter);
        }
      });
    }
   
    public int insert(final String statement,final Object parameter) {
      return (Integer)execute(new SqlSessionCallback() {
        public Object doInSession(SqlSession session) {
          return session.insert(statement, parameter);
        }
      });
    }
  }
 
  public static interface SqlSessionCallback {
   
    public Object doInSession(SqlSession session);
   
  }
 
 
}
TOP

Related Classes of javacommon.base.BaseIbatis3Dao$SqlSessionTemplate

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.