package message.datasource.helper; import message.base.convert.ConvertGetter; import message.datasource.convert.Convert; import message.datasource.key.IDGenerator; import message.utils.StringUtils; import org.apache.commons.collections.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanInstantiationException; import org.springframework.beans.BeanUtils; import javax.sql.DataSource; import javax.sql.rowset.serial.SerialClob; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import java.sql.Clob; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; /** * 共有方法. * * @author sunhao(sunhao.java@gmail.com) * @version V1.0, 15/6/20 上午12:38 */ public abstract class AbstractSqlHelper implements SqlHelper { private static final Logger logger = LoggerFactory.getLogger(AbstractSqlHelper.class); protected IDGenerator idGenerator; private Map<Class<?>, Class<?>> convertBeans = new HashMap<Class<?>, Class<?>>(); @Override public void setClobValue(PreparedStatement ps, int index, String value) throws SQLException { ps.setClob(index, new SerialClob(value.toCharArray())); } @Override public String getLongAsString(ResultSet rs, int index) throws SQLException { return rs.getString(index); } @Override public String getClobAsString(ResultSet rs, int index) throws SQLException, IOException { Clob clob = rs.getClob(index); Reader is = clob.getCharacterStream();// 得到流 BufferedReader br = new BufferedReader(is); String s = br.readLine(); StringBuffer sb = new StringBuffer(); while (s != null) {// 执行循环将字符串全部取出付值给 StringBuffer由StringBuffer转成STRING sb.append(s); s = br.readLine(); } return sb.toString(); } @Override public String getCountSql(String sql) { StringBuffer countSql = new StringBuffer("select count(*) from ("); countSql.append(sql).append(") total"); return countSql.toString(); } @Override public void setIdGenerator(IDGenerator idGenerator) { this.idGenerator = idGenerator; } @Override public abstract String getPageSql(String sql, int start, int num); @Override public Long getNextId(String sequenceName) { if (StringUtils.isEmpty(sequenceName)) { logger.warn("given null sequenceName!"); return null; } return idGenerator.nextLongValue(sequenceName); } @Override public abstract String existTableSQL(String tableName, DataSource dataSource) throws Exception; @Override public void setConvertBeans(Map<Class<?>, Class<?>> convertBeans) { this.convertBeans = convertBeans; } @Override public <T extends ConvertGetter> Convert<T> getConvert(Class<T> clazz) { if (MapUtils.isEmpty(this.convertBeans)) { return null; } Class<?> convertBeanClazz = this.convertBeans.get(clazz); try { return (Convert<T>) BeanUtils.instantiateClass(convertBeanClazz.getConstructor(Class.class), clazz); } catch (NoSuchMethodException e) { throw new BeanInstantiationException(convertBeanClazz.getDeclaringClass(), "has no Constructor with arguments '" + Class.class.getSimpleName() + "'!", e); } } }