一、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_namehost是主机ip,port是端口,service_name是DB实例名
b.用Oracle OCI驱动连接Oracle数据库的URL:
jdbc:oracle:oci8:@hosthost是tnsnames.ora文件中的一个TNSNAMES条目。
c.用Microsoft SQL Servier驱动连接SQL Server 的URL:
jdbc:microsoft:sqlserver://host:DatabaseName==Studentd.连接Interbase数据库的URL:
jdbc.interbase://host//d:Student/student.gdbe.连接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.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)); } } |
推荐另外两篇来自阿里巴巴叶正盛的文章我转载的:
http://blog.youkuaiyun.com/chenyechao/article/details/9303979
这篇文章是我解决问题以后才看到的,上面已经说明了MySQL JDBC的setFetchSize的使用。
另外一篇:面向程序员的数据库访问性能优化法则 http://blog.youkuaiyun.com/yzsind/article/details/6059209