• 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
    

      

  • 相关阅读:
    DOM2DOM3续
    总结 @ 在 C# 中的用法 (装载)
    ORACLE10G卸载过程
    .net中访问oracle数据库的几种方式(转载)
    试图运行项目时出错,无法启动调试。没有正确安装调试器。请运行安装程序安装或修复调试器
    设计模式 构造器
    设计模式 抽象工厂
    linq中日期格式转换或者比较,程序报错说不支持方法的解决办法
    bootstrap图标字体不出来问题的解决办法
    JavaScript对象属性访问的两种方式
  • 原文地址:https://www.cnblogs.com/Big-Boss/p/14750514.html
Copyright © 2020-2023  润新知