public <T> List<T> select( Class<T> clazz, String query, Map<String, Object> params, Integer offset, Integer limit) throws SQLException, InstantiationException, IllegalAccessException { List<T> resultList = new ArrayList<T>(); List<Object> paramList = new ArrayList<Object>(); // add offset and limit addRange(query, params, offset, limit); Pattern pattern = Pattern.compile("/#[\\0x20-0x7F]+?[\\0x20-0x7F]#/", Pattern.DOTALL); Matcher matcher = pattern.matcher(query); while (matcher.find()) { int start = matcher.start(); int end = matcher.end(); Object param = params.get(query.substring(start + 2, end - 2).trim()); query = query.substring(0, start) + "?" + query.substring(end, query.length()); paramList.add(params.get(param)); } PreparedStatement stmt = this.connection.prepareStatement(query); setParameter(stmt, paramList); ResultSet rs = stmt.executeQuery(); ResultSetMetaData meta = rs.getMetaData(); Map<String, ColumnInfo> columnMap = new HashMap<String, ColumnInfo>(); int columnLength = meta.getColumnCount(); for (int i = 0; i < columnLength; i++) { ColumnInfo columnInfo = new ColumnInfo(); columnInfo.setColumnName(meta.getColumnLabel(i)); columnInfo.setColumnType(meta.getColumnTypeName(i)); columnInfo.setColumnClass(meta.getColumnClassName(i)); columnMap.put(columnInfo.getColumnName(), columnInfo); } while (rs.next()) { T entity = clazz.newInstance(); Field[] fields = clazz.getFields(); for (Field field : fields) { ColumnInfo columnInfo = columnMap.get(field.getAnnotation(Column.class).name()); if (columnInfo != null) { if (String.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getString(columnInfo.getColumnName())); } else if (Integer.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getInt(columnInfo.getColumnName())); } else if (Double.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getDouble(columnInfo.getColumnName())); } else if (Long.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getLong(columnInfo.getColumnName())); } else if (Float.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getFloat(columnInfo.getColumnName())); } else if (Short.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getShort(columnInfo.getColumnName())); } else if (Byte.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getByte(columnInfo.getColumnName())); } else if (Boolean.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getBoolean(columnInfo.getColumnName())); } else if (Date.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getDate(columnInfo.getColumnName())); } else if (Timestamp.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getTimestamp(columnInfo.getColumnName())); } else if (Object.class.getName().equals(columnInfo.getColumnClass())) { field.set(entity, rs.getObject(columnInfo.getColumnName())); } } } resultList.add(entity); } return resultList; }