package com.walker.jdbc.dao; //import com.walker.common.SplitPageInfo; import com.walker.db.Sorts; import com.walker.db.page.GenericPager; import com.walker.db.page.ListPageContext; import com.walker.db.page.MapPager; import com.walker.db.page.PageSearch; import com.walker.infrastructure.utils.NumberGenerator; import com.walker.infrastructure.utils.StringUtils; import com.walker.jdbc.BaseDao; import com.walker.jdbc.BaseMapper; import com.walker.jdbc.BasePo; import com.walker.jdbc.ColumnMapRowMapper; import com.walker.jdbc.SqlAndParameters; import com.walker.jdbc.util.JdbcUtils; import com.walker.jdbc.util.StringSqlUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.CallableStatementCallback; import org.springframework.jdbc.core.CallableStatementCreator; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCallback; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.SingleColumnRowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.util.Assert; import java.math.BigDecimal; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 数据库访问jdbc DAO实现 * * @author 时克英 * @date 2017年3月1日 */ public class JdbcDaoImpl implements BaseDao { protected final transient Logger logger = LoggerFactory.getLogger(JdbcDaoImpl.class); private static final Pattern ARRAY_PARAMETER_PLACEHOLDER = Pattern.compile("\\?"); private JdbcTemplate jdbcTemplate; private NamedParameterJdbcTemplate namedParameterJdbcTemplate; private PaginationHelper paginationHelper; private boolean showSql = true; public PaginationHelper getPaginationHelper() { return paginationHelper; } public void setPaginationHelper(PaginationHelper paginationHelper) { this.paginationHelper = paginationHelper; } public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() { return namedParameterJdbcTemplate; } public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } public boolean isShowSql() { return showSql; } public void setShowSql(boolean showSql) { this.showSql = showSql; } private > BaseMapper convertToMapper(T basePo) { return JdbcUtils.getInstance(basePo); } /** * @see com.walker.jdbc.BaseDao#insert(T) */ @Override public > int insert(T po) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); Assert.notNull(pomapper.getPkValue_(), po.getClass().getCanonicalName() + "主键 " + pomapper.getPkName_() + " 不能为空"); SqlAndParameters> sp = pomapper.getInsertSql_(); printSql(sp); return this.namedParameterJdbcTemplate.update(sp.getSql(), sp.getParameters()); } /** * 批量写入数据集合 * @param poList 给定数据表对象集合。 * @return 返回成功记录数量,失败返回0 * @param * @date 2023-03-24 * @author 时克英 */ public > int insertBatch(List poList) throws DataAccessException{ if(poList == null || poList.size() == 0){ throw new IllegalArgumentException("poList is required!"); } String sql = null; Map[] parameters = new HashMap[poList.size()]; BasePo basePo = null; BaseMapper baseMapper = null; SqlAndParameters> sp = null; for(int i=0; i< poList.size(); i++){ basePo = poList.get(i); baseMapper = this.convertToMapper(basePo); sp = baseMapper.getInsertSql_(); if(sql == null){ sql = sp.getSql(); } parameters[i] = sp.getParameters(); } int[] result = this.namedParameterJdbcTemplate.batchUpdate(sql, parameters); if(result != null){ return result[0]; } return 0; } /** * 打印SQL * * @param sp SQL和参数对象 */ private void printSql(SqlAndParameters sp) { if (this.isShowSql()) { logger.info("{}", sp.toPrintSql()); } } /** * @see com.walker.jdbc.BaseDao#insert(List ) */ @Override public > int insert(List poList) throws DataAccessException { Assert.notNull(poList, "poList 不能为空!"); int sum = 0; for (BasePo po : poList) { sum += this.insert(po); } return sum; } /** * @see com.walker.jdbc.BaseDao#update(T) */ @Override public > int update(T po) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); Assert.notNull(pomapper.getPkValue_(), po.getClass().getCanonicalName() + "主键 " + pomapper.getPkName_() + " 不能为空"); SqlAndParameters> sp = pomapper.getUpdateSql_(); printSql(sp); return this.namedParameterJdbcTemplate.update(sp.getSql(), sp.getParameters()); } /** * @see BaseDao#save(T) */ @Override public > int save(T po) { BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = null; if (pomapper.getPkValue_() == null || StringUtils.EMPTY_STRING.equals(pomapper.getPkValue_())) { // 2022-10-11 如果主键为空自动生成一个long(纳秒值) // pomapper.setPkValue(NumberGenerator.getLongSequenceId()); pomapper.setPkValue(NumberGenerator.getLongSequenceNumber()); po.setPkValue(pomapper.getPkValue_()); sp = pomapper.getInsertSql_(); } else { sp = pomapper.getUpdateSql_(); } printSql(sp); return this.namedParameterJdbcTemplate.update(sp.getSql(), sp.getParameters()); } /** * @see com.walker.jdbc.BaseDao#update(List ) */ @Override public > int update(List poList) throws DataAccessException { Assert.notNull(poList, "poList 不能为空!"); int sum = 0; for (BasePo po : poList) { sum += this.update(po); } return sum; } /** * 批量更新数据集合,使用系统生成的po对象。该方法只根据主键更新 * @param poList * @return * @param * @throws DataAccessException * @author 时克英 * @date 2023-03-24 */ public > int updateBatch(List poList) throws DataAccessException{ if(poList == null || poList.size() == 0){ return 0; } String sql = null; Map[] parameters = new HashMap[poList.size()]; BasePo basePo = null; BaseMapper baseMapper = null; SqlAndParameters> sp = null; for(int i=0; i< poList.size(); i++){ basePo = poList.get(i); baseMapper = this.convertToMapper(basePo); sp = baseMapper.getUpdateSql_(); if(sql == null){ sql = sp.getSql(); } parameters[i] = sp.getParameters(); } int[] result = this.namedParameterJdbcTemplate.batchUpdate(sql, parameters); if(result != null){ return result[0]; } return 0; } /** * @see com.walker.jdbc.BaseDao#update(T, String, Map< String, Object> ) */ @Override public > int update(T po, String where, Map parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(where, "where 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = pomapper.getUpdateSql_(where, parameters); printSql(sp); return this.namedParameterJdbcTemplate.update(sp.getSql(), sp.getParameters()); } @Override public > int update(T po, String where, Object[] parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(where, "where 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters sp = pomapper.getUpdateSql_(where, parameters); printSql(sp); return this.jdbcTemplate.update(sp.getSql(), sp.getParameters()); } /** * @see com.walker.jdbc.BaseDao#delete(T) */ @Override public > int delete(T po) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); Assert.notNull(pomapper.getPkValue_(), po.getClass().getCanonicalName() + " 主键 " + pomapper.getPkName_() + " 不能为空"); SqlAndParameters> sp = pomapper.getDeleteSql_(); printSql(sp); return this.namedParameterJdbcTemplate.update(sp.getSql(), sp.getParameters()); } /** * @see com.walker.jdbc.BaseDao#delete(List ) */ @Override public > int delete(List poList) throws DataAccessException { Assert.notNull(poList, "poList 不能为空!"); int sum = 0; for (BasePo po : poList) { sum += this.delete(po); } return sum; } /** * @see com.walker.jdbc.BaseDao#delete(T, String, Map< String, Object> ) */ @Override public > int delete(T po, String where, Map parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(where, "where 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = pomapper.getDeleteSql_(where, parameters); printSql(sp); return namedParameterJdbcTemplate.update(sp.getSql(), sp.getParameters()); } @Override public > int delete(T po, String where, Object[] parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(where, "where 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters sp = pomapper.getDeleteSql_(where, parameters); printSql(sp); return jdbcTemplate.update(sp.getSql(), sp.getParameters()); } /** * @see com.walker.jdbc.BaseDao#get(T) */ @Override public > T get(T po) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); Assert.notNull(pomapper.getPkValue_(), po.getClass().getCanonicalName() + "主键 " + pomapper.getPkName_() + " 不能为空"); SqlAndParameters> sp = pomapper.getSingleSql_(); List list = this.select(sp.getSql(), sp.getParameters(), po); return getUnique(list); } /** * @see com.walker.jdbc.BaseDao#get(T, String, Map< String, Object> ) */ @Override public > T get(T po, String where, Map parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(where, "where 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = pomapper.getSelectSql_(where, parameters); List list = this.select(sp.getSql(), sp.getParameters(), po); return getUnique(list); } @Override public > T get(T po, String where, Object[] parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(where, "where 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters sp = pomapper.getSelectSql_(where, parameters); List list = this.select(sp.getSql(), sp.getParameters(), po); return getUnique(list); } @Override public T get(String sql, Map parameters, RowMapper rowMapper) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); Assert.notNull(rowMapper, "rowMapper 不能为空!"); List list = this.select(sql, parameters, rowMapper); return getUnique(list); } @Override public > T get(String sql, Map parameters, T po) throws DataAccessException { return this.get(sql, parameters, this.convertToMapper(po)); } @Override public T get(String sql, Object[] parameters, RowMapper rowMapper) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); Assert.notNull(rowMapper, "rowMapper 不能为空!"); List list = this.select(sql, parameters, rowMapper); return getUnique(list); } @Override public > T get(String sql, Object[] parameters, T po) throws DataAccessException { return this.get(sql, parameters, this.convertToMapper(po)); } /** * @see com.walker.jdbc.BaseDao#get(String, Map< String, Object> ) */ @Override public Map get(String sql, Map parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); List> list = this.select(sql, parameters); return getUnique(list); } /** * @see com.walker.jdbc.BaseDao#get(String, Object[]) */ @Override public Map get(String sql, Object[] parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); List> list = this.select(sql, parameters); return getUnique(list); } /** * @see com.walker.jdbc.BaseDao#select(T, String, Map< String, Object> ) */ @Override public > List select(T po, String where, Map parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = pomapper.getSelectSql_(where, parameters); return this.select(sp.getSql(), sp.getParameters(), po); } /** * @see com.walker.jdbc.BaseDao#select(T, String, Object[]) */ @Override public > List select(T po, String where, Object[] parameters) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); // Assert.notNull(parameters, "parameters 不能为空!"); if(parameters == null){ parameters = new Object[]{}; } BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters sp = pomapper.getSelectSql_(where, parameters); return this.select(sp.getSql(), sp.getParameters(), po); } @Override public > List select(T po) throws DataAccessException { return this.select(po, null); } @Override public > List select(T po, Sorts.Sort sort) throws DataAccessException{ if(po == null){ throw new IllegalArgumentException("po is required!"); } // // po转成json对象,获取里面所有存在值的字段信息 // ObjectNode objectNode = JsonUtils.javaObjectToObjectNode(po); // // Map.Entry entry = null; // String fieldName = null; // String valueText = null; // JsonNode jsonNode = null; // // 字段名、字段值集合 // Map fieldNameAndValue = new HashMap<>(4); // StringBuilder where = new StringBuilder(Constants.SQL_NAME_WHERE); // int i = 0; // for(Iterator> it = objectNode.fields(); it.hasNext();){ // entry = it.next(); // if(entry.getKey().equals(Constants.PO_FIELD_PARAMETER)){ // // 额外的参数不属于表字段,剔除 // continue; // } // // jsonNode = entry.getValue(); // // // 2023-03-24 注意:这里jsonNode可能为 "null" 字符串 // if(jsonNode == null || jsonNode.toString().equals(StringUtils.NULL_STRING)){ //// logger.debug("........entry.getValue() = null"); // continue; // } // // // 字段名字,转成下划线数据库字段名 // fieldName = StringUtils.transferCamelName2Underline(entry.getKey()); // //// logger.debug("{}", jsonNode); // if(i > 0){ // where.append(StringUtils.CHAR_SPACE).append(Constants.SQL_NAME_AND); // } // // if(jsonNode.isTextual()){ // valueText = jsonNode.asText(); // logger.debug("valueText = {}", valueText); // if(StringUtils.isEmpty(valueText)){ // valueText = StringUtils.EMPTY_STRING; // } // if(valueText.indexOf(StringUtils.CHAR_PERCENT) >= 0){ // // like 查询 // where.append(StringUtils.CHAR_SPACE).append(fieldName).append(StringUtils.CHAR_SPACE) // .append(Constants.SQL_NAME_LIKE).append(StringUtils.CHAR_SPACE).append(StringUtils.SEPARATOR_COLON).append(fieldName); // } else { // // 普通字符串查询 // where.append(StringUtils.CHAR_SPACE).append(fieldName) // .append(StringUtils.CHAR_EQUALS).append(StringUtils.SEPARATOR_COLON).append(fieldName); // } // // 字符串会带双引号,奇怪!2023-03-24 // valueText = valueText.replace(StringUtils.STRING_DOUBLE_MARK, StringUtils.EMPTY_STRING); // fieldNameAndValue.put(fieldName, valueText); // // } else { // where.append(StringUtils.CHAR_SPACE).append(fieldName) // .append(StringUtils.CHAR_EQUALS).append(StringUtils.SEPARATOR_COLON).append(fieldName); // } // // if(jsonNode.isLong()){ // fieldNameAndValue.put(fieldName, jsonNode.longValue()); // } else if(jsonNode.isDouble()){ // fieldNameAndValue.put(fieldName, jsonNode.doubleValue()); // } else if(jsonNode.isInt()){ // fieldNameAndValue.put(fieldName, jsonNode.intValue()); // } else if(jsonNode.isFloat()){ // fieldNameAndValue.put(fieldName, jsonNode.floatValue()); // } else { // fieldNameAndValue.put(fieldName, jsonNode.asText()); // } // i++; // } Object[] result = JdbcUtils.acquireQueryCondition(po); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = pomapper.getSelectSql_(result[0].toString(), (Map)result[1]); if(logger.isDebugEnabled()){ logger.debug(sp.getSql()); logger.debug("fieldNameAndValue={}", result[1]); } String sql = sort == null? sp.getSql() : this.paginationHelper.getOrderBySql(sp.getSql(), sort); return this.select(sql, sp.getParameters(), po); // return this.select(sp.getSql(), sp.getParameters(), po); } /** * @see BaseDao#selectSplit(BasePo, String, Map, int, int) */ @Override public > GenericPager selectSplit(T po , String where, Map parameters, int currentPage, int pageSize) throws DataAccessException { Assert.notNull(po, "po 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); if(parameters == null){ parameters = new HashMap<>(2); } // Assert.notNull(splitPageInfo, "splitPageInfo 不能为空!"); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = pomapper.getSelectSql_(where, parameters); return this.selectSplit(sp.getSql(), sp.getParameters(), currentPage, pageSize, po); } @Override public > GenericPager selectSplit(T po, int currentPage, int pageSize, Sorts.Sort sort) throws DataAccessException{ Assert.notNull(po, "po 不能为空!"); Object[] result = JdbcUtils.acquireQueryCondition(po); BaseMapper pomapper = this.convertToMapper(po); SqlAndParameters> sp = pomapper.getSelectSql_(result[0].toString(), (Map)result[1]); if(logger.isDebugEnabled()){ logger.debug(sp.getSql()); logger.debug("fieldNameAndValue={}", result[1]); } String sql = sort == null? sp.getSql() : this.paginationHelper.getOrderBySql(sp.getSql(), sort); return this.selectSplit(sql, sp.getParameters(), currentPage, pageSize, po); // return this.selectSplit(sp.getSql(), sp.getParameters(), currentPage, pageSize, po); } @Override public > GenericPager selectSplit(T po, int currentPage, int pageSize) throws DataAccessException{ return this.selectSplit(po, currentPage, pageSize, (Sorts.Sort) null); } /** * @see com.walker.jdbc.BaseDao#select(String, Object[]) */ @Override public List> select(String sql, Object[] parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); printSql(new SqlAndParameters<>(sql, parameters)); return this.jdbcTemplate.query(sql, new ColumnMapRowMapper(), parameters); } /** * @see com.walker.jdbc.BaseDao#select(String, Object[], RowMapper ) */ @Override public List select(String sql, Object[] parameters, RowMapper rowMapper) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); printSql(new SqlAndParameters<>(sql, parameters)); return this.jdbcTemplate.query(sql, rowMapper, parameters); } /** * @see com.walker.jdbc.BaseDao#select(String, Object[], BasePo) */ @Override public > List select(String sql, Object[] parameters, T po) throws DataAccessException { return this.select(sql, parameters, this.convertToMapper(po)); } /** * @see com.walker.jdbc.BaseDao#selectSplit(String, Object[], int, int) */ @Override public MapPager selectSplit(String sql, Object[] parameters, int currentPage, int pageSize, Sorts.Sort sort) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); // Assert.notNull(parameters, "parameters 不能为空!"); // Assert.notNull(splitPageInfo, "splitPageInfo 不能为空!"); if(parameters == null){ parameters = new Object[]{}; } int cnt = this.queryForInt("select count(1) from (" + sql + ") total", parameters); MapPager pager = ListPageContext.createMapPager(null, currentPage, pageSize, cnt); // splitPageInfo.setTotalRowsAmount(cnt); // SqlAndParameters sp = this.paginationHelper.getPaginationSql(sql, parameters, splitPageInfo); SqlAndParameters sp = this.paginationHelper.getSqlPagingQuery(sql, parameters, pager, sort); printSql(sp); List> data = this.jdbcTemplate.query(sp.getSql(), new ColumnMapRowMapper(), sp.getParameters()); pager.setDatas(data); return pager; } @Override public MapPager selectSplit(String sql, Object[] parameters, int currentPage, int pageSize) throws DataAccessException { return this.selectSplit(sql,parameters, currentPage, pageSize, (Sorts.Sort) null); } /** * @see com.walker.jdbc.BaseDao#selectSplit(String, Object[], int, int, RowMapper ) */ @Override public GenericPager selectSplit(String sql, Object[] parameters, int currentPage, int pageSize , RowMapper rowMapper, Sorts.Sort sort) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); // Assert.notNull(parameters, "parameters 不能为空!"); Assert.notNull(rowMapper, "rowMapper 不能为空!"); if(parameters == null){ parameters = new Object[]{}; } int cnt = this.queryForInt("select count(1) from (" + sql + ") total", parameters); GenericPager pager = ListPageContext.createGenericPager(currentPage, pageSize, cnt); // splitPageInfo.setTotalRowsAmount(cnt); // SqlAndParameters sp = this.paginationHelper.getPaginationSql(sql, parameters, splitPageInfo); SqlAndParameters sp = this.paginationHelper.getSqlPagingQuery(sql, parameters, pager, sort); printSql(sp); List data = this.jdbcTemplate.query(sp.getSql(), rowMapper, sp.getParameters()); pager.setDatas(data); return pager; } @Override public GenericPager selectSplit(String sql, Object[] parameters, int currentPage, int pageSize, RowMapper rowMapper) throws DataAccessException{ return this.selectSplit(sql, parameters, currentPage, pageSize, rowMapper, null); } @Override public > GenericPager selectSplit(String sql , Object[] parameters, int currentPage, int pageSize, T po) throws DataAccessException { return this.selectSplit(sql, parameters, currentPage, pageSize, this.convertToMapper(po)); } /** * @see com.walker.jdbc.BaseDao#select(String, Map< String, Object> ) */ @Override public List> select(String sql, Map parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); printSql(new SqlAndParameters<>(sql, parameters)); return this.namedParameterJdbcTemplate.query(sql, parameters, new ColumnMapRowMapper()); } /** * @see com.walker.jdbc.BaseDao#select(String, Map< String, Object>, RowMapper ) */ @Override public List select(String sql, Map parameters, RowMapper mapper) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); printSql(new SqlAndParameters<>(sql, parameters)); return this.namedParameterJdbcTemplate.query(sql, parameters, mapper); } /** * @see com.walker.jdbc.BaseDao#select(String, Map< String, Object>, BasePo ) */ @Override public > List select(String sql, Map parameters, T po) throws DataAccessException { return this.select(sql, parameters, this.convertToMapper(po)); } /** * @see com.walker.jdbc.BaseDao#selectSplit(String, Map, int, int) */ @Override public MapPager selectSplit(String sql, Map parameters, int currentPage, int pageSize, Sorts.Sort sort) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); // Assert.notNull(parameters, "parameters 不能为空!"); if(parameters == null){ parameters = new HashMap<>(2); } int cnt = this.queryForInt("select count(1) from (" + sql + ") total", parameters); // splitPageInfo.setTotalRowsAmount(cnt); MapPager pager = ListPageContext.createMapPager(null, currentPage, pageSize, cnt); // SqlAndParameters> sp = this.paginationHelper.getPaginationSql(sql, parameters, splitPageInfo); SqlAndParameters> sp = this.paginationHelper.getSqlPagingQuery(sql, parameters, pager, sort); printSql(sp); List> data = this.namedParameterJdbcTemplate.query(sp.getSql(), sp.getParameters(), new ColumnMapRowMapper()); pager.setDatas(data); return pager; } @Override public MapPager selectSplit(String sql, Map parameters, int currentPage, int pageSize) throws DataAccessException { return this.selectSplit(sql, parameters, currentPage, pageSize, (Sorts.Sort) null); } /** * @see com.walker.jdbc.BaseDao#selectSplit(String, Map, int, int, RowMapper) */ @Override public GenericPager selectSplit(String sql, Map parameters , int currentPage, int pageSize, RowMapper rowMapper, Sorts.Sort sort) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); // Assert.notNull(parameters, "parameters 不能为空!"); Assert.notNull(rowMapper, "rowMapper 不能为空!"); if(parameters == null){ parameters = new HashMap<>(2); } int cnt = this.queryForInt("select count(1) from (" + sql + ") total", parameters); // splitPageInfo.setTotalRowsAmount(cnt); GenericPager pager = ListPageContext.createGenericPager(currentPage, pageSize, cnt); // SqlAndParameters> sp = this.paginationHelper.getPaginationSql(sql, parameters, splitPageInfo); SqlAndParameters> sp = this.paginationHelper.getSqlPagingQuery(sql, parameters, pager, sort); printSql(sp); List data = this.namedParameterJdbcTemplate.query(sp.getSql(), sp.getParameters(), rowMapper); pager.setDatas(data); return pager; } @Override public GenericPager selectSplit(String sql, Map parameters , RowMapper rowMapper, Sorts.Sort sort) throws DataAccessException { // 2023-10-24 前后端界面使用:PageSearch分页参数,如果存在优先使用。 PageSearch pageSearch = ListPageContext.getPageSearch(); if(pageSearch != null){ return this.selectSplit(sql, parameters, pageSearch.getPageIndex(), pageSearch.getPageSize(), rowMapper, sort); } else { return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), rowMapper, sort); } } @Override public GenericPager selectSplit(String sql , Map parameters, int currentPage, int pageSize, RowMapper rowMapper) throws DataAccessException { return selectSplit(sql, parameters, currentPage, pageSize, rowMapper, null); } /** * @see BaseDao#selectSplit(String, Map, int, int, BasePo) */ @Override public > GenericPager selectSplit(String sql , Map parameters, int currentPage, int pageSize, T po) throws DataAccessException { return this.selectSplit(sql, parameters, currentPage, pageSize, this.convertToMapper(po)); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //~ 以下方法简化分页参数 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override public > GenericPager selectSplit(String sql , Map parameters, T po) throws DataAccessException{ // 2023-04-01 前后端界面使用:PageSearch分页参数,如果存在优先使用。 PageSearch pageSearch = ListPageContext.getPageSearch(); if(pageSearch != null){ return this.selectSplit(sql, parameters, pageSearch.getPageIndex(), pageSearch.getPageSize(), po); } else { return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), po); } // return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), po); } /** * 分页查询,根据PO里面字段,做简单条件查询。 * @param po * @return * @param * @throws DataAccessException * @date 2023-04-21 */ @Override public > GenericPager selectSplit(T po, Sorts.Sort sort) throws DataAccessException{ PageSearch pageSearch = ListPageContext.getPageSearch(); if(pageSearch != null){ return this.selectSplit(po, pageSearch.getPageIndex(), pageSearch.getPageSize(), sort); } else { return this.selectSplit(po, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), sort); } } @Override public > GenericPager selectSplit(T po) throws DataAccessException{ return this.selectSplit(po, null); } @Override public > GenericPager selectSplit(String sql , Object[] parameters, T po) throws DataAccessException{ // 2023-04-01 前后端界面使用:PageSearch分页参数,如果存在优先使用。 PageSearch pageSearch = ListPageContext.getPageSearch(); if(pageSearch != null){ return this.selectSplit(sql, parameters, pageSearch.getPageIndex(), pageSearch.getPageSize(), po); } else { return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), po); } // return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), po); } @Override public GenericPager selectSplit(String sql, Object[] parameters, RowMapper rowMapper) throws DataAccessException{ // 2023-04-01 前后端界面使用:PageSearch分页参数,如果存在优先使用。 PageSearch pageSearch = ListPageContext.getPageSearch(); if(pageSearch != null){ return this.selectSplit(sql, parameters, pageSearch.getPageIndex(), pageSearch.getPageSize(),rowMapper); } else { return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), rowMapper); } // return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize(), rowMapper); } @Override public MapPager selectSplit(String sql, Object[] parameters) throws DataAccessException{ // 2023-04-01 前后端界面使用:PageSearch分页参数,如果存在优先使用。 PageSearch pageSearch = ListPageContext.getPageSearch(); if(pageSearch != null){ return this.selectSplit(sql, parameters, pageSearch.getPageIndex(), pageSearch.getPageSize()); } else { return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize()); } // return this.selectSplit(sql, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize()); } @Override public > GenericPager selectSplit(T po , String where, Map parameters) throws DataAccessException{ // 2023-04-01 前后端界面使用:PageSearch分页参数,如果存在优先使用。 PageSearch pageSearch = ListPageContext.getPageSearch(); if(pageSearch != null){ return this.selectSplit(po, where, parameters, pageSearch.getPageIndex(), pageSearch.getPageSize()); } else { return this.selectSplit(po, where, parameters, ListPageContext.getCurrentPageIndex(), ListPageContext.getCurrentPageSize()); } } // /** // * @see com.walker.jdbc.BaseDao#selectSplitEx(String, Map, SplitPageInfo, T) // */ // @Override // public > SplitPageInfo selectSplitEx(String sql, Map parameters, SplitPageInfo splitPageInfo, T po) throws DataAccessException { // return this.selectSplitEx(sql, parameters, splitPageInfo, this.convertToMapper(po)); // } /** * @see com.walker.jdbc.BaseDao#execute(String, Object[]) */ @Override public int execute(String sql, Object[] parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); printSql(new SqlAndParameters<>(sql, parameters)); return this.jdbcTemplate.update(sql, parameters); } /** * @see com.walker.jdbc.BaseDao#execute(String, Map< String, Object> ) */ @Override public int execute(String sql, Map parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); printSql(new SqlAndParameters<>(sql, parameters)); return this.namedParameterJdbcTemplate.update(sql, parameters); } /** * @see com.walker.jdbc.BaseDao#queryForInt(String, Object[]) */ @Override public int queryForInt(String sql, Object[] parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); Integer res = this.queryForObject(sql, parameters, Integer.class); if (res == null) { throw new PersistenceException("查询结果为空,不能转换为int"); } return res; } /** * @see com.walker.jdbc.BaseDao#queryForInt(String, Map< String, Object> ) */ @Override public int queryForInt(String sql, Map parameters) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); Integer res = this.queryForObject(sql, parameters, Integer.class); if (res == null) { throw new PersistenceException("查询结果为空,不能转换为int"); } return res; } /** * @see com.walker.jdbc.BaseDao#queryForObject(String, Object[], Class ) */ @Override public T queryForObject(String sql, Object[] parameters, Class clazz) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); List list = this.select(sql, parameters, new SingleColumnRowMapper(clazz)); return getUnique(list); } private T getUnique(List list) { if (StringUtils.isEmptyList(list)) { return null; } else if (list.size() > 1) { throw new PersistenceException("期望返回一条记录,实际返回 " + list.size() + " 条记录!"); } else { return list.get(0); } } /** * @see com.walker.jdbc.BaseDao#queryForObject(String, Map, Class) */ @Override public T queryForObject(String sql, Map parameters, Class clazz) throws DataAccessException { Assert.notNull(sql, "sql 不能为空!"); Assert.notNull(parameters, "parameters 不能为空!"); List list = this.select(sql, parameters, new SingleColumnRowMapper(clazz)); return getUnique(list); } /** * @see com.walker.jdbc.BaseDao#execCall(String, Object[]) */ @Override public void execCall(final String functionName, final Object[] parameters) throws DataAccessException { Assert.notNull(functionName, "functionName 不能为空!"); printSql(new SqlAndParameters<>(functionName, parameters)); this.jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { CallableStatement cs = con.prepareCall(functionName); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { cs.setObject(i + 1, parameters[i]); } } return cs; } }, new CallableStatementCallback() { @Override public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { cs.execute(); return null; } }); } /** * @see com.walker.jdbc.BaseDao#execCall(String, Object[], Class ) */ @Override public T execCall(final String functionName, final Object[] parameters, final Class clazz) throws DataAccessException { Assert.notNull(functionName, "functionName 不能为空!"); printReturnCall(functionName, parameters); return this.jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { CallableStatement cs = con.prepareCall(functionName); cs.registerOutParameter(1, Types.NVARCHAR); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { cs.setObject(i + 2, parameters[i]); } } return cs; } }, new CallableStatementCallback() { @Override public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { cs.execute(); cs.getResultSet(); return (T) getStatementValue(cs, 1, clazz); } }); } private void printReturnCall(String functionName, Object[] parameters) { if (this.isShowSql()) { List ps = new ArrayList<>(); ps.add("?"); if (parameters != null) { Collections.addAll(ps, parameters); } Matcher matcher = ARRAY_PARAMETER_PLACEHOLDER.matcher(functionName); StringBuffer sb = new StringBuffer(); int i = 0; while (matcher.find()) { matcher.appendReplacement(sb, getSqlParamValue(ps.get(i++))); } matcher.appendTail(sb); logger.info("{}", sb); } } private String getSqlParamValue(Object value) { if (value == null) { return "null"; } if (value instanceof String || value instanceof java.util.Date) { return "'" + StringSqlUtils.escapeSql(value.toString()) + "'"; } else { return value.toString(); } } /** * 获取返回值 * * @param cs 存储过程调用语句 * @param index 索引 * @param requiredType 类型 * @return requiredType类型数据 * @throws SQLException sql异常 */ private Object getStatementValue(CallableStatement cs, int index, Class requiredType) throws SQLException { Object value; // Explicitly extract typed value, as far as possible. if (String.class == requiredType) { return cs.getString(index); } else if (boolean.class == requiredType || Boolean.class == requiredType) { value = cs.getBoolean(index); } else if (byte.class == requiredType || Byte.class == requiredType) { value = cs.getByte(index); } else if (short.class == requiredType || Short.class == requiredType) { value = cs.getShort(index); } else if (int.class == requiredType || Integer.class == requiredType) { value = cs.getInt(index); } else if (long.class == requiredType || Long.class == requiredType) { value = cs.getLong(index); } else if (float.class == requiredType || Float.class == requiredType) { value = cs.getFloat(index); } else if (double.class == requiredType || Double.class == requiredType || Number.class == requiredType) { value = cs.getDouble(index); } else if (BigDecimal.class == requiredType) { return cs.getBigDecimal(index); } else if (java.sql.Date.class == requiredType) { return cs.getDate(index); } else if (Time.class == requiredType) { return cs.getTime(index); } else if (Timestamp.class == requiredType || java.util.Date.class == requiredType) { return cs.getTimestamp(index); } else if (byte[].class == requiredType) { return cs.getBytes(index); } else if (Blob.class == requiredType) { return cs.getBlob(index); } else if (Clob.class == requiredType) { return cs.getClob(index); } else { throw new PersistenceException("不支持的类型" + requiredType + "!"); } return value; } /** * @see com.walker.jdbc.BaseDao#execBatchUpdate(String, List ) */ @Override public int execBatchUpdate(String sql, List parametersList) throws DataAccessException { Assert.notNull(sql, "sql不能为空!"); Assert.notNull(parametersList, "parametersList不能为空!"); if (parametersList.size() == 0) { throw new PersistenceException("parametersList不能为空!"); } int[] temp; if (parametersList.get(0) instanceof Map) { Map[] params = parametersList.toArray(new Map[parametersList.size()]); temp = this.namedParameterJdbcTemplate.batchUpdate(sql, params); } else if (parametersList.get(0).getClass().isArray()) { temp = this.jdbcTemplate.batchUpdate(sql, (List) parametersList); } else { throw new PersistenceException("parametersList内容类型参数不合法!"); } int result = 0; if (temp != null) { for (int v : temp) { result += v; } } return result; } @Override public void update(String sql) { } @Override public int update(String sql, Object[] args) { return 0; } @Override public List sqlQuery(String sql, RowMapper rowMapper) { return null; } @Override public List sqlQuery(String sql, Object[] args, RowMapper rowMapper) { return null; } @Override public List> sqlQueryListMap(String sql, Object[] args) { return null; } @Override public GenericPager sqlGeneralQueryPager(String sql, Object[] args, RowMapper rowMapper) { return null; } @Override public GenericPager sqlGeneralQueryPager(String sql, Object[] args, RowMapper rowMapper, int pageIndex) { return null; } @Override public GenericPager sqlGeneralQueryPager(String sql, Object[] args, RowMapper rowMapper, int pageIndex, int pageSize) { return null; } @Override public T sqlMathQuery(String sql, Object[] args, Class clazz) { return null; } @Override public List sqlListObjectWhereIn(String sql, RowMapper rowMapper, SqlParameterSource paramSource) { return null; } @Override public List> queryListObjectWhereIn(String sql, SqlParameterSource paramSource) { return null; } @Override public void execute(final String sql, final Object[] parameters, final RowMapper rowMapper, final RowExecution rowExecution) { this.jdbcTemplate.execute(sql, new PreparedStatementCallback() { @Override public T doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException { ps.setFetchSize(512); if (parameters != null) { for (int i = 0; i < parameters.length; i++) { ps.setObject(i + 1, parameters[i]); } } printSql(new SqlAndParameters<>(sql, parameters)); ResultSet rs = ps.executeQuery(); try { while (rs.next()) { T t = rowMapper.mapRow(rs, 1); rowExecution.execute(t); } } catch (Exception e) { throw new PersistenceException(e); } finally { org.springframework.jdbc.support.JdbcUtils.closeResultSet(rs); } return null; } }); } @Override public > void execute(final String sql, final Object[] parameters, final T po, final RowExecution rowExecution) { this.execute(sql, parameters, this.convertToMapper(po), rowExecution); } }