java使用JDBC连接数据库,提高查询大量数据速度

谭云瀚
2023-12-01

一、java使用JDBC连接数据库基本知识

1.JDBC的框架结构:

    java通过JDBC API接口,经由JDBC驱动程序管理器、JDBC Driver API 和 JDBC驱动程序访问下层的数据库。

2.JDBC连接数据库基本步骤:

    1.加载JDBC驱动程序

            a.加载Oracle JDBC驱动程序:

                   使用DriverManager类加载:
                        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver())
                    使用java.lang.Class类加载:
                        Class c =Class.forName("oracle.jdbc.driver.OracleDriver")
                     如果加载程序不存在就会抛出异常

             b.加载MySQL JDBC驱动程序:

                     使用DriverManager类加载:
                        DriverManager.registerDriver(new "org.gjt.mm.mysql.Driver()")
                    使用java.lang.Class类加载:
                        Class c =Class.forName(""org.gjt.mm.mysql.Driver"").newInstance()
                     "org.gjt.mm.mysql.Driver"是MySQL JDBC驱动程序的类名

              c.加载Microsoft SQL Server JDBC 驱动程序:

                     使用DriverManager类加载:
                        DriverManager.registerDriver(new com.microsoft.jdbc.sqlserver.SQLServerDriver())
                     使用java.lang.Class类加载:
                        Class c =Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")
         "com.microsoft.jdbc.sqlserver.SQLServerDriver"是Microsoft SQL Server JDBC驱动程序的类名                                      

               d.加载InterClient JDBC驱动程序:

                     使用DriverManager类加载:
                        DriverManager.registerDriver(new interbase.interclient.Driver())
                     使用java.lang.Class类加载:
                        Class c =Class.forName("interbase.interclient.Driver")
                     "interbase.interclient.Driver"是InterClient JDBC驱动程序的类名                                      

                e.加载PostgreSQL JDBC驱动程序:

                     使用DriverManager类加载:
                        DriverManager.registerDriver(new corg.postgresql.Driver())
                     使用java.lang.Class类加载:
                        Class c =Class.forName("corg.postgresql.Driver")
                     "corg.postgresql.Driver"是PostgreSQL JDBC驱动程序的类名                                                             

    2.创建数据库连接

               URL,User,Password是连接数据库需要的指定参数。

                 a.用Oracle thin 驱动连接Oracle数据库的URL:

                        jdbc:oracle:thin:@host:port:service_name
                        host是主机ip,port是端口,service_name是DB实例名

                 b.用Oracle OCI驱动连接Oracle数据库的URL:

                        jdbc:oracle:oci8:@host
                        host是tnsnames.ora文件中的一个TNSNAMES条目。

                 c.用Microsoft SQL Servier驱动连接SQL Server 的URL:

                        jdbc:microsoft:sqlserver://host:DatabaseName==Student

                 d.连接Interbase数据库的URL:

                        jdbc.interbase://host//d:Student/student.gdb

                 e.连接MySQL数据库的URL:

                        jdbc:mysql://host/myDB?

                 f.连接PostgrreSQL数据库的URL:

                        jdbc:postgresql://host/myDB?
            对于数据库(如Oracle)服务器端的驱动程序(如OracleDriver)来说不需要用URL进行连接,可以使用服务器端的默认连接,而且这种连接不需要关闭。
                        Connection conn=(new oracle.jdbc.driver.OracleDriver()).defaultConnection()

3.创建Statement

    Statement stmt = conn.createStatement()

4.执行Staement

    ResultSet rset = stmt.executeQuery("select * from table_a"); //查询语句
    int rowcount = stmt.executeUpdate("delete from table_a t where t.a1 = xxxx");//更新语句
    如果只能在程序运行时才知道SQL语句类型,可以使用Statement中的execute()成员方法动态地执行未知类型的语句。这个方法返回一个表示语句类型的布尔值,如果返回真,说明是查询语句,否则是更新语句。示例如下:
        Statement stmt = conn.createStatement();
        boolean result = stmt.execute(sql);

        if (resul){

            ResultSet rset = stmt.getResultSet();

        }else{
            int updateCount = stmt.getUpdateCount();
        }
    注意:boolean result = stmt.execute(sql);执行之后,就已经执行了语句了,所以后面不用再次执行,可以直接得到结果。

5.处理查询结果集

    Statement执行语句之后,将返回一个结果集对象ResultSet。每一个ResultSet对象都有一个游标(cursor)指向结果集的当前位置,游标的初始位置是在结果集的第一行之前。
    利用next()方法和循环语句可以方便的定位结果集的每个记录。示例如下:
        while (rset.next()) {
String sendtime = rset.getString(1);
String demobile = rset.getString(2);
String rcode = rset.getString(3);
        }

6.关闭数据库连接

    结束程序前要关闭结果集ResultSet对象和Statement对象。
        rset.close();
        stmt.close();
        conn.close();//关闭连接对象

二、连接数据库读取数据写入文件

示例(高效率):

    打开数据库连接类OracleDBa

import java.sql.Connection;
import java.sql.DriverManager;
public class OracleDBa {
/*
* 数据库连接
*/
public static Connection getConnection(String jdbc, String url,
String user, String password) { // 获得数据库连接
Connection conn = null;
try {
Class.forName(jdbc);
conn = DriverManager.getConnection(url, user, password);
System.out.println("连接数据库成功" + url);
} catch (Exception e) {
System.out.println("连接数据库失败" + url);
e.printStackTrace();
return conn;
}
return conn;
}
public static void CloseConnection(Connection oraConn) {
try {
if (oraConn != null)
oraConn.close();
} catch (Exception E) {
oraConn = null;
}
; // 释放数据库连接
}
}

    执行查询语句并处理(当查询结果是成百上千万行级的时候效率挺高)

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class db_select {

public static int db_49(int id, FileWriter fw, String tablename,
Connection con) {
String b = "";
int num = 0;
int one = 100;
Long old_time = System.currentTimeMillis();
Long new_time = System.currentTimeMillis();
String sql = "select    to_char(t.create_time,'yyyy/mm/dd hh24:mi:ss') 时间 ,t.desmobile 号码 ,"
+ "replace(replace(replace(t.content,chr(9),' '),chr(10),' '),chr(13),' ') 内容 ,"
+ "t.rcode 状态   from  "
+ tablename
+ "  t   "
+ "where t.id=" + id + " ";
try {
PreparedStatement stmt = (PreparedStatement) con.prepareStatement(
sql, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);     //设置连接属性statement以TYPE_FORWARD_ONLY打开
stmt.setFetchSize(1000);//设置fetch size参数,表示采用服务器端游标,每次从服务器取fetch_size条数据。
stmt.setFetchDirection(ResultSet.FETCH_REVERSE);
ResultSet rsc = stmt.executeQuery();
String create_times = "";
String desmobile = "";
String content = "";
String rcode = "";
while (rsc.next()) {
num += 1;
create_times = rsc.getString(1);
desmobile = rsc.getString(2);
content = rsc.getString(3);
rcode = rsc.getString(4);
b = b + create_times + "\t" + desmobile + "\t" + content + "\t"
+ rcode + "\r\n";
if (num % one == 0) {
fw.write(b);
fw.flush();
old_time = new_time;
new_time = System.currentTimeMillis();
System.out.println("写入---------" + num + "==="
+ (new_time - old_time));
b = "";
}
}
fw.write(b);
fw.flush();
rsc.close();
stmt.close();
} catch (SQLException e) {
System.out.println("查询异常");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return num;
}


}

    主类

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class output_mingxi {
/**
* @param args
*/

public static void main(String[] args) {
int username_id = "xxxx";
String username_49 = "xxxxx";
String passwd = "xxxx";
String driverClassName = "oracle.jdbc.driver.OracleDriver";
String dburl_49 = "jdbc:oracle:thin:@127.0.0.1:49:xxxx";
Connection oraConn49 = OracleDBa.getConnection(driverClassName,
dburl_49, username_49, passwd);
Long date1 = System.currentTimeMillis();
int num = 0;
try {
File newFile1 = new File("E:\\" + username_reg + "_mingxi.txt");
FileWriter fw = new FileWriter(newFile1, true);
System.out.println("开始查询:");
num = db_select.db_49(username_id,fw, "1801", oraConn49);
fw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 关闭链接
OracleDBa.CloseConnection(oraConn49);
Long date2 = System.currentTimeMillis();
System.out.println("共查询" + num + "个号码用时(秒)=" + ((date2 - date1) / 1000)
+ "折合分钟是:=" + ((date2 - date1) / 60000));
}
}


推荐另外两篇来自阿里巴巴叶正盛的文章我转载的:

关于oracle与mysql官方jdbc的一些区别

http://blog.csdn.net/chenyechao/article/details/9303979   

这篇文章是我解决问题以后才看到的,上面已经说明了MySQL JDBC的setFetchSize的使用。

另外一篇:面向程序员的数据库访问性能优化法则 http://blog.csdn.net/yzsind/article/details/6059209


 类似资料: