zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    ASP.NET 2.0个性化配置(profile)
    03 创建虚拟机
    一些新的Blender的视频教程
    [转载]虚拟家庭存档文件修改方法
    [转载]游戏开发中常用的设计模式
    批处理for命令详解(转)
    [转载]高效软件开发团队的特征
    软件构架师的特点
    一点SICP(Structure and Interpretation of Computer Programs) 资料 (转载加整理)
    [译]游戏编程入门(by David Astle)
  • 原文地址:https://www.cnblogs.com/Big-Boss/p/14750514.html
Copyright © 2011-2022 走看看