BaseJDBC和CRUDDAO的寫法實(shí)例代碼
我們首先看下BASEJDBC的寫法實(shí)例:
package com.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mysql.jdbc.Driver; public class BaseJDBC { // 表示你要操作的是哪種類型的數(shù)據(jù)庫 private final String DRIVER = "com.mysql.jdbc.Driver"; // 表示你要連接的是哪一臺電腦的服務(wù)器端口號是多少數(shù)據(jù)庫的名字是什么 private final String URL = "jdbc:mysql://localhost:3306/zzy";//有時這里需要加上字符集 // 登錄數(shù)據(jù)庫的用戶名 private final String USERNMAE = "root"; // 登錄數(shù)據(jù)庫的密碼 private final String PASSWORD = "root"; /** * 注冊驅(qū)動 獲取連接 * * @return */ public Connection getConnection() { try { //Driver d=new Driver(); // 注冊驅(qū)動:反射(是一項(xiàng)很高深的技術(shù)) Class.forName(DRIVER); // 由連接大管家創(chuàng)建連接對象 return DriverManager.getConnection(URL, USERNMAE, PASSWORD); } catch (ClassNotFoundException e) { //e.printStackTrace("數(shù)據(jù)庫的驅(qū)動文件沒有找到"); } catch (SQLException e) { //數(shù)據(jù)庫的連接錯誤 e.printStackTrace(); } return null; } /** * 關(guān)閉連接釋放資源 * @param con * @param st * @param rt */ public void closeAll(Connection con, Statement st, ResultSet rt) { try { if (rt != null) { rt.close(); rt = null; } } catch (SQLException e) { e.printStackTrace(); } try { if (st != null) { st.close(); st = null; } } catch (SQLException e) { e.printStackTrace(); } try { if (con != null) { con.close(); con = null; } } catch (SQLException e) { e.printStackTrace(); } } }
CRUDDAO 寫法代碼實(shí)例:
package com.dao; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.sql.*; import java.util.*; import java.util.Map.Entry; /** * * @author zzy * * 2016年12月1日下午1:49:49 */ public class CRUDDAO<T> extends BaseJDBC { private Connection con = null; private PreparedStatement pt = null; private Statement st = null; private ResultSet rt = null; private Class<T> c; public CRUDDAO() { } public CRUDDAO(Class<T> c) { this.c = c; } /** * 查詢操作要改造的地方 第一:參數(shù)必須抽象 第二:返回類型必須抽象 * * @param <T> * @param <T> * * @return Map<Integer, List<T>> */ public Map<Integer, List<T>> selectAll(Map<String, Object[]> m) { int index = 0; Map<Integer, List<T>> map = new LinkedHashMap<Integer, List<T>>(); List<T> list = null; try { con = super.getConnection(); if (con != null) { Set<Entry<String, Object[]>> set = m.entrySet(); for (Entry<String, Object[]> entry : set) { list = new ArrayList<T>(); pt = con.prepareStatement(entry.getKey()); this.bind(entry.getValue()); rt = pt.executeQuery(); while (rt.next()) { list.add(this.toBean2()); } map.put(++index, list); } } else { System.out.println("數(shù)據(jù)庫連接失敗"); } } catch (SQLException e) { e.printStackTrace(); } finally { super.closeAll(con, pt, rt); } return map; } /** * 將數(shù)據(jù)庫查詢到的數(shù)據(jù)進(jìn)行封裝 封裝成實(shí)體類之后再返回給調(diào)用者 * * @return */ private T toBean() { T t = null; try { t = c.newInstance(); Method[] m = c.getMethods(); ResultSetMetaData rmt = rt.getMetaData(); for (int i = 1, count = rmt.getColumnCount(); i <= count; i++) { String columName = rmt.getColumnName(i); columName = "set" + columName.substring(0, 1).toUpperCase() + columName.substring(1); for (int j = 0; j < m.length; j++) { if (columName.equals(m[j].getName())) { m[j].invoke(t, rt.getObject(i)); break; } } } } catch (Exception e) { e.printStackTrace(); } return t; } private T toBean2() { T t = null; try { // 創(chuàng)建反射類的實(shí)例 t = c.newInstance(); // 反射出所有字段 Field[] field = c.getDeclaredFields(); for (Field f : field) { // 根據(jù)反射的字段名得到數(shù)據(jù)庫中的字段值 Object value = rt.getObject(f.getName()); f.setAccessible(true);// 打開私有字段的操作權(quán)限 f.set(t, value);// 調(diào)用這個字段的公有的set方法封裝字段的值 } } catch (Exception e) { e.printStackTrace(); } return t; } /** * 綁定參數(shù) * * @param obj */ private void bind(Object[] obj) { try { if (obj != null) { for (int i = 0, k = obj.length; i < k; i++) { pt.setObject(i + 1, obj[i]); } } } catch (SQLException e) { e.printStackTrace(); } } /** * 修改操作 進(jìn)行的事務(wù)的控制 所有命令要么同時提交成功 要么同時回滾 * * @param name * @param id * @return */ public int[] updateAll(Map<String, Object[]> map) { int[] row = new int[map.size()]; int index = 0; int error = 0; try { con = super.getConnection(); if (con != null) { Set<Entry<String, Object[]>> set = map.entrySet(); // 關(guān)閉連接對象的自動提交的功能 con.setAutoCommit(false); for (Entry<String, Object[]> entry : set) { pt = con.prepareStatement(entry.getKey()); this.bind(entry.getValue()); row[index] = pt.executeUpdate(); if (row[index] == 0) { throw new Exception("修改失敗,數(shù)據(jù)回滾!"); } index++; } } else { System.out.println("數(shù)據(jù)庫連接失敗"); } } catch (Exception e) { error++; e.printStackTrace(); } finally { if (error > 0) { try { // 將前面已經(jīng)執(zhí)行的命令回滾 con.rollback(); } catch (SQLException e) { e.printStackTrace(); } } else { try { // 全部提交 con.commit(); } catch (SQLException e) { e.printStackTrace(); } } super.closeAll(con, st, null); } return row; } }
總結(jié)
以上就是本文關(guān)于BaseJDBC和CRUDDAO的寫法實(shí)例代碼的全部內(nèi)容,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
spring注入在有常量的情況下使用@AllArgsConstructor操作
這篇文章主要介紹了spring注入在有常量的情況下使用@AllArgsConstructor操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解
這篇文章主要介紹了Java8的DateTimeFormatter與SimpleDateFormat的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Java多線程中不同條件下編寫生產(chǎn)消費(fèi)者模型方法介紹
這篇文章主要介紹了Java多線程中不同條件下編寫生產(chǎn)消費(fèi)者模型方法介紹,介紹了生產(chǎn)消費(fèi)者模型,然后分享了相關(guān)代碼示例,具有一定參考價值,需要的朋友可以了解下。2017-11-11SpringBoot整合EasyExcel實(shí)現(xiàn)復(fù)雜Excel表格的導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何整合EasyExcel實(shí)現(xiàn)復(fù)雜Excel表格的導(dǎo)入導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考下2023-11-11springBoot?@Scheduled實(shí)現(xiàn)多個任務(wù)同時開始執(zhí)行
這篇文章主要介紹了springBoot?@Scheduled實(shí)現(xiàn)多個任務(wù)同時開始執(zhí)行,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12springboot實(shí)現(xiàn)郵箱發(fā)送(激活碼)功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用springboot實(shí)現(xiàn)郵箱發(fā)送(激活碼)功能,文中的示例代碼簡潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10