中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何正確的使用BaseJDBC與CRUDDAO方法

發布時間:2020-12-05 16:28:55 來源:億速云 閱讀:145 作者:Leah 欄目:編程語言

如何正確的使用BaseJDBC與CRUDDAO方法?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

我們首先看下BASEJDBC的寫法實例:

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 {
 // 表示你要操作的是哪種類型的數據庫
 private final String DRIVER = "com.mysql.jdbc.Driver";
 // 表示你要連接的是哪一臺電腦的服務器端口號是多少數據庫的名字是什么
 private final String URL = "jdbc:mysql://localhost:3306/zzy";//有時這里需要加上字符集
 // 登錄數據庫的用戶名
 private final String USERNMAE = "root";
 // 登錄數據庫的密碼
 private final String PASSWORD = "root";
 /**
  * 注冊驅動 獲取連接
  * 
  * @return
  */
 public Connection getConnection() {
  try {
   //Driver d=new Driver();
   // 注冊驅動:反射(是一項很高深的技術)
   Class.forName(DRIVER);
   // 由連接大管家創建連接對象
   return DriverManager.getConnection(URL, USERNMAE, PASSWORD);
  } catch (ClassNotFoundException e) {
   //e.printStackTrace("數據庫的驅動文件沒有找到");
  } catch (SQLException e) {
   //數據庫的連接錯誤
   e.printStackTrace();
  }
  return null;
 }
 /**
  * 關閉連接釋放資源
  * @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 寫法代碼實例:

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;
 }
 /**
  * 查詢操作要改造的地方 第一:參數必須抽象 第二:返回類型必須抽象
  * 
  * @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("數據庫連接失敗");
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   super.closeAll(con, pt, rt);
  }
  return map;
 }
 /**
  * 將數據庫查詢到的數據進行封裝 封裝成實體類之后再返回給調用者
  * 
  * @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 {
   // 創建反射類的實例
   t = c.newInstance();
   // 反射出所有字段
   Field[] field = c.getDeclaredFields();
   for (Field f : field) {
    // 根據反射的字段名得到數據庫中的字段值
    Object value = rt.getObject(f.getName());
    f.setAccessible(true);// 打開私有字段的操作權限
    f.set(t, value);// 調用這個字段的公有的set方法封裝字段的值
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return t;
 }
 /**
  * 綁定參數
  * 
  * @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();
  }
 }
 /**
  * 修改操作 進行的事務的控制 所有命令要么同時提交成功 要么同時回滾
  * 
  * @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();
    // 關閉連接對象的自動提交的功能
    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("修改失敗,數據回滾!");
     }
     index++;
    }
   } else {
    System.out.println("數據庫連接失敗");
   }
  } catch (Exception e) {
   error++;
   e.printStackTrace();
  } finally {
   if (error > 0) {
    try {
     // 將前面已經執行的命令回滾
     con.rollback();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   } else {
    try {
     // 全部提交
     con.commit();
    } catch (SQLException e) {
     e.printStackTrace();
    }
   }
   super.closeAll(con, st, null);
  }
  return row;
 }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安远县| 揭东县| 林甸县| 汕尾市| 广宗县| 丹阳市| 克东县| 托克托县| 沁阳市| 泉州市| 手机| 昆明市| 淅川县| 芷江| 从江县| 全南县| 芒康县| 扶余县| 基隆市| 资溪县| 锦屏县| 苗栗县| 新平| 襄城县| 华安县| 梅州市| 茌平县| 江门市| 昌邑市| 江孜县| 鹤峰县| 呼玛县| 门头沟区| 延川县| 宁蒗| 大埔区| 冕宁县| 无为县| 米脂县| 龙游县| 绿春县|