一 JDBC簡介
Java DataBase Connectivity Java語言連接數據庫
官方(Sun公司)定義的一套操作所有關系型數據庫的規則(接口) 各個數據庫廠商去實現這套接口 提供數據庫驅動JAR包 可以使用這套接口(JDBC)編程 真正執行的代碼是驅動JAR包中的實現類
二 JDBC初體驗
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hy.jdbc</groupId> <artifactId>jdbc-demo</artifactId> <version>1.0-SNAPSHOT</version> <!-- 定義依賴版本號 --> <properties> <junit.version>4.12</junit.version> <mysql-connector-java.version>8.0.11</mysql-connector-java.version> <druid.version>1.1.10</druid.version> </properties> <!-- 管理jar版本號 --> <dependencyManagement> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-java.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> </dependencies> </project>
sql
CREATE TABLE account ( aid INT PRIMARY KEY, aname VARCHAR(100), amoney DOUBLE );
2. 插入
@Test public void test01() { Connection connection = null; PreparedStatement statement = null; try { // 注冊驅動 MySQL5之后的驅動JAR包可以省略該步驟 Class.forName("com.mysql.cj.jdbc.Driver"); // 獲取數據庫連接對象 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy?characterEncoding=utf8&useSSL=false", "root", "root"); // 開啟事務 connection.setAutoCommit(false); // 定義SQL String sql = "insert into account values(?, ?, ?)"; // 獲取執行SQL的對象 PreparedStatement statement = connection.prepareStatement(sql); // 設置參數 statement.setInt(1, 1); //'?' 位置的編號 從1開始 statement.setString(2, "No1"); //'?' 位置的編號 從1開始 statement.setDouble(3, 2000); //'?' 位置的編號 從1開始 // 執行SQL 返回受影響的行數 int count = statement.executeUpdate(); // 提交事務 connection.commit(); // 處理結果 System.out.println("count = " + count); } catch (Exception e) { e.printStackTrace(); // 回滾事務 if (null != connection) { try { connection.rollback(); } catch (SQLException exception) { exception.printStackTrace(); } } } finally { // 釋放資源 if (null != statement) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != connection) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
3. 刪除
@Test public void test02() { Connection connection = null; PreparedStatement statement = null; try { // 注冊驅動 MySQL5之后的驅動JAR包可以省略該步驟 //Class.forName("com.mysql.cj.jdbc.Driver"); // 獲取數據庫連接對象 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy?characterEncoding=utf8&useSSL=false", "root", "root"); // 開啟事務 connection.setAutoCommit(false); // 定義SQL String sql = "delete from account where aid = ?"; // 獲取執行SQL的對象 PreparedStatement statement = connection.prepareStatement(sql); // 設置參數 statement.setInt(1, 1); //'?' 位置的編號 從1開始 // 執行SQL 返回受影響的行數 int count = statement.executeUpdate(); // 提交事務 connection.commit(); // 處理結果 System.out.println("count = " + count); } catch (Exception e) { e.printStackTrace(); // 回滾事務 if (null != connection) { try { connection.rollback(); } catch (SQLException exception) { exception.printStackTrace(); } } } finally { // 釋放資源 if (null != statement) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != connection) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
4. 修改
@Test public void test03() { Connection connection = null; PreparedStatement statement1 = null; PreparedStatement statement2 = null; try { // 注冊驅動 MySQL5之后的驅動JAR包可以省略該步驟 Class.forName("com.mysql.cj.jdbc.Driver"); // 獲取數據庫連接對象 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy?characterEncoding=utf8&useSSL=false", "root", "root"); // 開啟事務 connection.setAutoCommit(false); // 定義SQL String sql1 = "update account set amoney = amoney + ? where aid = ?"; String sql2 = "update account set amoney = amoney - ? where aid = ?"; // 獲取執行SQL的對象 PreparedStatement statement1 = connection.prepareStatement(sql1); statement2 = connection.prepareStatement(sql2); // 設置參數 statement1.setDouble(1, 500); //'?' 位置的編號 從1開始 statement1.setInt(2, 1); //'?' 位置的編號 從1開始 statement2.setDouble(1, 500); //'?' 位置的編號 從1開始 statement2.setInt(2, 2); //'?' 位置的編號 從1開始 // 執行SQL 返回受影響的行數 statement1.executeUpdate(); int i = 3 / 0; //模擬異常 statement2.executeUpdate(); // 提交事務 connection.commit(); } catch (Exception e) { e.printStackTrace(); // 回滾事務 if (null != connection) { try { connection.rollback(); } catch (SQLException exception) { exception.printStackTrace(); } } } finally { // 釋放資源 if (null != statement2) { try { statement2.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != statement1) { try { statement1.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != connection) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
5. 查詢
@Test public void test04() { Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { // 注冊驅動 MySQL5之后的驅動JAR包可以省略該步驟 Class.forName("com.mysql.cj.jdbc.Driver"); // 獲取數據庫連接對象 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo_hy?characterEncoding=utf8&useSSL=false", "root", "root"); // 開啟事務 connection.setAutoCommit(false); // 定義SQL String sql = "select * from account"; // 獲取執行SQL的對象 PreparedStatement statement = connection.prepareStatement(sql); // 執行SQL 返回結果集 resultSet = statement.executeQuery(); // 提交事務 connection.commit(); // 處理結果 while (resultSet.next()) { int id = resultSet.getInt(1); //代表列的編號 從1開始 String name = resultSet.getString("aname"); //代表列的名稱 double money = resultSet.getDouble(3); //代表列的編號 從1開始 System.out.println(id + "---" + name + "---" + money); } } catch (Exception e) { e.printStackTrace(); // 回滾事務 if (null != connection) { try { connection.rollback(); } catch (SQLException exception) { exception.printStackTrace(); } } } finally { // 釋放資源 if (null != resultSet) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != statement) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != connection) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
三 數據庫連接池
一個存放數據庫連接的容器
當系統初始化后 容器被創建 容器中會申請一些連接對象 當用戶訪問數據庫時 從容器中獲取連接對象 用戶訪問完之后 會將連接對象歸還給容器 這樣可以節約資源 提高訪問效率
常見的數據庫連接池有 Druid C3P0...
Druid初體驗
resources/druid.properties
url=jdbc:mysql://localhost:3306/demo_hy?characterEncoding=utf8&useSSL=false driverClassName=com.mysql.cj.jdbc.Driver username=root password=root maxActive=10 minIdle=5
XTest.java
@Test public void test05() { InputStream stream = null; Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { // 加載配置文件 Properties properties = new Properties(); stream = XTest.class.getClassLoader().getResourceAsStream("druid.properties"); properties.load(stream); // 獲取連接池對象 DataSource dataSource = DruidDataSourceFactory.createDataSource(properties); // 獲取數據庫連接對象 Connection connection = dataSource.getConnection(); // 開啟事務 connection.setAutoCommit(false); // 定義SQL String sql = "select * from account"; // 獲取執行SQL的對象 PreparedStatement statement = connection.prepareStatement(sql); // 執行SQL 返回結果集 resultSet = statement.executeQuery(); // 提交事務 connection.commit(); // 處理結果 while (resultSet.next()) { int id = resultSet.getInt(1); //代表列的編號 從1開始 String name = resultSet.getString("aname"); //代表列的名稱 double money = resultSet.getDouble(3); //代表列的編號 從1開始 System.out.println(id + "---" + name + "---" + money); } } catch (Exception e) { e.printStackTrace(); // 回滾事務 if (null != connection) { try { connection.rollback(); } catch (SQLException exception) { exception.printStackTrace(); } } } finally { // 釋放資源 if (null != resultSet) { try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != statement) { try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (null != connection) { try { connection.close(); //歸還連接 } catch (SQLException e) { e.printStackTrace(); } } if (null != stream) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } }