JDBC(Java Data Base Connectivity):SUN公司爲了簡化統一對數據庫的操作,定義了一套Java操作數據庫的規範,稱之爲JDBC;
這樣應用程序就不需要關注數據庫底層的詳細實現,只需要學習使用JDBC就可以。
當用戶需要操作數據庫時,需要先把數據庫的驅動放到程序裏,註冊驅動,sun公司定義了DriverManager類用戶完成驅動程序的註冊;
這裏首先給出連接數據庫的一些參數:
1 private static String driver = "com.mysql.jdbc.Driver" ;2 private static String url = "jdbc:mysql://localhost:3306/hibernate";3 private static String user = "root";4 private static String password = "root";
(一)驅動程序的註冊(加載)有兩種方式:
1)有API的源碼可以知道,這種方式會導致驅動程序註冊兩次,在內存中會有兩個Driver對象, 而且這種方式依賴於mysql的jar包,如果缺少jar包會導致程序無法編譯;
DriverManager.registerDriver(Driver driver)
DriverManager.getConnection(url,user,passwprd)
2)一般使用第二種方式較多,只需要一個字符串即可,不需要依賴具體的驅動;
Class.forName("com.mysql.jdbc.Driver)
(二) URL:
URL用於標識數據庫的位置,通過url告知程序連接那個數據庫,url的寫法爲:jdbc:mysql:[]//localhost:3306/test?參數名:參數值
常用的數據庫url地址的寫法:
Oracle:jdbc:oracle:thin:@localhost:1521:sid;
mysql:jdbc.mysql.://localhost:3306/sid;
sql server:jdbc.microsoft:sqlserver://localhost.1433/DatabaseName=sid;
其中sid爲各個數據庫自定義的服務號,mysql爲數據庫名,oracle爲對應版本有不同的服務號,XE版默認XE,企業版默認:orcl
以下給出數據庫連接的例子:
/** * 獲取數據庫連接 * @param driver 驅動 * @param url 地址 * @param user 用戶名 * @param password 密碼 * @return 返回連接對象 */ public static Connection getConnection(String driver, String url, String user, String password) { try { Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password); System.out.println("mysql connect succeed~"); return conn; } catch (Exception e) { e.printStackTrace(); } return null; }
Connection對象
Jdbc程序中的Connection,它用於代表數據庫的鏈接,Collection是數據庫編程中最重要的一個對象,客戶端與數據庫所有交互都是通過connection對象完成的,這個對象的常用方法:
createStatement():創建向數據庫發送sql的statement對象。
prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
prepareCall(sql):創建執行存儲過程的CallableStatement對象。
setAutoCommit(boolean autoCommit):設置事務是否自動提交。
commit() :在連接上提交事務。
rollback() :在此連接上回滾事務。
Statement對象
Jdbc程序中的Statement對象用於向數據庫發送SQL語句, Statement對象常用方法:
executeQuery(String sql) :用於向數據發送查詢語句。
executeUpdate(String sql):用於向數據庫發送insert、update或delete語句
execute(String sql):用於向數據庫發送任意sql語句
addBatch(String sql) :把多條sql語句放到一個批處理中。
executeBatch():向數據庫發送一批sql語句執行。
ResultSet
Jdbc程序中的ResultSet用於代表SQL語句的執行結果。Resultset封裝執行結果時,採用的類似於表格的方式。ResultSet 對象維護了一個指向表格數據行的遊標,初始的時候,遊標在第一行之前,調用ResultSet.next() 方法,可以使遊標指向具體的數據行,進行調用方法獲取該行的數據。
ResultSet既然用於封裝執行結果的,所以該對象提供的都是用於獲取數據的get方法:
獲取任意類型的數據
getObject(int index)
getObject(string columnName)
獲取指定類型的數據,例如:
getString(int index)
getString(String columnName)
注意:列的索引從1開始。
ResultSet還提供了對結果集進行滾動的方法:
next():移動到下一行
previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面。
afterLast() :移動到resultSet的最後面。
釋放資源
Jdbc程序運行完後,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,這些對象通常是ResultSet, Statement和Connection對象。
特別是Connection對象,它是非常稀有的資源,用完後必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是儘量晚創建,儘量早的釋放。(使用原則:儘量晚的創建,儘量早的釋放)
爲確保資源釋放代碼能運行,資源釋放代碼也一定要放在finally語句中。
程序示例:
使用jdbc進行增刪改查操作:
/** * 獲取查詢的結果集 * @param connection 數據庫連接對象 * @param tableName 需要查詢的表名 * @return 返回結果集 */ public static ResultSet select(Connection connection, String tableName){ ResultSet resultSet = null; String sql = "select * from " + tableName; PreparedStatement statement = null; try { statement = connection.prepareStatement(sql); //執行給定的 SQL 語句,該語句返回單個 ResultSet 對象 resultSet = statement.executeQuery(sql); return resultSet; } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 數據庫插入操作 * @param connection * @return */ public static boolean add(Connection connection, String userName, String password, String address){ String sql = "INSERT INTO t_user(username, password, address) VALUES ('"+userName+"','"+password+"','"+address+"')"; System.out.println(sql); PreparedStatement statement = null; try { statement = connection.prepareStatement(sql); //執行給定的 SQL 語句,返回影響的行數 int num = statement.executeUpdate(sql); if (num != 0){ return true; } } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 刪除操作 * @param connection * @param id 需要刪除的id值 * @return */ public static boolean delete(Connection connection, String id){ String sql = "DELETE FROM t_user WHERE uid = " + id; System.out.println(sql); PreparedStatement statement = null; try { statement = connection.prepareStatement(sql); //執行給定的 SQL 語句,返回影響的行
int num = statement.executeUpdate(sql); if (num != 0){ return true; } } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 修改數據操作 * @param connection * @param id * @param userName * @return */ public static boolean update(Connection connection, String id, String userName){ String sql = "UPDATE t_user SET username = '"+userName+"'WHERE uid = " + id; System.out.println(sql); PreparedStatement statement = null; try { statement = connection.prepareStatement(sql); //執行給定的 SQL 語句,返回影響的行數 int num = statement.executeUpdate(sql); if (num != 0){ return true; } } catch (SQLException e) { e.printStackTrace(); } return false; }
Jdbc中的statement對象用於向數據庫發送SQL語句,想完成對數據庫的增刪改查,只需要通過這個對象向數據庫發送增刪改查語句即可。
Statement對象的executeUpdate方法,用於向數據庫發送增、刪、改的sql語句,executeUpdate執行完後,將會返回一個整數(即增刪改語句導致了數據庫幾行數據發生了變化)。
Statement.executeQuery方法用於向數據庫發送查詢語句,executeQuery方法返回代表查詢結果的ResultSet對象。
其中對ResultSet的遍歷:
ResultSet resultSet = MysqlUtils.select(conn, "t_user"); try { while (resultSet.next()){ //序列從1號開始 System.out.println(resultSet.getString(1)); System.out.println(resultSet.getString(2)); System.out.println(resultSet.getString(3)); System.out.println(resultSet.getString(4)); System.out.println("------------------------"); } } catch (SQLException e) { e.printStackTrace(); }
PreperedStatement
PreperedStatement是Statement的孩子,它的實例對象可以通過調用Connection.preparedStatement()方法獲得,相對於Statement對象而言:
PreperedStatement可以避免SQL注入的問題。
Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩衝區溢出。PreparedStatement 可對SQL進行預編譯,從而提高數據庫的執行效率。
並且PreperedStatement對於sql中的參數,允許使用佔位符的形式進行替換,簡化sql語句的編寫。