java SQLHelper
文章转自:http://blog.csdn.net/samtribiani/article/details/7620215,感谢作者的分享!
1 package sql; 2 import java.sql.*; 3 import java.util.logging.*; 4 5 /** 6 * SQL 基本操作 7 * 通过它,可以很轻松的使用 JDBC 来操纵数据库 8 * @author 郗晓勇 9 */ 10 public class SQLHelper 11 { 12 /** 13 * 驱动 14 */ 15 public static String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; 16 /** 17 * 连接字符串 18 */ 19 public static String url = "jdbc:microsoft:sqlserver://192.168.24.246:1433;DatabaseName=LiNing"; 20 /** 21 * 用户名 22 */ 23 public static String user = "sa"; 24 /** 25 * 密码 26 */ 27 public static String password = "123456"; 28 /** 29 * 不允许实例化该类 30 */ 31 private SQLHelper() 32 { 33 } 34 /** 35 * 获取一个数据库连接 36 * 通过设置类的 driver / url / user / password 这四个静态变量来 设置数据库连接属性 37 * @return 数据库连接 38 */ 39 public static Connection getConnection() 40 { 41 try 42 { 43 // 获取驱动,这里使用的是 sqljdbc_1.2.2828.100_chs.exe,不同版本的驱动,语句有所不同 44 Class.forName(driver); 45 } catch (ClassNotFoundException ex) 46 { 47 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 48 } 49 try 50 { 51 return DriverManager.getConnection(url, user, password); 52 } catch (SQLException ex) 53 { 54 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 55 return null; 56 } 57 } 58 /** 59 * 获取一个 Statement 60 * 该 Statement 已经设置数据集 可以滚动,可以更新 61 * @return 如果获取失败将返回 null,调用时记得检查返回值 62 */ 63 public static Statement getStatement() 64 { 65 Connection conn = getConnection(); 66 if (conn == null) 67 { 68 return null; 69 } 70 try 71 { 72 return conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 73 ResultSet.CONCUR_UPDATABLE); 74 // 设置数据集可以滚动,可以更新 75 } catch (SQLException ex) 76 { 77 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 78 close(conn); 79 } 80 return null; 81 } 82 /** 83 * 获取一个 Statement 84 * 该 Statement 已经设置数据集 可以滚动,可以更新 85 * @param conn 数据库连接 86 * @return 如果获取失败将返回 null,调用时记得检查返回值 87 */ 88 public static Statement getStatement(Connection conn) 89 { 90 if (conn == null) 91 { 92 return null; 93 } 94 try 95 { 96 return conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 97 // 设置数据集可以滚动,可以更新 98 } catch (SQLException ex) 99 { 100 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 101 return null; 102 } 103 } 104 /** 105 * 获取一个带参数的 PreparedStatement 106 * 该 PreparedStatement 已经设置数据集 可以滚动,可以更新 107 * @param cmdText 需要 ? 参数的 SQL 语句 108 * @param cmdParams SQL 语句的参数表 109 * @return 如果获取失败将返回 null,调用时记得检查返回值 110 */ 111 public static PreparedStatement getPreparedStatement(String cmdText, Object... cmdParams) 112 { 113 Connection conn = getConnection(); 114 if (conn == null) 115 { 116 return null; 117 } 118 PreparedStatement pstmt = null; 119 try 120 { 121 pstmt = conn.prepareStatement(cmdText, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 122 int i = 1; 123 for (Object item : cmdParams) 124 { 125 pstmt.setObject(i, item); 126 i++; 127 } 128 } catch (SQLException e) 129 { 130 e.printStackTrace(); 131 close(conn); 132 } 133 return pstmt; 134 } 135 /** 136 * 获取一个带参数的 PreparedStatement 137 * 该 PreparedStatement 已经设置数据集 可以滚动,可以更新 138 * @param conn 数据库连接 139 * @param cmdText 需要 ? 参数的 SQL 语句 140 * @param cmdParams SQL 语句的参数表 141 * @return 如果获取失败将返回 null,调用时记得检查返回值 142 */ 143 public static PreparedStatement getPreparedStatement(Connection conn, String cmdText, Object... cmdParams) 144 { 145 if (conn == null) 146 { 147 return null; 148 } 149 PreparedStatement pstmt = null; 150 try 151 { 152 pstmt = conn.prepareStatement(cmdText, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 153 int i = 1; 154 for (Object item : cmdParams) 155 { 156 pstmt.setObject(i, item); 157 i++; 158 } 159 } catch (SQLException e) 160 { 161 e.printStackTrace(); 162 close(pstmt); 163 } 164 return pstmt; 165 } 166 /** 167 * 执行 SQL 语句,返回结果为整型 168 * 主要用于执行非查询语句 169 * @param cmdText SQL 语句 170 * @return 非负数:正常执行; -1:执行错误; -2:连接错误 171 */ 172 public static int ExecSql(String cmdText) 173 { 174 Statement stmt = getStatement(); 175 if (stmt == null) 176 { 177 return -2; 178 } 179 int i; 180 try 181 { 182 i = stmt.executeUpdate(cmdText); 183 } catch (SQLException ex) 184 { 185 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, 186 ex); 187 i = -1; 188 } 189 closeConnection(stmt); 190 return i; 191 } 192 /** 193 * 执行 SQL 语句,返回结果为整型 194 * 主要用于执行非查询语句 195 * @param cmdText SQL 语句 196 * @return 非负数:正常执行; -1:执行错误; -2:连接错误 197 */ 198 public static int ExecSql(Connection conn, String cmdText) 199 { 200 Statement stmt = getStatement(conn); 201 if (stmt == null) 202 { 203 return -2; 204 } 205 int i; 206 try 207 { 208 i = stmt.executeUpdate(cmdText); 209 } catch (SQLException ex) 210 { 211 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, 212 ex); 213 i = -1; 214 } 215 close(stmt); 216 return i; 217 } 218 /** 219 * 执行 SQL 语句,返回结果为整型 220 * 主要用于执行非查询语句 221 * @param cmdText 需要 ? 参数的 SQL 语句 222 * @param cmdParams SQL 语句的参数表 223 * @return 非负数:正常执行; -1:执行错误; -2:连接错误 224 */ 225 public static int ExecSql(String cmdText, Object... cmdParams) 226 { 227 PreparedStatement pstmt = getPreparedStatement(cmdText, cmdParams); 228 if (pstmt == null) 229 { 230 return -2; 231 } 232 int i; 233 try 234 { 235 i = pstmt.executeUpdate(); 236 } catch (SQLException ex) 237 { 238 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, 239 ex); 240 i = -1; 241 } 242 closeConnection(pstmt); 243 return i; 244 } 245 /** 246 * 执行 SQL 语句,返回结果为整型 247 * 主要用于执行非查询语句 248 * @param conn 数据库连接 249 * @param cmdText 需要 ? 参数的 SQL 语句 250 * @param cmdParams SQL 语句的参数表 251 * @return 非负数:正常执行; -1:执行错误; -2:连接错误 252 */ 253 public static int ExecSql(Connection conn, String cmdText, Object... cmdParams) 254 { 255 PreparedStatement pstmt = getPreparedStatement(conn, cmdText, cmdParams); 256 if (pstmt == null) 257 { 258 return -2; 259 } 260 int i; 261 try 262 { 263 i = pstmt.executeUpdate(); 264 } catch (SQLException ex) 265 { 266 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 267 i = -1; 268 } 269 close(pstmt); 270 return i; 271 } 272 /** 273 * 返回结果集的第一行的一列的值,其他忽略 274 * @param cmdText SQL 语句 275 * @return 276 */ 277 public static Object ExecScalar(String cmdText) 278 { 279 ResultSet rs = getResultSet(cmdText); 280 Object obj = buildScalar(rs); 281 closeConnection(rs); 282 return obj; 283 } 284 /** 285 * 返回结果集的第一行的一列的值,其他忽略 286 * @param conn 数据库连接 287 * @param cmdText SQL 语句 288 * @return 289 */ 290 public static Object ExecScalar(Connection conn, String cmdText) 291 { 292 ResultSet rs = getResultSet(conn, cmdText); 293 Object obj = buildScalar(rs); 294 closeEx(rs); 295 return obj; 296 } 297 /** 298 * 返回结果集的第一行的一列的值,其他忽略 299 * @param cmdText 需要 ? 参数的 SQL 语句 300 * @param cmdParams SQL 语句的参数表 301 * @return 302 */ 303 public static Object ExecScalar(String cmdText, Object... cmdParams) 304 { 305 ResultSet rs = getResultSet(cmdText, cmdParams); 306 Object obj = buildScalar(rs); 307 closeConnection(rs); 308 return obj; 309 } 310 /** 311 * 返回结果集的第一行的一列的值,其他忽略 312 * @param conn 数据库连接 313 * @param cmdText 需要 ? 参数的 SQL 语句 314 * @param cmdParams SQL 语句的参数表 315 * @return 316 */ 317 public static Object ExecScalar(Connection conn, String cmdText, Object... cmdParams) 318 { 319 ResultSet rs = getResultSet(conn, cmdText, cmdParams); 320 Object obj = buildScalar(rs); 321 closeEx(rs); 322 return obj; 323 } 324 /** 325 * 返回一个 ResultSet 326 * @param cmdText SQL 语句 327 * @return 328 */ 329 public static ResultSet getResultSet(String cmdText) 330 { 331 Statement stmt = getStatement(); 332 if (stmt == null) 333 { 334 return null; 335 } 336 try 337 { 338 return stmt.executeQuery(cmdText); 339 } catch (SQLException ex) 340 { 341 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 342 closeConnection(stmt); 343 } 344 return null; 345 } 346 /** 347 * 返回一个 ResultSet 348 * @param conn 349 * @param cmdText SQL 语句 350 * @return 351 */ 352 public static ResultSet getResultSet(Connection conn, String cmdText) 353 { 354 Statement stmt = getStatement(conn); 355 if (stmt == null) 356 { 357 return null; 358 } 359 try 360 { 361 return stmt.executeQuery(cmdText); 362 } catch (SQLException ex) 363 { 364 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 365 close(stmt); 366 } 367 return null; 368 } 369 /** 370 * 返回一个 ResultSet 371 * @param cmdText 需要 ? 参数的 SQL 语句 372 * @param cmdParams SQL 语句的参数表 373 * @return 374 */ 375 public static ResultSet getResultSet(String cmdText, Object... cmdParams) 376 { 377 PreparedStatement pstmt = getPreparedStatement(cmdText, cmdParams); 378 if (pstmt == null) 379 { 380 return null; 381 } 382 try 383 { 384 return pstmt.executeQuery(); 385 } catch (SQLException ex) 386 { 387 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 388 closeConnection(pstmt); 389 } 390 return null; 391 } 392 /** 393 * 返回一个 ResultSet 394 * @param conn 数据库连接 395 * @param cmdText 需要 ? 参数的 SQL 语句 396 * @param cmdParams SQL 语句的参数表 397 * @return 398 */ 399 public static ResultSet getResultSet(Connection conn, String cmdText, Object... cmdParams) 400 { 401 PreparedStatement pstmt = getPreparedStatement(conn, cmdText, cmdParams); 402 if (pstmt == null) 403 { 404 return null; 405 } 406 try 407 { 408 return pstmt.executeQuery(); 409 } catch (SQLException ex) 410 { 411 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 412 close(pstmt); 413 } 414 return null; 415 } 416 public static Object buildScalar(ResultSet rs) 417 { 418 if (rs == null) 419 { 420 return null; 421 } 422 Object obj = null; 423 try 424 { 425 if (rs.next()) 426 { 427 obj = rs.getObject(1); 428 } 429 } catch (SQLException ex) 430 { 431 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 432 } 433 return obj; 434 } 435 436 437 438 439 /** 440 * 获取一个具有更新功能的数据模型 如果只要读取数据,就不要用它了 441 * @param cmdText 能返回一个数据集的查询SQL 语句 442 * @return 表格数据模型 443 * 444 * 445 * DataSet 没有找到在哪个包中,因为暂时用不到所以省略此方法 446 447 public static DataSet getDataSet(String cmdText) 448 { 449 Statement stmt = getStatement(); 450 DataSet dbc = new DataSet(); 451 if (stmt == null) 452 { 453 dbc.code = -2; 454 return dbc; 455 } 456 try 457 { 458 // 查询语句 459 dbc.rs = stmt.executeQuery(cmdText); 460 dbc.model = buildTableModel(dbc.rs); 461 dbc.code = dbc.model.getRowCount(); 462 } catch (SQLException ex) 463 { 464 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 465 dbc.code = -1; 466 } 467 return dbc; 468 } 469 */ 470 471 /** 472 * 获取一个具有更新功能的数据模型 如果只要读取数据,就不要用它了 473 * @param conn 数据库连接 474 * @param cmdText 能返回一个数据集的查询SQL 语句 475 * @return 表格数据模型 476 * 477 * 同上一个方法 478 479 public static DataSet getDataSet(Connection conn, String cmdText) 480 { 481 Statement stmt = getStatement(conn); 482 DataSet dbc = new DataSet(); 483 if (stmt == null) 484 { 485 dbc.code = -2; 486 return dbc; 487 } 488 try 489 { 490 // 查询语句 491 dbc.rs = stmt.executeQuery(cmdText); 492 dbc.model = buildTableModel(dbc.rs); 493 dbc.code = dbc.model.getRowCount(); 494 } catch (SQLException ex) 495 { 496 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 497 dbc.code = -1; 498 } 499 return dbc; 500 } 501 */ 502 /** 503 * 获取一个具有更新功能的数据模型 如果只要读取数据,就不要用它了 504 * @param cmdText 需要 ? 参数的 SQL 语句 505 * @param cmdParams SQL 语句的参数表 506 * @return 表格数据模型 507 * 508 * 509 * 同上一个方法 * 510 * 511 512 public static DataSet getDataSet(String cmdText, Object... cmdParams) 513 { 514 PreparedStatement pstmt = getPreparedStatement(cmdText, cmdParams); 515 DataSet dbc = new DataSet(); 516 if (pstmt == null) 517 { 518 dbc.code = -2; 519 return dbc; 520 } 521 try 522 { 523 // 查询语句 524 dbc.rs = pstmt.executeQuery(); 525 dbc.model = buildTableModel(dbc.rs); 526 dbc.code = dbc.model.getRowCount(); 527 } catch (SQLException ex) 528 { 529 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 530 dbc.code = -1; 531 } 532 return dbc; 533 } 534 535 */ 536 /** 537 * 获取一个具有更新功能的数据模型 如果只要读取数据,就不要用它了 538 * @param conn 数据库连接 539 * @param cmdText 需要 ? 参数的 SQL 语句 540 * @param cmdParams SQL 语句的参数表 541 * @return 表格数据模型 542 * 543 * 544 * 同上 545 * 546 547 public static DataSet getDataSet(Connection conn, String cmdText, Object... cmdParams) 548 { 549 PreparedStatement pstmt = getPreparedStatement(conn, cmdText, cmdParams); 550 DataSet dbc = new DataSet(); 551 if (pstmt == null) 552 { 553 dbc.code = -2; 554 return dbc; 555 } 556 try 557 { 558 // 查询语句 559 dbc.rs = pstmt.executeQuery(); 560 dbc.model = buildTableModel(dbc.rs); 561 dbc.code = dbc.model.getRowCount(); 562 } catch (SQLException ex) 563 { 564 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 565 dbc.code = -1; 566 } 567 return dbc; 568 } 569 */ 570 private static void close(Object obj) 571 { 572 if (obj == null) 573 { 574 return; 575 } 576 try 577 { 578 if (obj instanceof Statement) 579 { 580 ((Statement) obj).close(); 581 } else if (obj instanceof PreparedStatement) 582 { 583 ((PreparedStatement) obj).close(); 584 } else if (obj instanceof ResultSet) 585 { 586 ((ResultSet) obj).close(); 587 } else if (obj instanceof Connection) 588 { 589 ((Connection) obj).close(); 590 } 591 } catch (SQLException ex) 592 { 593 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 594 } 595 } 596 private static void closeEx(Object obj) 597 { 598 if (obj == null) 599 { 600 return; 601 } 602 try 603 { 604 if (obj instanceof Statement) 605 { 606 ((Statement) obj).close(); 607 } else if (obj instanceof PreparedStatement) 608 { 609 ((PreparedStatement) obj).close(); 610 } else if (obj instanceof ResultSet) 611 { 612 ((ResultSet) obj).getStatement().close(); 613 } else if (obj instanceof Connection) 614 { 615 ((Connection) obj).close(); 616 } 617 } catch (SQLException ex) 618 { 619 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 620 } 621 } 622 private static void closeConnection(Object obj) 623 { 624 if (obj == null) 625 { 626 return; 627 } 628 try 629 { 630 if (obj instanceof Statement) 631 { 632 ((Statement) obj).getConnection().close(); 633 } else if (obj instanceof PreparedStatement) 634 { 635 ((PreparedStatement) obj).getConnection().close(); 636 } else if (obj instanceof ResultSet) 637 { 638 ((ResultSet) obj).getStatement().getConnection().close(); 639 } else if (obj instanceof Connection) 640 { 641 ((Connection) obj).close(); 642 } 643 } catch (SQLException ex) 644 { 645 Logger.getLogger(SQLHelper.class.getName()).log(Level.SEVERE, null, ex); 646 } 647 } 648 }