数据库端分页的写法(即所谓的真分页)

本文介绍了数据库端分页的模板,适用于SQLSever、Oracle和MySQL三种数据库,并提供了对应的SQL查询语句。同时,还分享了使用Java JDBC方式连接数据库的基本步骤和示例代码,包括加载驱动、建立连接、执行SQL和处理结果集等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写代码的时候有很多的时候遇到和数据查询相关的知识,然后就稍微总结了一下关于数据库端分页(真分页)的模板,希望对大家有所帮助吧:

首先,现在常用的数据库有三种(SQLSever)、Oracle、和MySQL,那么我们就按照这三种数据库书写分页的模板:


一、SQLSever:  select top(页面显示的信息数目)  列,列  from 表名  where   条件(select  top(页面大小*(索引页-1))  索引列名   from   表名)::注意此处的索引列必须是非空的唯一列;



二、Oracle:select   列名,列名 from (select  rownum    任意别名(r),表名.*  from   表  where  rownum<=最大行数 ) where  r>起始页;




三、MySQL: select  列名,列名 from 表 limit  起始页,页大小:::注意,此处的起始页不被包含(即如果你写的起始页为1,那么会从第二页开始显示)



插播别的消息:::(简单整理了一下,在java中连接数据库的连接的写法)

ava连接数据库(jdbc的方式)的通用公式。

第一步,先导入对应数据库的jar包;

第二步,新建一个包dao,然后在dao包下建立一个类BaseDAO(包名和类名都是可变的,用者可以自定义);

第三步,开始书写java连接数据库的语句

①加载数据库驱动(即Class.fromName(DriverName);→String DriverName="a" (a的值随数据库的不同有不同的写法,例如mysql数据库的写法为:“com.mysql.jdbc.Driver”);sqlserver的写法为:"com.microsoft.jdbc.sqlserver.SQLServerDriver";Oracle的写法为:”oracle.jdbc.driver.OracleDriver“);

②建立连接对象:Connection con =new Connection();  

③获得连接对象库驱动:con=DriverManager.getConnection(url,sqlname,sqlpassword);

(其中url和sqlname和sqlpassword有不同的写法:

mysql的写法:”jdbc:mysql://localhost:3306/数据库名“  sqlname="数据库用户名"  sqlpassword=”数据库用户对象“;

sqlserver的写法:url=”jdbc:microsoftsqlserver://localhost:1433;DatabaseName="数据库名称"“  sqlname="数据库用户名"  sqlpassword=”数据库用户对象“

Oracle的写法:”jdbc:oracle:thin:@localhost:1521:数据库名称“        sqlname="数据库用户名"  sqlpassword=”数据库用户对象“

④创建查询语句:PreparedStatement ps=con.preparestatement("需要执行的sql语句");

⑤创建查询结果集:ResultSet rs=ps.executequery();


以oracle为例的书写样例代码:

创建数据库连接对象:

public class BaseDAO {
	public Connection getCon(){
		Connection con=null;
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:neuedu","scott","123");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return con;
		
	}
使用数据库连接对象来完成对数据库的操作:
public class MessageDAOImpl extends BaseDAO{
	Connection con=null;
	PreparedStatement ps=null;
	ResultSet rs=null;
	//实现保存一条数据
	public int save(Message message){
		int result=0;
		con=getCon();
		String sql="insert into Message values(?,?,to_date(?,'yyyy-mm-dd,hh24:mi:ss'))";
		try {
			ps=con.prepareStatement(sql);
			ps.setString(1,message.getMessage());
			ps.setString(2, message.getAuthor());
			ps.setString(3,message.getPostTime());
			rs=ps.executeQuery();
			if(rs.next()){
				result=1;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			closeAll(con,ps,rs);
		}
		return result;
	}

其中closeAll()方法为一个关闭数据库连接的方法,其中是用了con.close() and rs.close() and ps.close() 三个关闭方法。


用法:不用写连接数据库等多余代码(在ConnLink.java文件中修改一下相关属性就可以了,如果不想写分页,在ConnLink.java文件中DBlink()方法可以返回一个Statement对象,然后就可以利用这个返回值去写你想要的代码了),只要建立一个Page对象,调用SelectRS()方法,将SQL语句当前页码和每页要显示的条数正确的写入。SelectRS()会自动返回一个结果集rs,然后用rs遍历输出结果。用getFrist()、getBack()、getLast()、getNext()等方法进行取得上一页的页码,下一面的页码就可以了。 看了之后是不是很心动呢~~~ HOHO~~其实我的代码有很多不足,例如:是不是可以做成通用的分页?也可以把DBlink()中的conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jiuzhou","root","123456");用的连接参数写在xml中生成一个JAR包,这样才更有扩展性,你说呢~~。希望高手能继续改良,让这段代码更精一些。HOHO~~~~改完之的一定要发到网上供大家参考和使用。 刚刚才发现Page.java文件是空的,在这里我就加上吧!实在是不好意思了 package com.SpreadPage; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.DateBase.*; public class Page extends ConnLink{ private Statement stmt=null; private ResultSet rs=null; private int row=0; private int num=0; private int page=0; private int list=0; //搜索去向 搜索条件 当前第几页 每页条数 public ResultSet SelectRS(String select,int page_num,int page) { this.num=page_num; this.page=page; String sql=select+" limit "+(page_num*page)+","+(page_num*page+page); //System.out.println(sql); try { stmt=DBlink(); rs=stmt.executeQuery(select); rs.first(); rs.last(); this.row=rs.getRow(); System.out.println(sql); if(rs!=null) { rs.close(); } if(stmt==null) { System.out.println("Stmt无连接"); return null; } rs=stmt.executeQuery(sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } //获得总记录数 public int getRow() { return row; } //第一页 public int getFrist() { return 0; } //最后一页 public int getBack() { if(getRow()%page==0) { return getRow()/page; } return (getRow()/page)+1; } //上一页 public int getLast() { if(num<=0) { return 0; } return (num-1); } //下一页 public int getNext() { int back=getBack(); if(num>=back) { return num; } return (num+1); } //当前页的条数 public int getNow() { try { rs.first(); rs.last(); list=rs.getRow(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } //当前第几页 public int getPage() { int sum=(num*page-page)+1; if(getRow()<sum) return 0; return sum; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值