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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-17 03:31   14   0

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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP