问答文章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

java里使用JDBC连接数据库的步骤是:

1. 加载数据库驱动: Class.forName("org.gjt.mm.mysql.Driver");

org.gjt.mm.mysql.Driver 是mysql的驱动

oracle.jdbc.driver.OracleDriver  是oracle的驱动

    String url = "jdbc:mysql://localhost:3306/test";

    String user = "root";

    String passowrd = "123456";


2. 获取数据库连接Connection con数= DriverManager.getConnection(url,user,password);

3.获取SQL执行器 PreparedStatement prepare = con.prepareStatement("SQL语句")

4.执行SQL语句,得到结果集 ResultSet result = prepare.executeQuery();

while(result.next()){

    //读取结果

}

最后不要忘记导入相应的jdbc驱动包


纯工手打字,请采纳哈

追问这个我知道,那所谓的块方式提取又是什么

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电脑分辨率设置多少合适笔记本电脑分辨率多少最佳 各尺寸笔记本电脑的最佳分辨率 2022年高考480到510分能上山东科技大学吗 朋友借了我一万块钱,现在坐牢了怎么还钱? 天王星和海王星虽然看似一对姊妹星,但还是有区别 ...值得收藏吗?现在分别只都多少钱,照片上有一个铜币的 谁能告诉我这是一枚什么样的铜币,值不值钱? 有谁知道这铜币值不值钱,懂家告诉我一下!谢谢 有谁知道这个铜钱的来历 可以进行异地公积金贷款吗 我想知道我的命运 为什么需要文化创新? 手推式干粉灭火器为什么不能带电灭火? 东京奥运会开始时间和结束时间 什么牌子的打火机最好用? 打火机除了Zippo还有什么有名的牌子? “ZIPPO”打火机烧的是什么油?除了“zippo”油还能用哪些油代替? 请问送男士打火机的话,除了zippo,还有其他选择吗? 除了ZIPPO,还有哪些好的防风打火机??? 除了ZIPPO,什么打火机是比较好的? 什么牌子打火机好?不要zippo 打火机除了Zippo还有哪几种牌子? JDBC 如何取出数据库里的数据~菜鸟求救!!! 除了zippo外,还有什么不错的煤油打火机 什么打火机是比较好的?除了ZIPPO 关于网络诈骗的论文100字 网络贷款和诈骗的文章1000字 黄酒做菜的时候起什么作用? 一般做菜时用的黄酒指的是哪种黄酒 黄酒是什么?做菜时怎么用 ? 100日元兑换多少人民币 这个日元面值多少,兑换成人民币多少? 华为键盘数字怎么变成九宫格 买纯牛奶,应该,什么时候喝对身体最有好处? 华为数字键盘怎么设置成九宫格 纯牛奶明天就过期了还能喝吗 请问蒙牛纯牛奶可以买吗? 华为手机九宫格输入法怎么设置?华为手机P20九宫格输入法怎么设置 华为P10 Plus输入法怎么设置九宫格? 土地规划图在哪里查 朝阳区档案局能查到规划图吗 合肥市自然资源和规划图怎么看公市图 聚戊烯醇是什么?西伯利亚冷杉中的聚戊烯醇有什么作用?求科普! 哪里能够查到用地规划图? 如何看城市规划图 从哪里能够查到某个区域土地规划 如何在excel10打开多个excel文件时在任务栏也显示多个文件标签 excel有多个标签,点后面的标签自动跳到第一个 家里养的巴西龟有味要怎么办 乌龟身上有异味 在水里看见颈部和四肢有白色的东西 ,无精打采 不吃饭