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;
}