JDBC(5)----------数据批处理及数据库的分页机制实现分页查询

1、批处理

Batch是一个JDBC中的批处理操作,当拥有大量数据一次插入数据库的时候,如果一条一条插入势必会浪费时间,这时候,我们利用addBatch()和executeBatch()能节省大量时间;

例如:

Person1.java

public class Person1 {
	int id;
	String name;
	String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Person1() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Person1(int id, String name, String password) {
		super();
		this.id = id;
		this.name = name;
		this.password = password;
	}

}

JDBCUtil.java在JDBC(3)中详细说明

test.java测试批处理命令

        @Test
	public void insertPerson1(){
		Connection conn = JDBCUtil.getConnection();
		PreparedStatement ps = null;
		String sql = "insert into person1 values(?,?,?)";
		try {
			int count=1;
			
			ps = conn.prepareStatement(sql);
			for(int i=1;i<100000;i++){
				Person1 p = new Person1(i,"su"+i,"124"+i);
				System.out.println(p);
				ps.setInt(1, p.getId());
				ps.setString(2, p.getName());
				ps.setString(3, p.getPassword());
				ps.addBatch();
				count++;
				if(count%1200==0){//当Batch缓冲区中有1200个数据时候,就插入数据库一次
					//最多执行百次,因为游标最多打开次数为百个
					ps.executeBatch();
				}
			}
			ps.executeBatch();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtil.closeAll(ps, null, null);
		}
	}

如果想看时间差,可自行测试;

时间戳:

long time = System.currentTimeMillis();//获取一个时间戳

 

2、实现分页;

首先用java模拟一下分页:

代码如下:

package com.baizhi.test.forty;

import java.util.Scanner;

public class Test41 {
	public static void main(String[] args) {
		/*
		 * 加入我有这样一个需求,一个数据库中有110条数据,
		 * 现在每页要显示20条,用java模拟一下实现过程
		 */
		Scanner sc = new Scanner(System.in);
		final int dataCount = 101;
		final int perPageCount = 20;
		int beginNum = 0;
		int endNum = 0;
		//首先,我要计算一下这个数据库中的数据一共要分多少页
		int pageCount = dataCount/perPageCount+1;  //一共6页
		//先判断页码是否正确
		System.out.println("输入页码:");
		int pageNum=sc.nextInt();
		if(pageNum>pageCount && pageNum<0){
			throw new RuntimeException("输入页码有误!");
		}
		//最后一页应该是endNum为最后一条数据
		beginNum = perPageCount*(pageNum-1)+1;
		if(pageNum == pageCount){
			endNum = dataCount;
			System.out.println(beginNum+"条数据到"+endNum+"条数据");
			return ;
		}
		//前面5页都是同一个算法
		endNum = perPageCount*pageNum;
		System.out.println(beginNum+"条数据到"+endNum+"条数据");
	}
}

在JDBC操作数据库中,实现分页有很多种两种非常典型的是:

a)通过ResultSet的光标实现分页:

通过ResultSet的移动光标,可以设置ResultSet对象中记录的起始位置和结束位置,来实现数据的分页显示,优点是在各种数据库上通用,缺点是占用大量的资源,不适合数据量大的时候。

b)通过数据库机制进行分页:

很多数据库都提供了分页机制,如SQL Server中提供的top关键字,MySql数据库提供的limit关键字,他们可以设置返回的记录数。

这种机制优点是减少数据库资源的开销,提高程序性能,缺点是只针对一种数据库通用。

下面介绍通过数据库机制进行分页的实现代码:

@Override
	/*
	 * 通过这个方法获取数据库中一共多少条数据
	 */
	public int dataCount() {
		Connection conn = JDBCUtil.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		int pageCount = 0;
		String sql = "select count(rownum) from person";
		try{
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			if(rs.next()){
				pageCount = rs.getInt(1);
			}
		}catch(Exception e){
			JDBCUtil.closeAll(ps, conn, rs);
		}
		return pageCount;
	}

核心代码:

@Override
	public List<Person> fenye(int pageNum) {
		PersonDao  person = new PersonDaoImpl(); 
		List<Person> list = new ArrayList<Person>();
		Connection conn = JDBCUtil.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		int dataCount = person.dataCount();
		String sql = "select * from (select p.*,rownum rn from "
				+ "(select * from person order by id asc) p) "
				+ "where rn>=? and rn<=?";
		try{
			//如果一页有2行数据    一共7条数据   组多可以分4页
			if(pageNum>(dataCount/2+1) || pageNum<1){
				System.out.println("页数超过范围!");
				return null;
			}
			//如果不是最后一页beginNum和endNum标号如下
			int beginNum = (pageNum-1)*2+1;
			int endNum = endNum= pageNum*2;
			//如果pageNum是最后一页
			if((dataCount/2+1)==pageNum){
				//最后一条数据的标号是数据的总条数
				endNum = dataCount;
			}
			
			ps = conn.prepareStatement(sql);
			ps.setInt(1, beginNum);
			ps.setInt(2, endNum);
			rs = ps.executeQuery();
			while(rs.next()){
				Person p = new Person(
						rs.getInt(1),
						rs.getString(2),
						rs.getString(3),
						rs.getString(4),
						rs.getString(5),
						rs.getString(6),
						rs.getDate(7)
						);
				list.add(p);
			}
		}catch(Exception e){
			JDBCUtil.closeAll(ps, conn, rs);
		}
		return list;
	}

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值