1.數據庫驅動
介於Java程序和MySQL之間的程序。
2.JDBC
sun公司為了簡化開發人員的操作,提供了一個(Java操作數據庫的)規范,俗稱JDBC。這些規范的實現由具體的廠商去做。
對於開發人員來說,只需要掌握JDBC接口的操作即可。JDBC程序介於數據庫驅動和應用程序之間。
3.第一個JDBC程序
前期工作:
1.創建一個普通的Java項目
3.將mysql數據庫驅動jar包復制到lib文件夾中
4.右鍵lib文件夾,選中 add as library,這才意味着成功導入了驅動程序包
連接數據庫的步驟總結:
1、加載驅動
2、連接數據庫 DriverManager
3、獲得執行sql的對象 Statement
4、獲得返回的結果集
5、釋放連接
DriverManager
DriverManager.registerDriver(new com.mysql.jdbc.Driver()) Class.forName("com.mysql.jdbc.Driver()"); /* 上面這兩行代碼的作用都是一樣的,第一個是通過向DriverManager.registerDriver方法傳遞一個驅動對象 */ // DriverManager.registerDriver方法源碼如下 public static synchronized void registerDriver(java.sql.Driver driver) throws SQLException { registerDriver(driver, null); } // 其內部的registerDriver方法源碼如下 public static synchronized void registerDriver(java.sql.Driver driver, DriverAction da) throws SQLException { /* Register the driver if it has not already been added to our list */ if(driver != null) { registeredDrivers.addIfAbsent(new DriverInfo(driver, da)); } else { // This is for compatibility with the original DriverManager throw new NullPointerException(); } println("registerDriver: " + driver); } // 再來看一下com.mysql.jdbc.Driver()的源碼 public class Driver extends NonRegisteringDriver implements java.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } } /* 可以看到其內部有一個靜態代碼塊,在加載該類的時候,會執行這個靜態代碼塊,這個靜態代碼塊也是執行的 DriverManager.registerDriver方法,並且傳遞的是一個驅動對象,所以上面兩種加載驅動的方式的本質是一樣的 */ Connection connection = DriverManager.getConnection(url, username, password); // connection代表數據庫 //數據庫設置自動提交 connection.setAutoCommit() //事務提交 connection.commit() //事務回滾 connection.rollback()
URL
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false"; // jdbc:mysql://主機地址:port/數據庫名?參數1&參數2……
Statement 執行SQL的對象,PrepareStatement 執行SQL的對象
String sql = "select * from users"; Statement statement = connection.createStatement(); statement.execute(); statement.executeQuery(); // 查詢操作返回 一個結果集ResultSet statement.executeUpdate(); // 更新、插入、刪除都是使用這個方法,會返回一個受影響的行數 //5.執行SQL的對象去執行SQL,如果有結果,則查看返回結果
ResultSet
獲得指定的數據類型
ResultSet resultSet = statement.executeQuery(sql); // 結果集封裝了我們全部的查詢出來的結果 // 如果直到要獲取的字段的類型,就指定類型,否則就是要getObject方法 resultSet.getObejct(); resultSet.getString(); resultSet.getInt(); resultSet.getDate();
遍歷,指針
resultSet.beforeFirst() //移動到最前面 resultSet.afterLast() //移動到最后面 resultSet.next() // 移動下一個數據 resultSet.previous() // 移動到前一行 resultSet.absolute(row) // 移動到指定行
釋放資源
resultSet.close();
statement.close();
connection.close();
4.Statement對象
JDBC中的Statement對象用於向數據庫發送SQL語句,想完成對數據庫的增刪改查,只需要通過這個對象向數據庫發送增刪改查語句即可。
Statement對象的executeUpdate方法,用於向數據庫發送增、刪、改的sql語句,executeUpdate執行完成之后,,將會返回一個整數(即增刪改語句導致了數據庫幾行數據發生了變化)。
Statement.executeQuery方法用於向數據庫發送查詢語句,executeQuery方法返回代表查詢結果的ResultSet對象。
CRUD操作-insert
使用executeUpdate(String sql) 方法完成數據添加工作,示例操作:
Statement st = conn.createStatement(); String sql = "insert into user(....) values(....)"; int num = st.executeUpdate(sql); if(num > 0){ System.out.println("插入成功!!") }
CRUD操作-delete
使用executeUpdate(String sql)方法完成數據刪除操作,示例操作:
Statement st = conn.createStatement(); String sql = "delete from user where id=1"; int num = st.executeUpdate(sql); if(num > 0){ System.out.println("刪除成功!!") }
CRUD操作-update
使用executeUpdate(String sql)方法完成數據修改操作,示例操作:
Statement st = conn.createStatement(); String sql = "update user set name= '' where name = '' "; int num = st.executeUpdate(sql); if(num > 0){ System.out.println("修改成功!!") }
CRUD操作-read
使用executeQuery方法完成數據查詢操作,示例操作:
Statement st = conn.createStatement(); String sql = "select * from user where id=1"; ResultSet rs = st.executeQuery(sql); while(rs.next()){ // 根據獲取列的數據類型,分別調用rs的相應方法映射到java對象中 }
4.規范化實現
1.在src文件夾下寫一個配置文件db.properties,用於保存連接數據庫的關鍵信息;
內容如下:
driver = com.mysql.jdbc.Driver url = jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&&useSSL=false username = 用戶名 password = 密碼
2.新建一個utils包,用於存放連接數據庫的工具類,該工具類的代碼實現如下:
public class jdbcUtils { private static String driver = null; private static String url = null; private static String username = null; private static String password = null; static { try{ InputStream in = jdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(in); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); //1.驅動只用加載一次 Class.forName(driver); }catch (Exception e){ e.printStackTrace(); } } // 獲取連接 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } // 釋放連接資源 public static void relese(Connection conn, Statement st, ResultSet rs){ if (rs!=null){ try{ rs.close(); }catch (SQLException e) { e.printStackTrace(); } } if (st!=null){ try{ st.close(); }catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try{ conn.close(); }catch (SQLException e) { e.printStackTrace(); } } } }
3.在其他的具體業務包里面編寫具體操作數據庫的代碼
增加操作:
public class jdbctest02 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 獲取數據庫連接 st = conn.createStatement(); //獲得SQL的執行對象 String sql = "insert into users values(4,'lalal','123456','xxx@163.com','2020-01-01')"; int i = st.executeUpdate(sql); if (i>0){ System.out.println("插入成功"); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }
刪除操作:
public class jdbctest03 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 獲取數據庫連接 st = conn.createStatement(); //獲得SQL的執行對象 String sql = "delete from users where id = 4"; int i = st.executeUpdate(sql); if (i>0){ System.out.println("刪除成功"); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }
修改操作:
public class jdbctest04 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 獲取數據庫連接 st = conn.createStatement(); //獲得SQL的執行對象 String sql = "update users set name = '庫卡卡' where id = 1"; int i = st.executeUpdate(sql); if (i>0){ System.out.println("修改成功"); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }
查詢操作:
public class jdbctest05 { public static void main(String[] args) { Connection conn = null; Statement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); // 獲取數據庫連接 st = conn.createStatement(); //獲得SQL的執行對象 String sql = "select * from users"; rs = st.executeQuery(sql); while (rs.next()){ System.out.println("id="+rs.getObject("id")); System.out.println("name="+rs.getObject("name")); System.out.println("pwd="+rs.getObject("password")); System.out.println("email="+rs.getObject("email")); System.out.println("birthday="+rs.getObject("birthday")); } } catch (SQLException e) { e.printStackTrace(); }finally { jdbcUtils.relese(conn,st,rs); } } }