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

1.JDBC的框架结构:

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


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

    1.加载JDBC驱动程序

            a.加载Oracle JDBC驱动程序:

         

             b.加载MySQL JDBC驱动程序:

使用DriverManager类加载: 

                        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()) 

                    使用java.lang.Class类加载: 

                        Class c =Class.forName("oracle.jdbc.driver.OracleDriver") 

                     如果加载程序不存在就会抛出异常

                     

使用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));
 }
}