【Java】JDBC連接MySQL


JDBC連接MySQL

雖然在項目中通常用ORM的框架實現持久化。但經常因測試某些技術的需要,要寫一個完整的JDBC查詢數據庫。寫一個在這兒備份。

首先引入驅動包:

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
</dependencies>
View Code

 

寫一個簡單的連接測試是否能查詢數據:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCTester {

    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("成功加載驅動");

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            String url = "jdbc:mysql://localhost:3306/demo?user=root&password=123456&useUnicode=true&characterEncoding=UTF8";
            connection = DriverManager.getConnection(url);
            System.out.println("成功獲取連接");
            
            statement = connection.createStatement();
            String sql = "select * from t_balance";
            resultSet = statement.executeQuery(sql);

            resultSet.beforeFirst();
            while (resultSet.next()) {
                System.out.println(resultSet.getString(1));
            }
            System.out.println("成功操作數據庫");
        } catch(Throwable t) {
            // TODO 處理異常
            t.printStackTrace();
        } finally {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
            System.out.println("成功關閉資源");
        }
        
    }

}
View Code

 

看到以下日志,說明程序是正確的:

成功加載驅動
成功獲取連接
1
成功操作數據庫
成功關閉資源
View Code

 

JDBC的Connection默認是自動提交

case AutoCommit 描述 結果
1 Default(true) 沒有異常,沒有顯式commit 更新
2 Default(true) 有異常,沒有顯式commit 更新
3 Default(true) 有異常,沒有顯式commit,有顯式rollback 更新,異常包含Can't call rollback when autocommit=true

case 1:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JDBCTools {
    
    public static void main(String[] args) throws Exception {
        JDBCTools.query("select * from t_balance t");
        System.out.println();
        JDBCTools.execute("update t_balance t set t.balance = 20000 where t.user_id = 100");
        System.out.println();
        JDBCTools.query("select * from t_balance t");
    }
    
    public static String HOST = "localhost";
    public static String PORT = "3306";
    public static String DATABASE_NAME = "demo";
    public static String USER_NAME = "root";
    public static String PASSWORD = "123456";
    
    /**
     * 獲取數據庫連接
     * @return 數據庫連接
     */
    public static Connection getConn() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("成功加載驅動");
        
        String url = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE_NAME + "?user=" + USER_NAME + "&password=" + PASSWORD + "&useUnicode=true&characterEncoding=UTF8";
        Connection connection = DriverManager.getConnection(url);
        System.out.println("成功獲取連接");
        return connection;
    }
    
    /**
     * 關閉資源
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        System.out.println("成功關閉資源");
    }

    /**
     * 查詢SQL
     * @param sql 查詢語句
     * @return 數據集合
     * @throws SQLException
     */
    public static List<Map<String, String>> query(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<Map<String, String>> resultList = null;
        
        try {
            connection = JDBCTools.getConn();
            
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            System.out.println("SQL : " + sql);
            
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            int columnCount = resultSetMetaData.getColumnCount();
            String[] columnNames = new String[columnCount + 1];
            for (int i = 1; i <= columnCount; i++) {
                columnNames[i] = resultSetMetaData.getColumnName(i);
            }

            resultList = new ArrayList<Map<String, String>>();
            Map<String, String> resultMap = new HashMap<String, String>();
            resultSet.beforeFirst();
            while (resultSet.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    resultMap.put(columnNames[i], resultSet.getString(i));
                }
                resultList.add(resultMap);
            }
            System.out.println("成功查詢數據庫,查得數據:" + resultList);
        } catch(Throwable t) {
            // TODO 處理異常
            t.printStackTrace();
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return resultList;
    }
    
    /**
     * 執行SQL
     * @param sql 執行的SQL
     * @return 操作條數
     */
    public static int execute(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        int num = 0;
        
        try {
            connection = JDBCTools.getConn();
            
            statement = connection.createStatement();
            num = statement.executeUpdate(sql);
            System.out.println("SQL : " + sql);
            System.out.println("成功操作數據庫,影響條數:" + num);
            
            // 模擬異常,用於測試事務
            /*
            if (1 == 1) {
                throw new RuntimeException();
            }
            */
            
        } catch(Exception e) {
            // 處理異常:回滾事務后拋出異常
            e.printStackTrace();
            // connection.rollback();
            System.out.println("事務回滾");
            throw e;
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return num;
    }
    
}
View Code
成功加載驅動
成功獲取連接
SQL : select * from t_balance t
成功查詢數據庫,查得數據:[{id=1, balance=10000, user_id=100}]
成功關閉資源

成功加載驅動
成功獲取連接
SQL : update t_balance t set t.balance = 20000 where t.user_id = 100
成功操作數據庫,影響條數:1
成功關閉資源

成功加載驅動
成功獲取連接
SQL : select * from t_balance t
成功查詢數據庫,查得數據:[{id=1, balance=20000, user_id=100}]
成功關閉資源
View Code

 

case 2 :

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JDBCTools {
    
    public static void main(String[] args) throws Exception {
        JDBCTools.query("select * from t_balance t");
        System.out.println();
        JDBCTools.execute("update t_balance t set t.balance = 20000 where t.user_id = 100");
        System.out.println();
        JDBCTools.query("select * from t_balance t");
    }
    
    public static String HOST = "localhost";
    public static String PORT = "3306";
    public static String DATABASE_NAME = "demo";
    public static String USER_NAME = "root";
    public static String PASSWORD = "123456";
    
    /**
     * 獲取數據庫連接
     * @return 數據庫連接
     */
    public static Connection getConn() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("成功加載驅動");
        
        String url = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE_NAME + "?user=" + USER_NAME + "&password=" + PASSWORD + "&useUnicode=true&characterEncoding=UTF8";
        Connection connection = DriverManager.getConnection(url);
        System.out.println("成功獲取連接");
        return connection;
    }
    
    /**
     * 關閉資源
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        System.out.println("成功關閉資源");
    }

    /**
     * 查詢SQL
     * @param sql 查詢語句
     * @return 數據集合
     * @throws SQLException
     */
    public static List<Map<String, String>> query(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<Map<String, String>> resultList = null;
        
        try {
            connection = JDBCTools.getConn();
            
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            System.out.println("SQL : " + sql);
            
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            int columnCount = resultSetMetaData.getColumnCount();
            String[] columnNames = new String[columnCount + 1];
            for (int i = 1; i <= columnCount; i++) {
                columnNames[i] = resultSetMetaData.getColumnName(i);
            }

            resultList = new ArrayList<Map<String, String>>();
            Map<String, String> resultMap = new HashMap<String, String>();
            resultSet.beforeFirst();
            while (resultSet.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    resultMap.put(columnNames[i], resultSet.getString(i));
                }
                resultList.add(resultMap);
            }
            System.out.println("成功查詢數據庫,查得數據:" + resultList);
        } catch(Throwable t) {
            // TODO 處理異常
            t.printStackTrace();
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return resultList;
    }
    
    /**
     * 執行SQL
     * @param sql 執行的SQL
     * @return 操作條數
     */
    public static int execute(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        int num = 0;
        
        try {
            connection = JDBCTools.getConn();
            
            statement = connection.createStatement();
            num = statement.executeUpdate(sql);
            System.out.println("SQL : " + sql);
            System.out.println("成功操作數據庫,影響條數:" + num);
            
            // 模擬異常,用於測試事務
            if (1 == 1) {
                throw new RuntimeException();
            }
            
        } catch(Exception e) {
            // 處理異常:回滾事務后拋出異常
            e.printStackTrace();
            // connection.rollback();
            System.out.println("事務回滾");
            throw e;
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return num;
    }
    
}
View Code
成功加載驅動
成功獲取連接
SQL : select * from t_balance t
成功查詢數據庫,查得數據:[{id=1, balance=10000, user_id=100}]
成功關閉資源

成功加載驅動
成功獲取連接
SQL : update t_balance t set t.balance = 20000 where t.user_id = 100
成功操作數據庫,影響條數:1
事務回滾
java.lang.RuntimeException
    at JDBCTools.execute(JDBCTools.java:140)
    at JDBCTools.main(JDBCTools.java:17)
成功關閉資源
Exception in thread "main" java.lang.RuntimeException
    at JDBCTools.execute(JDBCTools.java:140)
    at JDBCTools.main(JDBCTools.java:17)
View Code

 

case 3 :

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JDBCTools {
    
    public static void main(String[] args) throws Exception {
        JDBCTools.query("select * from t_balance t");
        System.out.println();
        JDBCTools.execute("update t_balance t set t.balance = 20000 where t.user_id = 100");
        System.out.println();
        JDBCTools.query("select * from t_balance t");
    }
    
    public static String HOST = "localhost";
    public static String PORT = "3306";
    public static String DATABASE_NAME = "demo";
    public static String USER_NAME = "root";
    public static String PASSWORD = "123456";
    
    /**
     * 獲取數據庫連接
     * @return 數據庫連接
     */
    public static Connection getConn() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("成功加載驅動");
        
        String url = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE_NAME + "?user=" + USER_NAME + "&password=" + PASSWORD + "&useUnicode=true&characterEncoding=UTF8";
        Connection connection = DriverManager.getConnection(url);
        System.out.println("成功獲取連接");
        return connection;
    }
    
    /**
     * 關閉資源
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        System.out.println("成功關閉資源");
    }

    /**
     * 查詢SQL
     * @param sql 查詢語句
     * @return 數據集合
     * @throws SQLException
     */
    public static List<Map<String, String>> query(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<Map<String, String>> resultList = null;
        
        try {
            connection = JDBCTools.getConn();
            
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            System.out.println("SQL : " + sql);
            
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            int columnCount = resultSetMetaData.getColumnCount();
            String[] columnNames = new String[columnCount + 1];
            for (int i = 1; i <= columnCount; i++) {
                columnNames[i] = resultSetMetaData.getColumnName(i);
            }

            resultList = new ArrayList<Map<String, String>>();
            Map<String, String> resultMap = new HashMap<String, String>();
            resultSet.beforeFirst();
            while (resultSet.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    resultMap.put(columnNames[i], resultSet.getString(i));
                }
                resultList.add(resultMap);
            }
            System.out.println("成功查詢數據庫,查得數據:" + resultList);
        } catch(Throwable t) {
            // TODO 處理異常
            t.printStackTrace();
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return resultList;
    }
    
    /**
     * 執行SQL
     * @param sql 執行的SQL
     * @return 操作條數
     */
    public static int execute(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        int num = 0;
        
        try {
            connection = JDBCTools.getConn();
            
            statement = connection.createStatement();
            num = statement.executeUpdate(sql);
            System.out.println("SQL : " + sql);
            System.out.println("成功操作數據庫,影響條數:" + num);
            
            // 模擬異常,用於測試事務
            if (1 == 1) {
                throw new RuntimeException();
            }
            
        } catch(Exception e) {
            // 處理異常:回滾事務后拋出異常
            e.printStackTrace();
            connection.rollback();
            System.out.println("事務回滾");
            throw e;
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return num;
    }
    
}
View Code
成功加載驅動
成功獲取連接
SQL : select * from t_balance t
成功查詢數據庫,查得數據:[{id=1, balance=10000, user_id=100}]
成功關閉資源

成功加載驅動
成功獲取連接
SQL : update t_balance t set t.balance = 20000 where t.user_id = 100
成功操作數據庫,影響條數:1
java.lang.RuntimeException
    at JDBCTools.execute(JDBCTools.java:140)
    at JDBCTools.main(JDBCTools.java:17)
成功關閉資源
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Can't call rollback when autocommit=true
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.Util.getInstance(Util.java:387)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:917)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:896)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:885)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:4618)
    at JDBCTools.execute(JDBCTools.java:146)
    at JDBCTools.main(JDBCTools.java:17)
View Code

 

最簡單的工具類

封裝個簡單的查詢MySQL的工具類更方便使用。注:此實現非常簡單,僅用於日常測試,不適合生產環境使用

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JDBCTools {
    
    public static void main(String[] args) throws Exception {
        JDBCTools.query("select * from t_balance t");
        JDBCTools.execute("update t_balance t set t.balance = 20000 where t.user_id = 100");
        JDBCTools.query("select * from t_balance t");
    }
    
    public static String HOST = "localhost";
    public static String PORT = "3306";
    public static String DATABASE_NAME = "demo";
    public static String USER_NAME = "root";
    public static String PASSWORD = "123456";
    
    /**
     * 獲取數據庫連接
     * @return 數據庫連接
     */
    public static Connection getConn() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("成功加載驅動");
        
        String url = "jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE_NAME + "?user=" + USER_NAME + "&password=" + PASSWORD + "&useUnicode=true&characterEncoding=UTF8";
        Connection connection = DriverManager.getConnection(url);
        System.out.println("成功獲取連接");
        return connection;
    }
    
    /**
     * 關閉資源
     */
    public static void closeResource(Connection conn, Statement st, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO 處理異常
                e.printStackTrace();
            }
        }
        System.out.println("成功關閉資源");
    }

    /**
     * 查詢SQL
     * @param sql 查詢語句
     * @return 數據集合
     * @throws SQLException
     */
    public static List<Map<String, String>> query(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        List<Map<String, String>> resultList = null;
        
        try {
            connection = JDBCTools.getConn();
            
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            
            ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
            int columnCount = resultSetMetaData.getColumnCount();
            String[] columnNames = new String[columnCount + 1];
            for (int i = 1; i <= columnCount; i++) {
                columnNames[i] = resultSetMetaData.getColumnName(i);
            }

            resultList = new ArrayList<Map<String, String>>();
            Map<String, String> resultMap = new HashMap<String, String>();
            resultSet.beforeFirst();
            while (resultSet.next()) {
                for (int i = 1; i <= columnCount; i++) {
                    resultMap.put(columnNames[i], resultSet.getString(i));
                }
                resultList.add(resultMap);
            }
            System.out.println("成功查詢數據庫,查得數據:" + resultList);
        } catch(Throwable t) {
            // TODO 處理異常
            t.printStackTrace();
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return resultList;
    }
    
    /**
     * 執行SQL
     * @param sql 執行的SQL
     * @return 操作條數
     */
    public static int execute(String sql) throws Exception {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        int num = 0;
        
        try {
            connection = JDBCTools.getConn();
            connection.setAutoCommit(false);
            
            statement = connection.createStatement();
            num = statement.executeUpdate(sql);
            System.out.println("成功操作數據庫,影響條數:" + num);
            
            // 模擬異常,用於測試事務
            /*
            if (1 == 1) {
                throw new RuntimeException();
            }
            */
            
            connection.commit();
        } catch(Exception e) {
            // 處理異常:回滾事務后拋出異常
            e.printStackTrace();
            connection.rollback();
            System.out.println("事務回滾");
            throw e;
        } finally {
            JDBCTools.closeResource(connection, statement, resultSet);
        }
        
        return num;
    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM