這隻是我自己的隨筆博客~,用於偶爾回憶知識,可能存在一些錯誤,如有錯誤,歡迎指正~ 首先對於JDBC連接MySQL,要瞭解基本的框架結構 畫的比較爛,大約就是這樣的結構 然後看一下具體實現的 代碼:; 上面這個是通過單例模式 建立了DBUtil這樣一個類。通過這個類可以乾什麼呢?可以實現 資料庫的連 ...
這隻是我自己的隨筆博客~,用於偶爾回憶知識,可能存在一些錯誤,如有錯誤,歡迎指正~
首先對於JDBC連接MySQL,要瞭解基本的框架結構
畫的比較爛,大約就是這樣的結構
然後看一下具體實現的 代碼:;
public class DBUtil { private String user = "root"; private String password = "root"; private String url = "jdbc:mysql://localhost:3306/mydb6"; private static DBUtil dbUtil; Connection connection = null; // 單例:構造方法私有化 private DBUtil() { } public synchronized static DBUtil getInstance() { if (dbUtil == null) { dbUtil = new DBUtil(); } return dbUtil; } /** * 創建資料庫連接 */ public Connection getConnection() { if (connection == null) { try { // 註冊驅動 Class.forName("com.mysql.jdbc.Driver"); // 獲取連接 connection = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return connection; }
}
上面這個是通過單例模式 建立了DBUtil這樣一個類。通過這個類可以乾什麼呢?可以實現----資料庫的連接!
沒錯,Connection介面的作用就是連接資料庫-
與特定資料庫的連接(會話)。在連接上下文中執行 SQL 語句並返回結果。
怎樣才能得到這個連接呢?--想要建立這個連接,你需要註冊一個驅動---嗯~就是這個代碼 Class.forName("com.mysql.jdbc.Driver");
它是通過反射的機制來獲得的,不瞭解反射?嗯~那你記住就完了 哈哈哈
connection = DriverManager.getConnection(url, user, password);這一句話的是用來獲取連接的 ,這三個參數分別是 數據的地址,jdbc:mysql://IP地址:埠號/資料庫的名稱
嗯~然年再將一下如何通過jdbc向資料庫寫入數據
public int insertStuByStatement() { String sql1 = "insert into stu(sname,sage) values('aaa',1)"; String sql2 = "insert into stu(sname,sage) values('bbb',1)"; String sql3 = "insert into stu(sname,sage) values('ccc',1)"; Connection connection = getConnection();// 獲得資料庫的連接 Statement stmt = null; try { stmt = (Statement) connection.createStatement(); connection.setAutoCommit(false); stmt.addBatch(sql1);//批量添加sql語句 stmt.addBatch(sql2);//批量添加sql語句 stmt.addBatch(sql3);//批量添加sql語句 //一次性執行 stmt.executeBatch(); connection.commit(); System.out.println("批處理成功"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } } catch (Exception e2) { } } return i; }
這裡使用的statement 來實現的,寫出你要操作的 sql語句。(提一下,一般這些操作都是放在DBUtil類中的額 ,這個方法我也是放在DBUtil的)。
第二步:根據上面的定義的方法獲取資料庫。
下麵就是獲取一個Statement 對象,然後通過這個對象的stmt.executeBatch();就可以在資料庫中執行剛纔就的語句了,這樣就做到了靜態插入數據。
那動態插入數據是怎樣的呢 ?-----那就是用到了另一個能夠實現語句的對象PreparedStatement
直接上代碼吧
public int insertStu(String sname,int sage){ String sql = "insert into stu(sname,sage) values(?,?)"; Connection connection = getConnection();//獲得資料庫的連接 PreparedStatement ps = null; int i = 0; try { ps = (PreparedStatement) connection.prepareStatement(sql); ps.setString(1, sname); ps.setInt(2, sage); i=ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if (ps!=null) { ps.close(); } } catch (Exception e2) { } } return i; }
定義的插入方法有了兩個參數的數值
與statement的區別在哪呢?--一個是sql字元串語句的區別,多了“?”,作用是---看下麵這兩行代碼
ps.setString(1, sname); ps.setInt(2, sage);
ps.set****(a,b)有兩個參數,sql語句中也有兩個?,所以參數a,代表的是sql語句的第幾個“?”,如果參數是1,則說明sql語句中第一個“?”的位置替換為參數b,
如果 同理如果參數是2,則說明sql語句中第一個“?”的位置替換為參數b.這樣就做到了動態的插入數據,我們只要在調用插入方法的時候傳入想要插入的數據就好了,不用每次都寫新的sql語句。
對於 i=ps.executeUpdate();語句,它返回的這次你的資料庫操作後有有幾條數據有影響.這種方法對於插入,當然是i=1了
但是對於產出和修改的就不是一定了,刪除修改我直接貼代碼了就不再做講解
//修改
public int updateStu(int sage,String sname){ String sql = "updae stu set sage = ? where sname = ?"; Connection connection = getConnection(); PreparedStatement ps =null; int i = 0; try { ps = (PreparedStatement) connection.prepareStatement(sql); ps.setInt(1, sage); ps.setString(2, sname); i = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if (ps!=null) { ps.close(); } } catch (Exception e2) { } } return i; } //刪除 public int deleteStu(String sname,int sage) { String sql = "delete from stu where sname=? and sage = ?"; Connection conn = getConnection();//獲得資料庫連接 PreparedStatement ps = null; int i = 0; try { ps = (PreparedStatement) conn.prepareStatement(sql); ps.setString(1, sname); ps.setInt(2,sage ); i = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(ps != null) ps.close(); }catch (Exception e) { // TODO: handle exception } } return i; }
資料庫最重要的是什麼---查詢數據,相對於增刪改--查可能稍微繁瑣一點
代碼如下:
/** * 查詢所有學生 * @return */ public ArrayList<Stu> queryStu(){ String sql = "select * from stu ";// select * 或的欄位的順序和資料庫中的是一致 Connection conn = getConnection(); PreparedStatement ps = null; ResultSet rs = null; ArrayList<Stu> stus = new ArrayList<Stu>();//此集合用於存儲每一個學生對象 try { ps = (PreparedStatement) conn.prepareStatement(sql); rs = ps.executeQuery(); //遍歷rs while(rs.next()) {//true表示有下一條數據 int id = rs.getInt("id"); String sname = rs.getString("sname"); int sage = rs.getInt("sage"); //創建stu對象 Stu stu = new Stu(id, sname, sage); //收集對象 stus.add(stu); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(rs != null) rs.close(); if(ps != null) ps.close(); }catch (Exception e) { // TODO: handle exception } } return stus; }
講一下重點的地方 ResultSet rs = null; 這個對象存儲的一個查詢的結果集合。select * from stu這個返回的 應該是查詢的學生表中每個學生的所有數據,
所以rs就可以儲存這樣的一個集合,然後通過遍歷得到其中的數據,將數據賦值給一個學生對對象,將對象加入到集合中,就得到可表中所有的數據~
這次講的主要是基礎部分,等下次繼續探討JDBC聯合其他的一些操作~
Class.forName("com.mysql.jdbc.Driver");