Util工具类 跨Oracle、MySQL通用分页查询
来源:互联网 发布:淘宝客佣金在哪设置 编辑:程序博客网 时间:2024/06/05 06:27
/** * * 跨Oracle、MySQL通用分页查询 */public class PagingUtil { public static final String MYSQL = "MYSQL"; public static final String ORACLE = "ORACLE"; private static Logger logger = Logger.getLogger(PagingUtil.class); private static String databaseType = null; /** * 获取数据库类型 * @return */ public static String getDatabaseType() { if (databaseType != null) { return databaseType; } Connection connection = null; try { JdbcTemplate jdbcTemplate = (JdbcTemplate) SpringUtil.getBean("jdbcTemplate"); connection = DataSourceUtils.getConnection(jdbcTemplate.getDataSource()); DatabaseMetaData databaseMetaData = connection.getMetaData(); String driverName = databaseMetaData.getDriverName(); if (connection != null) { connection.close(); connection = null; } if (StringUtils.isEmpty(driverName)) { return null; } else { driverName = driverName.toUpperCase(); if (driverName.indexOf(MYSQL) != -1) { databaseType = MYSQL; } else if (driverName.indexOf(ORACLE) != -1) { databaseType = ORACLE; } else { return null; } } return databaseType; } catch (Exception e) { logger.error(e.getMessage(), e); } finally { if (connection != null) { try { connection.close(); } catch (SQLException e) { logger.error(e.getMessage(), e); } } } return null; } /** * 获取通用于MySQL和Oracle数据库的分页语句 * @param sql 需要分页的sql语句,参数采用{0},{1}这样的方式,与params数组的数据一一对应 * @param pageable * @return */ public static String getPageSql(String sql, Pageable pageable) { return getPageSql(sql, null, pageable, false); } /** * 获取通用于MySQL和Oracle数据库的分页语句 * @param sql 需要分页的sql语句,参数采用{0},{1}这样的方式,与params数组的数据一一对应 * @param params 参数数组 * @param pageable * @return */ public static String getPageSql(String sql, Object[] params, Pageable pageable) { return getPageSql(sql, params, pageable, false); } /** * 获取通用于MySQL和Oracle数据库的分页语句 * @param sql 需要分页的sql语句,参数采用{0},{1}这样的方式,与params数组的数据一一对应 * @param params 参数数组 * @param pageable * @param isOrder 是否生成排序 true:生成排序,false不生成 * @return */ public static String getPageSql(String sql, Object[] params, Pageable pageable, boolean isOrder) { if (StringUtils.isEmpty(sql)) { return null; } /** * order by */ if (isOrder) { sql = addOrderToSql(sql, pageable); } /** * 根据数据库类型不同调用不同的方法 */ String databaseType = getDatabaseType(); if (MYSQL.equals(databaseType)) { return getMysqlSql(sql, params, pageable); } else if (ORACLE.equals(databaseType)) { return getOracleSql(sql, params, pageable); } return null; } /** * 获取通用于MySQL和Oracle数据库的分页语句 * @param sql sql语句 * @return 统计数量取字段:CNT */ public static String getCountSql(String sql) { return getCountSql(sql, null); } /** * 获取通用于MySQL和Oracle数据库的分页语句 * @param sql sql语句,参数采用{0},{1}这样的方式,与params数组的数据一一对应 * @param params 参数数组 * @return 统计数量取字段:CNT */ public static String getCountSql(String sql, Object[] params) { if (StringUtils.isEmpty(sql)) { return null; } String upperSql = sql.toUpperCase(); if (upperSql.indexOf(" FROM ") == -1) { return null; } /** * 格式化参数 */ if (params != null && params.length > 0) { MessageFormat messageFormat = new MessageFormat(sql); sql = messageFormat.format(params); } int index = upperSql.indexOf(" FROM "); StringBuilder sb = new StringBuilder(); sb.append("SELECT COUNT(1) CNT ") .append(sql.substring(index)); return sb.toString(); } /** * oracle 分页 rownum * @param sql 需要分页的sql语句,参数采用{0},{1}这样的方式,与params数组的数据一一对应 * @param params 参数数组 * @param pageable * @return */ private static String getOracleSql(String sql, Object[] params, Pageable pageable) { /** * 格式化参数 */ if (params != null && params.length > 0) { MessageFormat messageFormat = new MessageFormat(sql); sql = messageFormat.format(params); } if (pageable == null) return sql; StringBuilder sb = new StringBuilder(); sb.append("select * from (") .append("select rownum rn, a.* from(") .append(sql) .append(") a where rownum <= ") .append((pageable.getPageNumber() + 1) * pageable.getPageSize()) .append(") where rn > ") .append(pageable.getPageNumber() * pageable.getPageSize()); return sb.toString(); } /** * mysql分页 limit * @param sql 需要分页的sql语句,参数采用{0},{1}这样的方式,与params数组的数据一一对应 * @param params 参数数组 * @param pageable * @return */ private static String getMysqlSql(String sql, Object[] params, Pageable pageable) { /** * 格式化参数 */ if (params != null && params.length > 0) { MessageFormat messageFormat = new MessageFormat(sql); sql = messageFormat.format(params); } StringBuilder sb = new StringBuilder(); sb.append(sql); if (pageable != null) { sb.append(" LIMIT "); sb.append(pageable.getPageNumber() * pageable.getPageSize()); sb.append(" , "); sb.append(pageable.getPageSize()); } return sb.toString(); } /** * 传入sql语句,根据Pageable内参数加上order by语句 * @param sql 不带order by的语句 * @param pageable * @return */ public static String addOrderToSql(String sql, Pageable pageable) { if (pageable != null && !StringUtils.isEmpty(sql)) { Sort sort = pageable.getSort(); Iterator<Sort.Order> iterator = sort.iterator(); Sort.Order order; String direction; String property; /** * 包含排序语句 */ if (iterator.hasNext()) { StringBuilder sb = new StringBuilder(sql); sb.append(" order by "); while (iterator.hasNext()) { order = iterator.next(); direction = order.getDirection().toString(); property = order.getProperty(); sb.append(property).append(" ").append(direction).append(","); } return sb.substring(0, sb.length() - 1); } return sql; } else { return sql; } } /** * 计算总页数 * * @param totals 总记录数 * @param rows 每页显示数 * @return */ public static int getPages(Integer totals, Integer rows) { if (totals <= 0 || rows <= 0) { return 0; } int pages = totals / rows; if (totals % rows > 0) { pages++; } return pages; }}
// 使用demopublic List<Bond> findBondByNameSecond(String name) { Pageable pageable = new PageRequest(0, 10); StringBuilder sb = new StringBuilder(); sb.append("select t.tradingcode as tradingcode,t.secuabbr as secuabbr,t.exchangecode as exchangecode"); sb.append(" from BND_BASICINFO t"); sb.append(" left join BND_BONDTYPESWIND a"); sb.append(" on t.secucode = a.secucode"); sb.append(" where a.categorycodeii != '1000002990'"); sb.append(" and a.categorycodei in ('a101020500',"); sb.append(" 'a101020a00')"); sb.append(" and t.secuabbr like '%"); sb.append(name); sb.append("%' "); sb.append(" order by secuabbr "); String sql = PagingUtil.getPageSql(sb.toString(), pageable); List<Bond> list = jdbcTemplate.query(sql, new RowMapper<Bond>() { @Override public Bond mapRow(ResultSet resultSet, int i) throws SQLException { Bond bond = new Bond(); bond.setTradingcode(resultSet.getString("tradingcode")); bond.setSecuabbr(resultSet.getString("secuabbr")); bond.setExchangecode(resultSet.getString("exchangecode")); return bond; } }); return list;}
阅读全文
1 0
- Util工具类 跨Oracle、MySQL通用分页查询
- 分页通用工具类
- 通用分页工具类
- 通用分页工具类
- mysql & oracle 分页查询
- oracle mysql 分页查询
- mysql、oracle 分页查询
- Mysql分页查询通用存储过程
- Mysql分页查询通用存储过程
- mysql分页查询通用存储过程
- Mysql分页查询通用存储过程
- Mysql分页查询通用存储过程
- c# 通用分页查询类
- 通用的分页工具类
- java通用分页工具类
- DTO 通用分页工具类
- mysql,sqlServer,oracle分页查询
- oracle 与mysql分页查询
- jq给单/复选框添加checked属性无效的解决办法
- iOS 11开发教程(十)iOS11无线连接手机真机测试
- Java如何让程序一直运行,不停止
- 15.4 Content-Type:MIME 类型和字符集
- Joda-Time 用法
- Util工具类 跨Oracle、MySQL通用分页查询
- iOS算法总结-快速排序
- HTML常用标签
- 波纹按钮点击特效
- Java经典基础练习1-10
- java lz4压缩工具类
- Jetson TX2 开发记录
- Android查看应用包名package和launcher_activity名称的方法
- jzoj5436 【NOIP2017提高A组集训10.30】Group