java封装sqlserver,封装 sqlserver2005 以上的 hibernate 方言 Dialect

在数据库的查询中,分页是必不可少的。在很久以前用 sqlserver 2000 的时候,经常用内存分页或者存储过程分页。但内存分页效率实在很低,而且只适合数据量小的情况 。 从sqlserver 2005 以上,分页查询就好做很多,提供了一个row_number, 这个做分页比较好用。当然你仍然可以利用存储过程,写一个公用的分页存储过程。具体我就不写了,原理很简单,传入要查询的SQL 语句,得到所有数据,根据PAGE SIZE 计算ROW_NUMBER, 然后再包装一个SQL语句就可以了。但这里是用Hibernate做,所以直接实现Hibernate Dialect 方言比较好package com.ruijie.spl.common.dialect;

/**

* SQLServer2005的Dialect,主要封装2005的高效分页语句

*

*/

import org.hibernate.dialect.SQLServerDialect;

import com.ruijie.spl.common.exception.RgsplRuntimeException;

public class SQLServer2005Dialect extends SQLServerDialect {

public SQLServer2005Dialect() {

super();

}

public String getLimitString(String querySelect, int offset, int limit) {

String[] querySelects = getQuerySelects(querySelect);

StringBuffer result = new StringBuffer(querySelect.length() + 100);

result.append("select * from(");

result.append(querySelects[0]);

result.append(",row_number()over(");

result.append(querySelects[2]);

result.append(") as row");

result.append(querySelects[1]);

result.append(") tmp where tmp.row between ");

result.append(offset+1);

result.append(" and ");

result.append(limit);

return result.toString();

}

// 通过sql语句,得到相应的select、from and where、order by三条语句

private String[] getQuerySelects(String querySelect) {

String[] result = new String[3];

if (querySelect.indexOf(" from ") == -1

|| querySelect.indexOf(" order by ") == -1) {

throw new RgsplRuntimeException("不支持不带from和order by的分页查询语句");

}

String select = querySelect.substring(0, querySelect.indexOf(" from "));

//while (select.endsWith(" ")) {

//select.substring(0, select.length() - 1);

//}

result[0] = select;

result[1] = querySelect.substring(querySelect.indexOf(" from "),

querySelect.indexOf(" order by "));

result[2] = querySelect.substring(querySelect.indexOf(" order by "));

return result;

}

public boolean supportsLimitOffset() {

return true;

}

}

其实也是包装SQL语句而已,用来实现分页。当然是从hibernate 的sqldialect 上继承过出来的。例子中的异常类可以自己补上,或者换成你自己想要的异常类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值