一、執行DDL(數據庫定義語言)
CREATE , DROP , ALTER 語句 : 使用PreparedStatement對象的execute()方法
對於DDL是否執行成功:對於任何sql語句執行報錯(不成功),都會報錯SQLException錯誤
舉例:CREATE語句
@Test public void test() throws Exception { Connection conn = JDBCUtils.getConnection(); String sql = "CREATE TABLE student(\n" + " id INT PRIMARY KEY AUTO_INCREMENT,\n" + " sname VARCHAR(200) NOT NULL,\n" + " note VARCHAR(200) NOT NULL\n" + ")"; PreparedStatement ps = conn.prepareStatement(sql); ps.execute();
JDBCUtils.closeResource(conn,ps);//關閉資源 }
二、執行DQL(數據庫查詢語言)
SELECT 語句 : 使用PreparedStatement對象的executeQuery()方法
對於DQL,只要執行成功,返回的必然是ResultSet對象,獲取其中的值類似於迭代器。
查詢一行數據(這里的異常沒有處理,簡化代碼,勿怪)
@Test public void test() throws Exception { Connection conn = JDBCUtils.getConnection(); String sql = "SELECT `id`,`name`,`email`,`birth` FROM customers WHERE id = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setObject(1,1);//設置第一個參數為1,填充?替代的值 ResultSet rs = ps.executeQuery();
if(rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); String email = rs.getString(3); Date date = rs.getDate(4); System.out.println(id+"\t"+name+"\t\t"+email+"\t"+date); //這里可以new一個對象接受 }
JDBCUtils.closeResource(conn,ps,rs);//關閉資源
}
查詢多行數據(這里的異常沒有處理,簡化代碼,勿怪)
@Test public void test() throws Exception { Connection conn = JDBCUtils.getConnection(); String sql = "SELECT `id`,`name`,`email`,`birth` FROM customers WHERE id BETWEEN ? AND ?;"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1,2);//設置第一個參數為2,填充?替代的值 ps.setInt(2,5);//設置第二個參數為5,填充第二個?替代的值 ResultSet rs = ps.executeQuery(); while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); String email = rs.getString("email"); Date date = rs.getDate("birth"); System.out.println(id+"\t"+name+"\t"+email+"\t"+date); //這里可以new一個對象接受,然后添加到集合中去 }
JDBCUtils.closeResource(conn,ps,rs);//關閉資源
}
如何做到通用查詢,通過ResultSetMetaDate提取出結果集的元數據。
public <T> T getInstance(Class<T> clazz, String sql, Object... args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 1.獲取數據庫連接 conn = JDBCUtils.getConnection(); // 2.預編譯sql語句,得到PreparedStatement對象 ps = conn.prepareStatement(sql); // 3.填充占位符 for (int i = 0; i < args.length; i++) { ps.setObject(i + 1, args[i]); } // 4.執行executeQuery(),得到結果集:ResultSet rs = ps.executeQuery(); // 5.得到結果集的元數據:ResultSetMetaData ResultSetMetaData rsmd = rs.getMetaData(); // 6.1通過ResultSetMetaData得到columnCount,columnLabel;通過ResultSet得到列值 int columnCount = rsmd.getColumnCount(); if (rs.next()) { T t = clazz.newInstance(); for (int i = 0; i < columnCount; i++) {// 遍歷每一個列 // 獲取列值 Object columnVal = rs.getObject(i + 1); // 獲取列的別名:列的別名,使用類的屬性名充當 String columnLabel = rsmd.getColumnLabel(i + 1); // 6.2使用反射,給對象的相應屬性賦值 Field field = clazz.getDeclaredField(columnLabel); field.setAccessible(true); field.set(t, columnVal); } return t; } } catch (Exception e) { e.printStackTrace(); } finally { // 7.關閉資源 JDBCUtils.closeResource(conn, ps, rs); } return null; }
三、執行DML(數據庫操作語言)
INSERT
, UPDATE
, DELETE 語句:使用PreparedStatement對象的executeUpdate()方法
//通用的增、刪、改操作(體現一:增、刪、改 ; 體現二:針對於不同的表):返回的是對數據庫影響的行數 public int update(String sql,Object ... args){ Connection conn = null; PreparedStatement ps = null; try { //1.獲取數據庫的連接 conn = JDBCUtils.getConnection(); //2.獲取PreparedStatement的實例 (或:預編譯sql語句) ps = conn.prepareStatement(sql); //3.填充占位符 for(int i = 0;i < args.length;i++){ ps.setObject(i + 1, args[i]); } //4.執行sql語句 return ps.executeUpdate(); } catch (Exception e) { e.printStackTrace(); }finally{ //5.關閉資源 JDBCUtils.closeResource(conn, ps); }
return 0;
}