1. 程式人生 > 其它 >MySql的JDBC技術的簡單封裝

MySql的JDBC技術的簡單封裝

技術標籤:jdbc

什麼是JDBC技術

Java資料庫連線,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規範客戶端程式如何來訪問資料庫的應用程式介面,提供了諸如查詢和更新資料庫中資料的方法。我們通常說的JDBC是面向關係型資料庫的。這裡要講的是MySql資料庫的連線技術.

步驟

新增jar包

新增MySql的驅動

在這裡插入圖片描述

新增連線池jar

這裡用到的是阿里的連線池技術: druid
在這裡插入圖片描述

封裝JDBC

這裡主要是對增刪查改的這些操作進行的封裝

程式碼如下:

import java.lang.reflect.Field;
import java.sql.
*; import java.util.*; /** * @Author mrchen 2020/12/10 */ public class DBUtils { /** * 驅動類路徑 */ private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver"; /** * url地址,賬戶,以及密碼 */ private static final String URL = "jdbc:mysql://localhost:3306/test"
; private static final String USER = "root"; private static final String PASSWORD = "chenda"; static { try { Class.forName(DRIVER_CLASS); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private DBUtils
() { } /** * 獲取資料庫連線物件 * * @return 資料庫連線物件 */ public static Connection getConnection() { try { return DriverManager.getConnection(URL, USER, PASSWORD); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 釋放資源 * * @param rs 結果集 * @param stmt 資料庫操作物件 * @param conn 資料庫連線物件 */ public static void close(ResultSet rs, Statement stmt, Connection conn) { if (Objects.nonNull(rs)) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (Objects.nonNull(stmt)) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (Objects.nonNull(conn)) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * Object -> Map * 將查詢的結果儲存到一個List集合中,集合中的每一個元素即一個Map物件 * (屬性:屬性值) * @return */ public static List<Map<String,Object>> queryToMap(String sql,Object...params) { //宣告List集合儲存所有查詢到的資料(內部的每一條資料使用一個Map物件表示) List<Map<String,Object>> list = new ArrayList<>(); Connection conn = DBUtils.getConnection(); PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); //執行預處理(如果存在佔位符,則為佔位符填充具體的值) if(Objects.nonNull(params)){ for (int i = 0; i < params.length; i++) { ps.setObject(i+1,params[i]); } } rs = ps.executeQuery(); //獲取結果集元資料物件 ResultSetMetaData rsmd = rs.getMetaData(); //獲取總查詢列數 int columnCount = rsmd.getColumnCount(); while(rs.next()){ Map<String,Object> map = new HashMap<>(); //獲取每一列的列標籤 for (int i = 1; i <= columnCount ; i++) { //獲取指定的列標籤 String label = rsmd.getColumnLabel(i); //根據列標籤獲取列值 Object value = rs.getObject(label); //將一個查詢列裝入map map.put(label,value); } //將map集合(javabean)儲存到List list.add(map); } } catch (SQLException e) { e.printStackTrace(); } finally { close(rs,ps,conn); } return list; } /** * 封裝通用的更新操作(insert, update, delete) * * @param sql 需要執行的sql * @param params 執行sql語句需要傳遞進去的引數 * @return 執行結果 */ public static boolean executeUpdate(String sql, Object... params) { Connection conn = getConnection(); PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } return ps.executeUpdate() > 0; } catch (SQLException e) { e.printStackTrace(); } finally { close(null, ps, conn); } return false; } /** * 實現自動提交事務的 * * 這個地方的異常需要丟擲 * * @param conn * @param sql * @param params * @return */ public static boolean executeUpdate(Connection conn, String sql, Object... params) throws SQLException { PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } return ps.executeUpdate() > 0; } finally { close(null, ps, null); } } public static <T> List<T> query(String sql, DealReaultSet<T> deal, Object... params) { Connection conn = getConnection(); PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } rs = ps.executeQuery(); return deal.deal(rs); } catch (SQLException e) { e.printStackTrace(); } finally { close(rs, ps, conn); } return null; } /** * 封裝通用查詢單條資料的方法 * * JDBC,反射,集合框架,lambda表示式,新增Objects類 * * @param <T> * @param t * @param sql * @param params * @return */ public static <T> T queryOne(Class<T> t, String sql, Object... params) { // 獲取查詢到到資料集合 List<Map<String, Object>> list = queryToMap(sql, params); if (list.size() > 0) { // 獲取一個Map物件 Map<String, Object> map = list.get(0); // 將map集合轉換為Javabean並返回 return mapToBean(map, t); } return null; } /** * 封裝通用查詢多條資料的方法 * * @param <T> * @param t * @param sql * @param params * @return */ public static <T> List<T> queryList(Class<T> t, String sql, Object... params) { List<T> list = new ArrayList<T>(); // 獲取所有查詢的到的資料 List<Map<String, Object>> maps = queryToMap(sql, params); // 遍歷集合中每一條資料(map) maps.forEach(m -> { // 將map轉換為Javabean T obj = mapToBean(m, t); // 將Javabean裝入list list.add(obj); }); return list; } /** * 將Map集合轉換為一個確定的型別 * * @param <T> * @param map * @param t * @return */ private static <T> T mapToBean(Map<String, Object> map, Class<T> t) { try { // 根據提供的Class物件建立對應型別的Object T obj = t.newInstance(); map.forEach((k, v) -> { try { // 根據Field名稱獲取欄位物件 Field field = t.getDeclaredField(k); // 設定欄位的可訪問性 field.setAccessible(true); // 為欄位設定值 field.set(obj, v); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } }); return obj; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } // 返回物件 return null; } }

簡單分析:
主要是對update, delete, insert , select 等sql操作的封裝, 運用到了一些簡單的反射機制,以及metadata的操作, 能幫助我們在學的框架的時候更好的理解;

總結

這個封裝是為了我們在平時學習中簡化自己的程式碼, 在學習框架之前也能先嚐試理解一下框架的思想.

文章目錄