package com.smtservlet.database; import java.sql.Connection; import java.util.Map; import java.util.Map.Entry; import org.apache.ibatis.session.ResultContext; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mybatis.spring.SqlSessionTemplate; /** * DAO操作的Mybatis的实现类 */ public class SMTDaoMybatis extends SMTDaoAbstract { protected SqlSessionTemplate _sqlSession; protected Map _mapName2MapperName = null; private static Logger _logger = LogManager.getLogger(SMTDaoMybatis.class); /** * 如果带映射的话,则根据映射返回转换后的操作名,否则返回输入的操作名 * @param statement - 操作名 * @return - 返回转换后的操作名 */ protected String getMapperName(String statement) { String name; if(_mapName2MapperName == null || (name = _mapName2MapperName.get(statement)) == null) return statement; return name; } @SuppressWarnings("unchecked") protected void logSqlParam(String opName, String statement, Object argument) { if(!getEnableLog() || !_logger.isDebugEnabled()) return; StringBuilder sb = new StringBuilder(); sb.append(String.format("DAO call:%s:%s\n", opName, statement)); if(argument != null && argument instanceof Map) { for(Entry entry : ((Map)argument).entrySet()) { Object value = entry.getValue(); if(value == null) sb.append(String.format("\t%s=(null)\n", entry.getKey())); else sb.append(String.format("\t%s %s=%s\n", value.getClass().getName(), entry.getKey(), value.toString())); } } _logger.debug(sb.toString()); } @Override public void initInstance(Object rawDAO) { _sqlSession = (SqlSessionTemplate) rawDAO; } @Override public int update(String statement, Object arugment) { logSqlParam("update", statement, arugment); return _sqlSession.update(getMapperName(statement), arugment); } @Override public int insert(String statement, Object arugment) { logSqlParam("insert", statement, arugment); return _sqlSession.insert(getMapperName(statement), arugment); } @Override public void selectHandle(String statement, Object arugment, int start, int count, final SMTDaoHandler handler) { logSqlParam("select", statement, arugment); RowBounds rb = new RowBounds(start, count >= 0 ? count : RowBounds.NO_ROW_LIMIT); _sqlSession.select(getMapperName(statement), arugment, rb, new ResultHandler(){ @Override public void handleResult(ResultContext resultContext) { try { if(!handler.onReadRecord(resultContext.getResultObject())) resultContext.stop(); } catch(Exception ex) { throw new RuntimeException(ex); } }}); } @Override public String getDatabaseId() { return _sqlSession.getConfiguration().getDatabaseId(); } @Override public void close() { _sqlSession.close(); } @Override public Connection getConnection() throws Exception { return _sqlSession.getConnection(); } }