peternameyakj
2024-07-21 25e1d54f2295934446473fe85cf022fa6140b4e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package kernel.web;
 
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
 
public class JdbcTemplateWithPaging {
    
    private static final Logger logger = LoggerFactory.getLogger(JdbcTemplateWithPaging.class);
    
    private JdbcTemplate jdbcTemplate;
    
    private NamedParameterJdbcOperations namedParameterJdbcTemplate;
 
    public List<Map<String, Object>> queryPage(String sql, Object[] args, int start, int limit) {
        if ((start <= 0) && (limit <= 0)) {
            return this.jdbcTemplate.queryForList(sql, args);
        }
        if (start <= 1) {
            sql = getLimitString(sql, false);
            args = ArrayUtils.add(args, args.length, Integer.valueOf(limit));
        } else {
            sql = getLimitString(sql, true);
            args = ArrayUtils.add(args, args.length, Integer.valueOf(start + limit));
            args = ArrayUtils.add(args, args.length, Integer.valueOf(start));
        }
 
        logger.info("paging sql : \n" + sql);
        return this.jdbcTemplate.queryForList(sql, args);
    }
 
    public List<Map<String, Object>> queryPage(String sql, int start, int limit) {
        Object[] args = new Object[0];
        return queryPage(sql, args, start, limit);
    }
 
    public <T> List<T> queryPage(String sql, int start, int limit, RowMapper<T> rowMapper) throws DataAccessException {
        if ((start <= 0) && (limit <= 0)) {
            return this.jdbcTemplate.query(sql, rowMapper);
        }
        Object[] args = new Object[0];
        if (start <= 1) {
            sql = getLimitString(sql, false);
            args = ArrayUtils.add(args, args.length, Integer.valueOf(limit));
        } else {
            sql = getLimitString(sql, true);
            args = ArrayUtils.add(args, args.length, Integer.valueOf(start + limit));
            args = ArrayUtils.add(args, args.length, Integer.valueOf(start));
        }
 
        Pattern pattern = Pattern.compile("\\?");
 
        Matcher matcher = pattern.matcher(sql);
 
        for (int i = 0; i < args.length; matcher = pattern.matcher(sql)) {
            sql = matcher.replaceFirst(args[i].toString());
 
            i++;
        }
 
        logger.info("paging sql : \n" + sql);
        return this.jdbcTemplate.query(sql, rowMapper);
    }
 
    private String getLimitString(String sql, boolean hasOffset) {
        sql = sql.trim();
        boolean isForUpdate = false;
        if (sql.toLowerCase().endsWith(" for update")) {
            sql = sql.substring(0, sql.length() - 11);
            isForUpdate = true;
        }
 
        StringBuffer pagingSelect = new StringBuffer(sql.length() + 100);
        if (hasOffset) {
            pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
        } else {
            pagingSelect.append("select * from ( ");
        }
        pagingSelect.append(sql);
        if (hasOffset) {
            pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?");
        } else {
            pagingSelect.append(" ) where rownum <= ?");
        }
 
        if (isForUpdate) {
            pagingSelect.append(" for update");
        }
        return pagingSelect.toString();
    }
 
    public int queryCountBySql(String sqlStr) {
        return ((Integer) this.jdbcTemplate.queryForObject(sqlStr, Integer.class)).intValue();
    }
 
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
}