Java 手动拼接分页查询SQL语句

import org.apache.commons.lang3.StringUtils;

import java.util.HashSet;
import java.util.Set;

/**
 * TODO
 *
 */
public class PageSelectSqlTest {

    public static void main(String[] args) {
        String table = "T_student";
        Set<String> tableFieldSet = new HashSet<>();
        tableFieldSet.add("name");
        tableFieldSet.add("gender");
        tableFieldSet.add("age");
        String whereSql = "age >= 18";
        String dbType = "oracle";
        String sql = getSelectPageSql(table, tableFieldSet, 0, 2, whereSql, dbType);
        System.out.println(sql);
    }

    /**
     * 拼接分页查询SQL语句
     * @param table 数据库表名
     * @param tableFieldSet 要查询字段名集合
     * @param pageNum 页数
     * @param pageSize  每页查询数量
     * @param whereSql  where后面条件语句
     * @param dbType    数据库类型
     * @return
     */
    private static String getSelectPageSql(String table, Set<String> tableFieldSet, int pageNum, int pageSize, String whereSql, String dbType) {
        // 拼接SQL
        StringBuffer fieldSb = new StringBuffer();
        tableFieldSet.forEach(field -> { if (StringUtils.isNotBlank(field)) fieldSb.append(field).append(","); });
        String fieldStr = fieldSb.toString().substring(0, fieldSb.toString().lastIndexOf(","));
        StringBuffer sqlSb = new StringBuffer();
        int start = pageNum * pageSize;
        if ("sql_server".equalsIgnoreCase(dbType)) {
            sqlSb.append("select top ").append(pageSize).append(" ").append(fieldStr).append(" from ").append(table);
            if (pageNum == 0) {
                if (StringUtils.isNotBlank(whereSql)) {
                    sqlSb.append(" where ").append(whereSql);
                }
            } else {
                sqlSb.append(" t1 where t1.id > (select max(a.id) from (select top ").append(start).append(" t2.id from ").append(table).append(" t2");
                if (StringUtils.isNotBlank(whereSql)) {
                    sqlSb.append(" where ").append(whereSql);
                }
                sqlSb.append(" order by id) a)");
                if (StringUtils.isNotBlank(whereSql)) {
                    sqlSb.append(" and ").append(whereSql);
                }
            }
            sqlSb.append(" order by id");
        } else if ("mysql".equalsIgnoreCase(dbType)) {
            sqlSb.append("select ").append(fieldStr).append(" from " ).append(table);
            if (StringUtils.isNotBlank(whereSql)) {
                sqlSb.append(" where ").append(whereSql);
            }
            sqlSb.append(" order by id limit ").append(start).append(", ").append(pageSize);
        } else if ("oracle".equalsIgnoreCase(dbType)) {
            int end = (pageNum + 1) * pageSize;
            sqlSb.append("select ").append(fieldStr).append(" from (");
            sqlSb.append("select table1.*, ROWNUM rowno from (");
            sqlSb.append("select ").append(fieldStr).append(" from ").append(table);
            if (StringUtils.isNotBlank(whereSql)) {
                sqlSb.append(" where ").append(whereSql);
            }
            sqlSb.append(" order by id) table1 where ROWNUM <= ").append(end);
            sqlSb.append(") table2 where table2.rowno > ").append(start);
        } else if ("db2".equalsIgnoreCase(dbType)) {
            int end = (pageNum + 1) * pageSize;
            sqlSb.append("select ").append(fieldStr).append(" from (");
            sqlSb.append("select row_number() over() as rownum, ").append(fieldStr);
            sqlSb.append(" from ").append(table);
            if (StringUtils.isNotBlank(whereSql)) {
                sqlSb.append(" where ").append(whereSql);
            }
            sqlSb.append(" order by id) table1 where rownum > ").append(start).append(" and rownum <= ").append(end);
        }

        return sqlSb.toString();
    }
}

  测试结果:

--sqlserver
select top 2 gender,name,age from T_student where age >= 18 order by id

select top 2 gender,name,age from T_student where id > (
	select max(a.id) from (select top 2 t1.id from T_student t1 where age >= 18 order by id) a
	) and age >= 18 order by id
	
--mysql
select gender,name,age from T_student where age >= 18 order by id limit 0, 2

--orcale
select gender,name,age from (
	select table1.*, ROWNUM rowno from (
		select gender,name,age from T_student where age >= 18 order by id
	) table1 where ROWNUM <= 2
) table2 where table2.rowno > 0

--db2
select gender,name,age from (
	select row_number() over() as rownum,gender,name,age from T_student where age >= 18 order by id
) table1 where rownum > 0 and rownum <= 2

  

posted @ 2021-05-10 12:00  ヤBig、Bossづ  阅读(920)  评论(0编辑  收藏  举报