1.JDBC為什么會存在?
- 市面上有如此多的數據庫廠商,Mysql、Oracle等等,他們使用不同的網絡協議,Java開發人員為每一個數據庫編寫一套接口是不可能完成的,所以需要一個統一的接口。
- 從使用者來看,使用者不可能清楚每一個數據庫的驅動程序。
2.JDBC的實現基於這樣的思想:根據JDBC編寫的程序能夠與一個驅動管理器通信,驅動管理器通過驅動程序與實際的數據庫進行通信。
3.如何使用JDBC與數據庫連接?
使用mysql作為例子:(mysql-connection-java jar)
- DriverManager 驅動管理器
- 注冊驅動:
- 為避免注冊兩次,使用Class.forName(“com.mysql.cj.jdbc.Driver”)
- 獲取連接: DriverManager.getConnection(URI,root,password)
- 返回connection對象.
- 注冊驅動:
- connection對象
- 創建執行sql語句的對象
- connection.prepareStatement() 返回preparedStatement對象
- 進行事務管理
- connection.setAutoCommit(true)
- connection.commit()手動提交
- connection.rollback()
- 創建執行sql語句的對象
- preparedStatement對象
- 執行sql語句
- preparedStatement.execute(sql) return boolean
- preparedStatement.executeQuery(sql) return ResultSet
- preparedStatement.executeUpdate(sql) return int
- 批處理
- addBatch(sql)
- executeBatch(sql)
- clearBatch(sql)
- 執行sql語句
4.代碼演示:

使用jdbc查詢id=1的name值
import java.sql.*; public class JDBCTest1 { public static void jdbctest(){ try { Class.forName("com.mysql.cj.jdbc.Driver"); Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/datatest?" + "useEncoding=true&characterEncoding=utf-8&serverTimezone=UTC","root","123456"); //這里的連接符號是&,而在spring的配置文件中使用的是& String sql="select * from student where id=?"; PreparedStatement preparedStatement=connection.prepareStatement(sql); preparedStatement.setInt(1,1); ResultSet resultSet= preparedStatement.executeQuery(); while(resultSet.next()){ System.out.println(resultSet.getString("name")); } resultSet.close(); preparedStatement.close();// 別忘記釋放資源 connection.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static void main(String[] args) { JDBCTest1.jdbctest(); } }
5.數據庫連接池
- why? 一次訪問就會創建一個連接,當同時訪問的次數多了之后,創建連接這個動作一直在做,會極大的消耗數據庫資源,造成內存溢出。
有了連接池之后,Dao層會去連接池中獲得已經創建好的連接,不用再去新建連接,然后同數據庫進行通訊。
- 使用c3p0連接池來連接數據庫。共有三種方式來獲得c3p0池支持的數據源,比較方便的是ComboPooledDataSource的實例。
- C3P0 的jar 包需要提前導入
public class C3P0Test { public static void testC3p0() throws PropertyVetoException, SQLException { //創建連接池對象 ComboPooledDataSource comboPooledDataSource=new ComboPooledDataSource(); //設置數據源 comboPooledDataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/datatest?useEncoding=true&characterEncoding=utf-8&serverTimezone=UTC"); comboPooledDataSource.setUser("root"); comboPooledDataSource.setPassword("123456"); //獲取連接 Connection connection=comboPooledDataSource.getConnection(); //sql語句 String sql="update student set name=? where id=?"; PreparedStatement ps=connection.prepareStatement(sql); ps.setString(1,"liuchen"); ps.setInt(2,1); if(ps.executeUpdate()>0){ System.out.println("修改成功!"); } } public static void main(String[] args) throws PropertyVetoException, SQLException { C3P0Test.testC3p0(); } }

修改成功!
