本篇文章来介绍下smile中关于数据库分页查询操作的方法:
Smile中主通过实现接口 org.smile.db.sql.page. DialectPage 来进行提供数据库分页查询功能,smile已经实现了常用数据库的分页接口 ,接口代码如:
package org.smile.db.sql.page; /** * 方言分页语句接口 * @author strive * */ public interface DialectPage { /** * 总条数语句 * @return */ public String getCountSql(); /** * 数据库句 * @return */ public String getDataSql(int page,int size); }
在 smile-1.0.jar中对接口提供了五种实现,分别如下:
- MySQLDialectPage 适用于mysql数据库
- OracleDialectPage 适用于oracle数据库
- RowNumberDialectPage 适用于 row_number() 函数的数据库 如 sql2005以上版本、DB2、APACHE_DERBY 等数据库
- SQL2000DialectPage 适用于 sql2000以上版本
- SQLServerDialectPage 适用于 sql2005以上版本
分页查询的结果是一个封闭了数据与分页信息的对象:
package org.smile.db; import java.util.List; /** * 分页数据 * @author strive * */ public class PageModel { /** * 数据 */ private List rows; /** * 总条娄 */ private long total; /** * 一页条数 */ private int size=20; /** * 当前页 */ private int page; /** * 总页数 */ private long totalPages; public List getRows() { return rows; } public void setRows(List rows) { this.rows = rows; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public long getTotalPages() { return totalPages; } public void setTotalPages(long totalPages) { this.totalPages = totalPages; } /** * 重写toString */ public String toString(){ StringBuffer str=new StringBuffer("[page="+page+",size="+size+",totalPages="+totalPages); str.append(",total="+total+",rows="+rows+"]"); return str.toString(); } }
一、使用countSql,dataSql分页,这是底层的方法,使用于没有实现接口的数据库类型:
SQLRunner runner=new SQLRunner(conn); PageModel pageModel=runner.queryPageSQL(countSql, dataSql, page, size);
二、自定义实现接口方法调用,使用于没有实现接口的数据库类型.
Connection conn=DbManager.getConnection(); PageModel pageModel=runner.queryPageSQL(dialectPage, page, size) ;
dialectPage 为实现DialectPage 接口的对象。
三、使用smile中定义好的分页方言接口进行分页查询:
1、指定方言分页接口的实现类对象,进行分页查询:
SQLRunner runner=new SQLRunner(conn); String sql="select * from test where name like ? "; try { //mysql PageModel pageModel=runner.queryPageSQL(new MySQLDialectPage(sql), new Object[]{"%胡%"}, 2, 20); }finally{ runner.closeConn(); }
2、可以使用指定方言的形式进行分页查询:
Smile中的预定义方言只有:
/** * ORACLE数据库 */ public static final int ORACLE=0; /** * sqlserver 2000以上版本 */ public static final int SQLSERVER2000=1; /** * sqlserver 2005以上版本 */ public static final int SQLSERVER2005=2; /** * mysql 数据库 */ public static final int MYSQL=3; /** * hsql */ public static final int HSQL=4; /** * db2数据库 */ public static final int DB2=5; public static final int APACHE_DERBY=6;
SQLRunner runner=new SQLRunner(conn,new ArrayRowHandler()); //设置方言为sql2005 如不设置 默认为oralce方言 runner.setDbDialect(Dialect.SQLSERVER2005); String sql="select * from test where name like ? "; try { //这样也可以对sql2005以上版本的数据库分页 PageModel pageModel=runner.queryPageSQL(sql, new Object[]{"%胡%"}, 2, 20); }finally{ runner.closeConn(); }
【注】如不是预定义的方言数据库那那就只能使用指定接口的方式进行分页查询。
【smile-1.0.jar下载】 http://hzs0502030128.iteye.com/blog/1471505