问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JDBC 如何取出数据库里的数据~菜鸟求救!!!

发布网友 发布时间:2022-04-09 08:07

我来回答

2个回答

懂视网 时间:2022-04-09 12:28

@Test 2 public void test() throws IOException { 3 BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream("C:\Users\yhzh\Desktop\zh_20160913"))); 4 String tmp=null; 5 List<String> nos=new ArrayList<String>(); 6 while((tmp=reader.readLine()) !=null) 7 nos.add(tmp); 8 9 Connection con = null;// 创建一个数据库连接 10 PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement 11 PreparedStatement pre2 = null; 12 ResultSet result = null;// 创建一个结果集对象 13 BufferedWriter csvWriter=null; 14 try 15 { 16 String tag=(new SimpleDateFormat("hhmmss")).format(new Date()); 17 csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\Users\yhzh\Desktop\贷后还款计划_"+tag+".csv")), "utf-8")); 18 19 Class.forName("oracle.jdbc.driver.OracleDriver"); 20 //:6006/hotfix 21 String url = "jdbc:oracle:thin:@//*.*.*.*:16030/zcgl",user = "*",password = "*"; 22 con = DriverManager.getConnection(url, user, password);// 获取连接 23 String sql="select max(lr_id) from t_loan_request where LR_REQUESTSTATUS =‘2‘ and lr_applyid=?"; 24 /*String sql = 27 "select req.LR_APPLYID,CURR_PERIODS,REPAY_DAY, " + 28 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL, " + 29 "PERIOD_REPAY_AMOUNT " + 30 "from( " + 31 " select lr_id,LR_APPLYID from t_loan_request t " + 32 " where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘ " + 33 " order by lr_id desc)req " + 34 "left join t_repay_plan rp " + 35 "on req.lr_id=rp.lr_id " + 36 "order by req.lr_id,CURR_PERIODS ";// 预编译语句,“?”代表参数*/ 37 pre = con.prepareStatement(sql); 38 pre2=con.prepareStatement("select CURR_PERIODS,REPAY_DAY, " + 39 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL, " + 40 "PERIOD_REPAY_AMOUNT " + 41 "from t_repay_plan " + 42 "where lr_id=? " + 43 "order by CURR_PERIODS"); 44 for(String no:nos){ 45 pre.setString(1,no); 46 result = pre.executeQuery(); 47 if(result.next()) { 48 long lrId=result.getLong(1); 49 pre2.setLong(1,lrId); 50 result = pre2.executeQuery(); 51 while (result.next()) { 52 csvWriter.write(no); 53 csvWriter.write(","); 54 csvWriter.write(result.getString(1)); 55 csvWriter.write(","); 56 csvWriter.write(result.getString(2)); 57 csvWriter.write(","); 58 csvWriter.write(result.getString(3)); 59 csvWriter.write(","); 60 csvWriter.write(result.getString(4)); 61 csvWriter.newLine(); 62 } 63 } 64 } 65 66 csvWriter.flush(); 67 } 68 catch (Exception e) 69 { 70 e.printStackTrace(); 71 } 72 finally 73 { 74 try 75 { 76 if(csvWriter !=null) 77 csvWriter.close(); 78 if (result != null) 79 result.close(); 80 if (pre != null) 81 pre.close(); 82 if (con != null) 83 con.close(); 84 System.out.println("数据库连接已关闭!"); 85 } 86 catch (Exception e) 87 { 88 e.printStackTrace(); 89 } 90 } 91 }

先读取所有编号形成List,后遍历这个List,先查出id再查详细数据。这样的数据csv文件中大约8万多条

一条条的来肯定慢,如果不按照编号,直接一次查出,数据是9万多条。速度都很慢!!!

后来想提高下,至少要有个明显的提升呀。写文件这块基本排除了,剩下的疑问就是ResultSet是否拿到了所有结果呢?

根据网上查到的资料和实际调试,得出答案:ResultSet默认一次取10条数据,怪不得要慢,如果一次全部读入内存再写入文件就一定很快了。

怎样一次读取所有数据呢?

sql改为读取全部

 1 String sql="select req.LR_APPLYID,CURR_PERIODS,REPAY_DAY,
" +
 2 "(NEEDREPAY_PRINCIPAL+NEEDREPAY_INTEREST+NEEDREPAY_ADMIFEE+nvl(RISK_AMOUNT,0)+nvl(SERVICEFEE,0)+nvl(PARKINGFEE,0))NEEDREPAY_TOTAL,
" +
 3 "PERIOD_REPAY_AMOUNT 
" +
 4 "from(
" +
 5 " select lr_id,LR_APPLYID from t_loan_request t 
" +
 6 " where t.LR_REQUESTSTATUS =‘2‘ and t.creater=‘PostLoanOuterAction‘
" +
 7 " order by lr_id desc)req
" +
 8 "left join t_repay_plan rp
" +
 9 "on req.lr_id=rp.lr_id
" +
10 "order by req.lr_id,CURR_PERIODS";

 

设置PreparedStatement:

1 pre = con.prepareStatement(sql);
2 pre.setFetchSize(100000);
3 result = pre.executeQuery();
4 //result.setFetchSize(100000);

主要是PreparedStatement的 setFetchSize 方法,

后来发现ResultSet也有个setFetchSize 方法,也是可行的,只是这个时候resultset中已经有了10条记录直到循环10次后,再次使用result.next()才去取100000,fetchSize才起作用

这样设置后速度飞快!!!

 

jdbc--取大量数据

标签:

热心网友 时间:2022-04-09 09:36

注意:你需要在项目中引入“ojdbc6.jar”才可以在java中访问Oracle。

修改后的Java程序:

import java.awt.FlowLayout;

import java.awt.TextArea;

import java.awt.TextField;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

class Main extends JFrame implements ActionListener {

TextField tf;

TextArea ta;

JButton btn;

    

public Main(){

super();

tf = new TextField(10);

ta = new TextArea(10,15);

btn = new JButton("确定");

this.setLayout(new FlowLayout());

this.add(tf);

this.add(btn);

this.add(ta);

btn.addActionListener(this);

this.setSize(200, 200);

this.setVisible(true);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public static void main(String[] args) {

        new Main();

    }

@Override

public void actionPerformed(ActionEvent e) {

if(tf.getText().equals("")) {

JOptionPane.showMessageDialog(null, "请输入问题!","Warning", 0);

return;

}

else {

String str = Connect.getDeptName(tf.getText());

ta.setText(str);

}

}

}

class Connect{

public static String getDeptName(String deptNo1){

ResultSet rs = null;

Statement stmt = null;

Connection conn = null;

PreparedStatement ps = null;

String deptName = null;

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger");

stmt = conn.createStatement();

ps = conn.prepareStatement("select DNAME from dept where deptno = ?");

ps.setString(1,deptNo1);

rs = ps.executeQuery();

if(rs.next()){

deptName = rs.getString(1);

}

}

catch(ClassNotFoundException e){

 e.printStackTrace();

}

catch(SQLException e){

e.printStackTrace();

}

finally{

try{

if(rs!=null){

rs.close();

rs = null;

}

if(ps!=null){

ps.close();

ps = null;

}

if(conn!=null){

conn.close();

conn = null;

}

}

catch(SQLException e){

e.printStackTrace();

}

}

return deptName;//返回对应的DANME;

}

}

运行测试:

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑分辨率设置多少合适笔记本电脑分辨率多少最佳 各尺寸笔记本电脑的最佳分辨率 2022年高考480到510分能上山东科技大学吗 朋友借了我一万块钱,现在坐牢了怎么还钱? 天王星和海王星虽然看似一对姊妹星,但还是有区别 ...值得收藏吗?现在分别只都多少钱,照片上有一个铜币的 谁能告诉我这是一枚什么样的铜币,值不值钱? 有谁知道这铜币值不值钱,懂家告诉我一下!谢谢 有谁知道这个铜钱的来历 可以进行异地公积金贷款吗 除了zippo外,还有什么不错的煤油打火机 什么打火机是比较好的?除了ZIPPO 关于网络诈骗的论文100字 网络贷款和诈骗的文章1000字 黄酒做菜的时候起什么作用? 一般做菜时用的黄酒指的是哪种黄酒 黄酒是什么?做菜时怎么用 ? 做什么菜用黄酒,怎么用 做什么样的菜要放黄酒和生粉? 做什么菜用黄酒,怎么用? 建立一个Excel窗体目录 Excel 如何设置查询录入数据的窗体 如何在excel中制作一个输入窗口输入到指定单元格,单元格有内容时自动往下填写 员工达到法定退休年龄公司该如何处理 由于年龄超过了法定退休年龄离职了,能否享受劳动法第四十七条规定的权利。 超出退休年龄,办理退休 公司准备办理社会保险,但是有超过法定退休年龄的员工,怎么办 超过法定退休年龄的工伤认定 达到法定退休年龄,但没开始享受养老金可以继续领取失业保险金吗? 超过退休年龄认定工伤 打火机除了Zippo还有哪几种牌子? 什么牌子打火机好?不要zippo 除了ZIPPO,什么打火机是比较好的? 除了ZIPPO,还有哪些好的防风打火机??? 请问送男士打火机的话,除了zippo,还有其他选择吗? “ZIPPO”打火机烧的是什么油?除了“zippo”油还能用哪些油代替? 打火机除了Zippo还有什么有名的牌子? 什么牌子的打火机最好用? 东京奥运会开始时间和结束时间 手推式干粉灭火器为什么不能带电灭火? 为什么需要文化创新? 我想知道我的命运 jdbc提取数据,如何实现块方式提取,最好可以有个例子 100日元兑换多少人民币 这个日元面值多少,兑换成人民币多少? 华为键盘数字怎么变成九宫格 买纯牛奶,应该,什么时候喝对身体最有好处? 华为数字键盘怎么设置成九宫格 纯牛奶明天就过期了还能喝吗 请问蒙牛纯牛奶可以买吗?