咱們學習了數據庫,數據庫實現了數據的持久化,但咱們最終要在程序裏處理數據啊,那java代碼中怎麼去訪問數據庫讀寫數據呢?java
這就要用到sun公司設定的一套數據庫標準了,這套標準就是JDBC(Java Database Connectivity)。但它只是規範,不作具體實現。因而數據庫廠商又根據JDBC標準,實現自家的驅動Driver。如:mysql驅動com.mysql.cj.jdbc.Driver,Oracle的驅動oracle.jdbc.OracleDriver。有了這套解決方案,java就能夠訪問數據庫中的數據了。mysql
public interface Connection extends Wrapper, AutoCloseable {} public interface Statement extends Wrapper, AutoCloseable {} public interface PreparedStatement extends Statement {} public interface CallableStatement extends PreparedStatement {} public interface ResultSet extends Wrapper, AutoCloseable {}
調用方式有三種:
Statement語句、PreparedStatement預處理語句、CallableStatement存儲過程,推薦使用第二種PreparedStatement,防止SQL注入,其也是預編譯性能高。sql
Statement語句:
步驟:
1.加載驅動
2.建立數據庫鏈接connection
3.建立sql語句對象(statement語句,preparestatement預編譯語句,call存儲過程X)
4.執行查詢語句,返回結果集ResultSet
5.利用查詢到的結果集對象進行數據處理數據庫
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Test3JDBC { public static void main(String[] args) throws Exception { //基本查詢語句 method(); } public static void method() throws Exception { //第一步,須要加載驅動 String driver = "com.mysql.jdbc.Driver"; //第二步,添加連接,用戶名,密碼 String url = "jdbc:mysql://localhost:3306/jtdb2007"; String usename="root"; String password="1234"; //建立driver聲明的類的全路徑的Class類對象 Class.forName(driver); //第三步,建立一個數據庫連接connection Connection cn = DriverManager.getConnection(url,usename,password); //第四步,建立語句對象(statement語句,preparestatement預編譯語句,call存儲過程X) Statement state = cn.createStatement();//建立Statement對象,該對象來將sql發送到數據庫。 //第五步,執行查詢語句,返回結果集ResultSet String sql = "select * from emp"; ResultSet rs = state.executeQuery(sql); int cols = rs.getMetaData().getColumnCount();//獲取列的數量 for (int i = 1; i <=cols ; i++) { //第六步,獲取列名,元數據 System.out.print(rs.getMetaData().getColumnName(i)+"t");//ResultSetMetaData接口,獲取指定列的名稱 } //第七步,for循環打印表字段內容 while(rs.next()){ System.out.println(); for (int i = 1; i <=cols ; i++) { System.out.print(rs.getString(i)+"t"); } } } }
PreparedStatement預處理語句:oracle
package test; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class Test2JDBC { @Test //預編譯查詢語句 public <PrepareStatement> void prepareStatement() throws Exception { String driver = "com.mysql.jdbc.Driver"; //驅動 String url = "jdbc:mysql://localhost:3306/jtdb2007"; //鏈接 //預編譯sql中用?做爲佔位符,未來會被真實值替換掉 String sql = "select * from dept where deptno = ?"; Class.forName(driver); Connection cn = DriverManager.getConnection(url, //獲取連接 "root","1234"); //帶參數 PreparedStatement ps=cn.prepareStatement(sql); //返回預編譯對象 ps.setString(1,"2");//?位置,參數值 //查詢 ResultSet rs = ps.executeQuery(); //打印列標題 int cols = rs.getMetaData().getColumnCount(); //列的總數 for (int i = 1; i <=cols ; i++) { //打印列的名稱 System.out.print(rs.getMetaData().getColumnName(i)+"t"); } //打印數據 while(rs.next()){ //每次向下取一條,直到結尾 System.out.println(); //換行 for (int i = 1; i <=cols ; i++) { System.out.print(rs.getString(i)+"t"); } } } }
Procedure 存儲過程:app
package jdbc; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; public class TestProcedure { public static void main(String[] args) throws ClassNotFoundException, SQLException { String driver = "oracle.jdbc.OracleDriver"; String url = "jdbc:oracle:thin:@localhost:1521:xe"; //注意SID String sql = "{call paging_cursor(?,?,?,?,?,?)}"; String user = "ht"; String password = "ht"; Class.forName(driver); Connection cn = DriverManager.getConnection(url, user, password); CallableStatement cs = cn.prepareCall(sql); // 給in?賦值 cs.setString(1, "emp");// 傳表名 cs.setInt(2, 3); // 傳入pagesize,每頁顯示多少條記錄 cs.setInt(3, 2); // 傳入pagenow,顯示第幾頁。 // 給out?註冊 cs.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR); cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER); cs.registerOutParameter(6, oracle.jdbc.OracleTypes.INTEGER); // 執行 cs.execute(); // 這裏是關鍵所在,java沒有接收結果集的get方法,因此只能用getObject來接收結果集,接收到後須要使用ResultSet強轉才能夠 ResultSet rs = (ResultSet) cs.getObject(4); // 循環取出 while (rs.next()) { System.out.println(rs.getString("ename") + " " + rs.getString("sal")); } // 取出總記錄數 int rowCount = cs.getInt(5); // 取出總頁數 int pageCount = cs.getInt(6); System.out.println("共有記錄:" + rowCount + "條! " + "共有記錄:" + pageCount + "頁!"); } }
同:二者均可建立執行sql語句的對象性能
異:PreparedStatement能夠設置佔位符,預編譯,編譯效率高,它可以經過設置參數,指定相應的值;
Statement使用的是字符串拼接的方式,具有注入攻擊的風險。學習
相同點:都可以執行增長、刪除、修改等操做。url
不一樣點:rest
一、execute能夠執行查詢語句,而後經過getResult把結果取出來。executeUpdate不能執行查詢語句。
二、execute返回Boolean類型,true表示執行的是查詢語句,false表示執行的insert、delete、update等。executeUpdate的返回值是int,表示有多少條數據受到了影響。