雖然在項目中一般用ORM的框架實現持久化。但常常因測試某些技術的須要,要寫一個完整的JDBC查詢數據庫。寫一個在這兒備份。java
首先引入驅動包:mysql
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> </dependencies>
寫一個簡單的鏈接測試是否能查詢數據:sql
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("成功關閉資源"); } } }
看到如下日誌,說明程序是正確的:數據庫
成功加載驅動 成功獲取鏈接 1 成功操做數據庫 成功關閉資源
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; } }
成功加載驅動 成功獲取鏈接 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}] 成功關閉資源
case 2 :ide
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; } }
成功加載驅動 成功獲取鏈接 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)
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; } }
成功加載驅動 成功獲取鏈接 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)
封裝個簡單的查詢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; } }