好久沒用JDBC了,都有點忘了。昨天晚上系統的總結了下
包括對結果集的指針的操作,批處理,存儲過程的操作等等
1 package com.jdbc; 2 3 import java.sql.CallableStatement; 4 import java.sql.Connection; 5 import java.sql.DatabaseMetaData; 6 import java.sql.DriverManager; 7 import java.sql.PreparedStatement; 8 import java.sql.ResultSet; 9 import java.sql.ResultSetMetaData; 10 import java.sql.SQLException; 11 import java.sql.Statement; 12 13 import com.jdbc.entity.Courseinfo; 14 15 public class OralceConnTest { 16 private String url="jdbc:oracle:thin:@localhost:1521:ibn"; 17 private String user="test"; 18 private String pwd="abs"; 19 private Connection conn; 20 private Statement stat; 21 private PreparedStatement ps; 22 private ResultSet rs; 23 private CallableStatement cs; 24 /** 25 * 關閉連接 關閉語句對象 關閉結果集 26 * 注意Statement和PreparedStatement的區別 27 * @param args 28 * @throws SQLException 29 * @throws InstantiationException 30 * @throws IllegalAccessException 31 * @throws ClassNotFoundException 32 */ 33 public static void main(String[]args) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{ 34 OralceConnTest cont=OralceConnTest.class.newInstance(); 35 cont.getConnection(); 36 cont.callStatement(); 37 // Courseinfo course=new Courseinfo(); 38 // course.setId(5); 39 // course.setUsername("小明"); 40 // course.setPassword("456"); 41 // cont.insert(course); 42 } 43 /** 44 * 加載驅動,建立連接 45 * @return 46 */ 47 public Connection getConnection(){ 48 try { 49 Class.forName("oracle.jdbc.driver.OracleDriver"); 50 conn=DriverManager.getConnection(url, user, pwd); 51 } catch (Exception e) { 52 e.printStackTrace(); 53 } 54 return conn; 55 } 56 /** 57 *查詢數據庫的表 58 * @throws SQLException 59 * @throws ClassNotFoundException 60 */ 61 public void conn() throws SQLException, ClassNotFoundException{ 62 try { 63 stat=conn.createStatement(); 64 ResultSet rs=stat.executeQuery("select userid,username,password from userinfo"); 65 while(rs.next()){ 66 StringBuffer sb=new StringBuffer(); 67 String a=rs.getString(1); 68 String b=rs.getString(2); 69 String c=rs.getString(3); 70 sb.append(a).append(b).append(c); 71 System.out.println(sb); 72 } 73 } catch (SQLException e) { 74 e.printStackTrace(); 75 }finally{ 76 conn.close(); 77 stat.close(); 78 } 79 } 80 /** 81 * 執行插入操作 注意插入操作 insert into tablename values(id,'name','password') 注意這個單引號不能忘掉 82 * @param course 83 */ 84 public void insert(Courseinfo course){ 85 try { 86 //將自動提交事務設關閉 87 conn.setAutoCommit(false); 88 stat=conn.createStatement(); 89 String sql="insert into userinfo(userid,username,password)" + 90 "values("+course.getId()+",'" 91 +course.getUsername()+"','"+course.getPassword()+"')"; 92 int a=stat.executeUpdate(sql); 93 if(a==1){ 94 System.out.println("statement插入正常"); 95 //事務提交 96 conn.commit(); 97 }else{ 98 //事務回滾 99 conn.rollback(); 100 } 101 //將事務自動提交恢復 102 conn.setAutoCommit(true); 103 } catch (SQLException e) { 104 // TODO Auto-generated catch block 105 e.printStackTrace(); 106 }finally{ 107 108 if(stat!=null){ 109 try { 110 stat.close(); 111 } catch (SQLException e) { 112 // TODO Auto-generated catch block 113 e.printStackTrace(); 114 } 115 } 116 if(conn!=null){ 117 try { 118 conn.close(); 119 } catch (SQLException e) { 120 // TODO Auto-generated catch block 121 e.printStackTrace(); 122 } 123 } 124 } 125 } 126 /** 127 * statement每次執行sql語句,相關數據庫都要執行sql語句的編譯 128 * preparedstatement是預編譯得, preparedstatement支持批處理 129 * statement執行update必須有參數 130 * preparedStatement在創建時已經預編譯了,沒有參數 131 * @param course 132 */ 133 public void prepareInsert(Courseinfo course){ 134 135 try { 136 String sql="insert into userinfo(userid,username,password)values(?,?,?)"; 137 ps=conn.prepareStatement(sql); 138 ps.setInt(1, course.getId()); 139 ps.setString(2, course.getUsername()); 140 ps.setString(3, course.getPassword()); 141 int a=ps.executeUpdate(); 142 if(a==1){ 143 System.out.println("preparedStatementd插入正常"); 144 } 145 } catch (SQLException e) { 146 // TODO Auto-generated catch block 147 e.printStackTrace(); 148 }finally{ 149 if(ps!=null){ 150 try { 151 ps.close(); 152 } catch (SQLException e) { 153 // TODO Auto-generated catch block 154 e.printStackTrace(); 155 } 156 } 157 if(conn!=null){ 158 try { 159 conn.close(); 160 } catch (SQLException e) { 161 // TODO Auto-generated catch block 162 e.printStackTrace(); 163 } 164 } 165 } 166 167 } 168 /** 169 * 獲取數據庫基本信息 170 */ 171 public void getDbData(String tablename){ 172 String sql="select*from "+tablename; 173 try { 174 //獲取數據庫元數據 175 DatabaseMetaData dmd=conn.getMetaData(); 176 //獲取數據庫的各種信息 數據庫名字 177 System.out.println(dmd.getDatabaseProductName()); 178 stat=conn.createStatement(); 179 rs=stat.executeQuery(sql); 180 //結果集元數據 181 ResultSetMetaData rmd=rs.getMetaData(); 182 //獲取結果集列數 183 int columnCount=rmd.getColumnCount(); 184 for(int i=0;i<columnCount;i++){ 185 //獲取列名 186 System.out.println(rmd.getColumnName(i)); 187 } 188 while(rs.next()){ 189 for(int i=0;i<columnCount;i++){ 190 //由列名獲取結果集 191 String value=rs.getString(rmd.getColumnName(i)); 192 } 193 } 194 } catch (SQLException e) { 195 e.printStackTrace(); 196 } 197 } 198 /** 199 * 批處理 200 */ 201 public void batchExecute(){ 202 String sql="insert into courseinfo(userid) values(?)"; 203 try { 204 conn.setAutoCommit(false); 205 ps=conn.prepareStatement(sql); 206 for(int i=5;i<100;i++){ 207 ps.setInt(1, i); 208 //將sql語句加入批處理 209 ps.addBatch(); 210 //每10條處理一次 211 if(i%10==0){ 212 stat.executeBatch(); 213 stat.clearBatch(); 214 } 215 stat.executeBatch();//處理最后五條 216 } 217 } catch (SQLException e) { 218 // TODO Auto-generated catch block 219 e.printStackTrace(); 220 } 221 222 } 223 /** 224 * 操作結果集 225 *基於緩存的分頁策略 226 *起始數據 (page-1)*pageSize+1 227 * @param pageSize 每頁有多少條數據 228 * @param page 第幾頁 229 */ 230 public void bufferPageDemo(int pageSize,int page){ 231 String sql="select*from courseinfo"; 232 try { 233 //結果集滾動不敏感的(可跳步的) 234 /** 235 * ResultSet有個結果集指針,初始是指向第一個結果的 236 * 237 * 1.ResultSet.TYPE_FORWARD_ONLY 指針只能安裝列順序向前移動,也就是說在取得name列之后,將不能再返回獲取id列的值; 238 * 2.ResultSet.TYPE_SCROLL_INSENSITIVE指針可以前后移動,INSENSITIVE表示不及時更新,就是如果數據庫里的數據修改過,並不在ResultSet中反映出來; 239 * 3.ResultSet.TYPE_SCROLL_SENSITIVE指針可以前后移動,SENSITIVE表示及時跟蹤數據庫的更新,以便更改ResultSet中的數據。 240 * 241 * 242 * 1.ResultSet.CONCUR_READ_ONLY表示當前ResultSet對象只讀, 不能用結果集更新數據庫中的表 243 * 2.ResultSet.CONCUR_UPDATABLE表示當前ResultSet能用結果集更新數據庫中的表 244 * 245 * ResultSet提供各種控制指針的方法 246 */ 247 //conn.createStatement(resultSetType, resultSetConcurrency) 248 stat=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 249 ResultSet.CONCUR_UPDATABLE); 250 rs=stat.executeQuery(sql); 251 rs.last();//移動到最后一行 252 int rownum=rs.getRow();//記錄當前的行號,記錄的條數 253 rs.absolute(1);//將指針移到第一行 254 rs.relative(2);//相對當前位置移動2行 255 /*更新第三條記錄*/ 256 rs.updateInt(1, 100); 257 rs.updateString(2, "更新地方"); 258 rs.updateRow();//更新數據源的數據 259 /*插入數據*/ 260 rs.moveToInsertRow();//指針移到插入行 261 rs.updateInt(1, 100); 262 rs.updateString(2, "插入地方"); 263 rs.insertRow(); 264 rs.moveToCurrentRow();//指針移到插入前的位置 265 } catch (SQLException e) { 266 // TODO Auto-generated catch block 267 e.printStackTrace(); 268 } 269 } 270 /** 271 * 存儲過程的調用 272 * 273 * 274 */ 275 public void callStatement(){ 276 StringBuffer sb=new StringBuffer(20);//線程安全 277 /* 278 * sys_refcursor游標類型 279 create or replace procedure testc(infos out sys_refcursor,num out number,names out varchar2) 280 is 281 begin 282 open infos for 'select*from userinfo'; 283 select count(*) into num from userinfo; 284 select username into names from userinfo where userid=1; 285 end testc; 286 */ 287 sb.append("{call testc(?,?,?)}"); 288 try { 289 cs=conn.prepareCall(sb.toString()); 290 //返回游標類型 291 cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); 292 //返回num類型 293 cs.registerOutParameter(2, java.sql.Types.INTEGER); 294 //返回字符類型 295 cs.registerOutParameter(3, java.sql.Types.VARCHAR); 296 cs.execute(); 297 rs=(ResultSet)cs.getObject(1); 298 //獲取結果集的列數 299 int count=rs.getMetaData().getColumnCount();//獲得結果集記錄的字段數 300 System.out.println("count="+count); 301 while(rs.next()){ 302 for(int i=1;i<=count;i++){ 303 System.out.println(rs.getString(i)); 304 } 305 } 306 System.out.println("------返回number類型-------"); 307 int counts=cs.getInt(2); 308 System.out.println(counts); 309 System.out.println("-----返回varchar-------"); 310 String name=cs.getString(3); 311 System.out.println(name); 312 } catch (SQLException e) { 313 // TODO Auto-generated catch block 314 e.printStackTrace(); 315 } 316 /*調用存儲過程,返回游標,整數,字符串*/ 317 318 /*調用存儲過程,返回整數*/ 319 /**/ 320 /**/ 321 322 } 323 }