婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳解JDBC數據庫鏈接及相關方法的封裝

詳解JDBC數據庫鏈接及相關方法的封裝

熱門標簽:電話機器人免費嗎 龍圖酒吧地圖標注 地圖標注圖標素材入駐 好搜地圖標注 怎么申請400電話申請 百度地圖標注地方備注 400電話申請什么好 怎么辦理400電話呢 電銷機器人價格多少錢一臺

詳解JDBC數據庫鏈接及相關方法的封裝

 使用的是MySQL數據庫,首先導入驅動類,然后根據數據庫URL和用戶名密碼獲得數據的鏈接。由于使用的是MySQL數據庫,它的URL一般為,jdbc:mysql://主機地址:端口號/庫名。

  下面是封裝的具體類,用到了泛型和反射,不過還存在些問題,就是對使用的泛型對象有些限制,只能用于泛型類對象屬性名與數據庫表中列名相同的對象,而且初始化對象的方法必須為set+屬性名的方法。本來想通過返回值類型,參數列表來確定該屬性初始化方法的,然而可能是目前學到的還是太少,只學了三周,所以并沒有實現,感覺這個方法還是很low,以后還要繼續完善。本來看到網上有用beanUtils包,利用map將查詢的一列存起來,直接轉化成該對象的,但是就是想試試新學到的反射。而且最后的垃圾回收器并不能如同C++的析構函數一樣,所以關閉數據庫鏈接的地方也需要改善。

實現代碼:

public class Consql {
 private static Consql consql=null;//單例設計模式
 private Connection conn=null;//數據庫鏈接
 private final String url;//數據庫url
 private final String username;//數據庫用戶名
 private final String password;//數據庫密碼
 //驅動類的加載
 static{//以靜態代碼塊的形式加載驅動類,靜態代碼塊只在類加載的時候執行一次
  try {
   Class.forName("com.mysql.jdbc.Driver");
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 //構造函數
 private Consql(String url,String username,String password) throws SQLException{
  this.url = url;
  this.username = username;
  this.password = password;
  open();//創建連接
 }
 private Connection open() throws SQLException
 {
  try {//驅動器獲取數據庫鏈接
   conn=DriverManager.getConnection(url, username, password);
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   //e.printStackTrace();
   throw e;
  }  
  return conn;  
 }
 /**
  * 帶限制條件查找
  * @param sql 帶占位符?的sql語句
  * @param t 返回相關類型對象的類(T.class)
  * @param params 替換占位符的數據,為動態數組
  * @return ArrayListT>
  * @throws SQLException 
  */
 public T> ArrayListT> select(String sql,ClassT> t,Object...params) throws SQLException
 {//獲取T類所有public方法
  Method[] declaredMethods = t.getDeclaredMethods();
  //創建一個盛放該類型對象集合
  ArrayListT> arrayList=new ArrayList>();
  try (PreparedStatement pStatement=conn.prepareStatement(sql);)
  {   
   for(int i=0;iparams.length;i++)
   {
    pStatement.setObject(i+1, params[i]);
   }   
   try(ResultSet rSet=pStatement.executeQuery();) 
   {
    ResultSetMetaData rData=rSet.getMetaData();
    //獲取查詢到結果表的列數
    int columnCount = rData.getColumnCount();    
    while (rSet.next()) {
     T a=t.newInstance();//創建泛型類實例
     for(int i=0;icolumnCount;i++)
     {//獲得方數組里的set方法,這里造成了局限性,只能數據庫表列名與對象名一致,且只能是set方法
      String aString="set"+rData.getColumnName(i+1);
      for (Method method : declaredMethods) {
       if(method.getParameterCount()==1method.getReturnType().toString().equals("void")method.getName().equalsIgnoreCase(aString))
       {//這里存在問題,前兩個判斷條件基本沒用,主要是最初不想用上面拼串的方式來判斷是不是調用該參數的方法
        method.setAccessible(true);
        //利用反射調用該方法
        method.invoke(a, rSet.getObject(i+1));
        break;
       }
      }
     }
     arrayList.add(a);
    }
   } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } 
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
  return arrayList;  
 }
 /**
  * 數據插入
  * @param sql 帶占位符?的sql語句
  * @param params 替換占位符的數據,動態數組
  * @throws SQLException
  */
 public void insert(String sql,Object...params) throws SQLException
 {
  try(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   for(int i=0;iparams.length;i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   pStatement.executeUpdate();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
 }
 /**
  * 數據更新
  * @param sql 帶占位符?的sql語句
  * @param params 替換占位符的數據,動態數組
  * @throws SQLException
  */
 public void update(String sql,Object...params) throws SQLException
 {
  try(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   for(int i=0;iparams.length;i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   pStatement.executeUpdate();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
 }
 /**
  * 帶限制條件刪除
  * @param sql 帶占位符?的sql語句
  * @param params 替換占位符的數據,動態數組
  * @throws SQLException
  */
 public void delete(String sql,Object...params) throws SQLException
 {
  try(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   for(int i=0;iparams.length;i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   pStatement.executeUpdate();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
 }
 /**
  * 刪除全部,不帶有限制
  * @param sql
  * @throws SQLException
  */
 public void deleteall(String sql) throws SQLException
 {
  try(PreparedStatement pStatement=conn.prepareStatement(sql);) {      
   pStatement.executeUpdate();
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
 }
 /**
  * 無限制條件查找
  * @param sql 
  * @param t 泛型類T.class
  * @return ArrayListT>
  * @throws SQLException 
  */
 public T> ArrayListT> select(String sql,ClassT> t) throws SQLException
 {
  Method[] declaredMethods = t.getDeclaredMethods();
  ArrayListT> arrayList=new ArrayList>();
  try (PreparedStatement pStatement=conn.prepareStatement(sql);)
  {      
   try(ResultSet rSet=pStatement.executeQuery();) 
   {
    ResultSetMetaData rData=rSet.getMetaData();
    int columnCount = rData.getColumnCount();    
    while (rSet.next()) {
     T a=t.newInstance();
     for(int i=0;icolumnCount;i++)
     {
      String aString="set"+rData.getColumnName(i+1);
      for (Method method : declaredMethods) {
       if(method.getName().equalsIgnoreCase(aString))
       {
        method.setAccessible(true);
        method.invoke(a, rSet.getObject(i+1));
        break;
       }
      }
     }
     arrayList.add(a);
    }
   } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } 
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
  return arrayList; 
 }
 /**
  * 返回表中數據行數
  * @param tableName 數據庫表名
  * @return 行數
  * @throws SQLException
  */
 public int count(String tableName) throws SQLException
 {
  String sql="select count(*) from "+tableName;
  try(PreparedStatement pStatement=conn.prepareStatement(sql);
    ResultSet rsSet=pStatement.executeQuery(); )
  {  
   if(rsSet.next())
   {
    return rsSet.getInt(1);
   }   
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
  return 0;
 }
 /**
  * 判斷數據是否存在
  * @param sql 帶占位符?的sql語句
  * @param params 替換占位符的數據,動態數組
  * @return boolean
  * @throws SQLException
  */
 public boolean isExist(String sql,Object...params) throws SQLException
 {  
  try(PreparedStatement pStatement=conn.prepareStatement(sql);)
  {
   for(int i=0;iparams.length;i++)
   {
    pStatement.setObject(i+1, params[i]);
   }
   try(ResultSet rsSet=pStatement.executeQuery();) {
    if(rsSet.next())
    {
     return true;
    }
   } finally {
    
   }
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   throw e;
  }
  return false;  
 }
 /**
  * 創建實例
  * @param url 數據庫url
  * @param username 用戶名
  * @param password 密碼
  * @return consql對象
  * @throws SQLException
  */
 public static Consql getnewInstance(String url,String username,String password) throws SQLException
 {
  if(consql==null)
   consql=new Consql(url, username, password);
  return consql;  
 }
 //垃圾回收,貌似并不能達到析構函數的效果
 protected void finalize() throws Throwable
 {
  if(conn!=null)
  {
   conn.close();  
  }
  super.finalize();
 }
}

以上就是詳解JDBC數據庫鏈接及相關方法的封裝的實例詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

您可能感興趣的文章:
  • 關于JDBC的簡單封裝(實例講解)
  • 簡單通用JDBC輔助類封裝(實例)
  • 基于JDBC封裝的BaseDao(實例代碼)
  • java的jdbc簡單封裝方法

標簽:防疫工作 汕尾 廣西 溫州 撫順 固原 浙江 內江

巨人網絡通訊聲明:本文標題《詳解JDBC數據庫鏈接及相關方法的封裝》,本文關鍵詞  詳解,JDBC,數據庫,鏈接,及,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳解JDBC數據庫鏈接及相關方法的封裝》相關的同類信息!
  • 本頁收集關于詳解JDBC數據庫鏈接及相關方法的封裝的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品主播直播| 国产91露脸合集magnet| 美国欧美日韩国产在线播放| 欧美日韩国产高清一区二区| 亚洲欧美欧美一区二区三区| 成年人国产精品| 自拍偷拍国产精品| 色天使色偷偷av一区二区| 国产精品福利在线播放| av午夜一区麻豆| 亚洲精品欧美综合四区| 欧美喷潮久久久xxxxx| 免费亚洲电影在线| 久久精品视频一区二区三区| 丁香婷婷综合五月| 亚洲影视在线播放| 欧美α欧美αv大片| 国产成人免费视频精品含羞草妖精| 国产精品免费免费| 欧美人与z0zoxxxx视频| 国产最新精品免费| 中文字幕成人av| 欧美丰满少妇xxxxx高潮对白| 天天综合色天天| 精品国产91乱码一区二区三区| 成人一区在线观看| 五月天中文字幕一区二区| 久久综合久久综合久久综合| 色综合天天综合给合国产| 夜夜夜精品看看| 久久美女艺术照精彩视频福利播放 | 不卡的电视剧免费网站有什么| 国产区在线观看成人精品| a亚洲天堂av| 久久99国产精品久久99| 中文字幕一区在线观看视频| 91精品啪在线观看国产60岁| 国产成人精品免费网站| 亚洲精品国产品国语在线app| 欧美一区二区高清| 欧美视频一区二区在线观看| 国产aⅴ综合色| 青青草国产成人av片免费| 亚洲你懂的在线视频| 国产午夜精品久久久久久久| 欧美日本视频在线| 欧美日韩视频在线一区二区| 色噜噜狠狠成人中文综合| 国产成人啪免费观看软件| 韩国av一区二区| 日韩精品1区2区3区| 一区二区三区四区不卡视频 | 在线视频国产一区| 国内成人精品2018免费看| 日本色综合中文字幕| 亚洲欧美偷拍三级| 中文成人综合网| 国产视频一区二区在线| 久久男人中文字幕资源站| 91在线观看地址| 麻豆国产精品一区二区三区 | www.日本不卡| 国产在线精品一区二区三区不卡| 日韩国产欧美在线视频| 亚洲gay无套男同| 亚洲日本va午夜在线电影| 亚洲色欲色欲www在线观看| 久久这里都是精品| 久久久久久久av麻豆果冻| 国产视频一区二区在线| 日韩精品一区二区三区中文精品| 91精品国产全国免费观看| 6080日韩午夜伦伦午夜伦| 欧美精品日韩综合在线| 91精品一区二区三区久久久久久| 欧美三日本三级三级在线播放| 色诱亚洲精品久久久久久| 91久久精品一区二区| 欧美色图激情小说| 69p69国产精品| 国产亚洲精品久| 国产精品高潮呻吟| 午夜精品一区二区三区电影天堂| 午夜精品在线看| 国产一区二区三区在线观看免费| 丁香一区二区三区| 夫妻av一区二区| 成人晚上爱看视频| 99re这里只有精品首页| 欧美精三区欧美精三区| 国产亚洲女人久久久久毛片| 一区二区三区四区在线| 看电视剧不卡顿的网站| 成人av资源在线观看| 欧美一区二区三区在| 久久综合狠狠综合久久激情| 亚洲女同ⅹxx女同tv| 午夜国产精品一区| 国产综合一区二区| 国产91丝袜在线播放0| 色www精品视频在线观看| 91精品国产综合久久精品性色| 欧美高清在线视频| 五月天一区二区| 成人一级片网址| 在线欧美日韩精品| 久久精品视频免费观看| 亚洲国产成人av| 国产精品一区二区在线看| 91影视在线播放| 8v天堂国产在线一区二区| 亚洲欧洲韩国日本视频| 久久精品理论片| 99这里只有久久精品视频| 欧美一二区视频| 亚洲在线视频网站| 国产91高潮流白浆在线麻豆| 日韩午夜av电影| 亚洲精品videosex极品| 久久精品噜噜噜成人88aⅴ| 色狠狠一区二区| 亚洲人吸女人奶水| 99vv1com这只有精品| 中文字幕第一区二区| 国产激情视频一区二区在线观看| 在线综合视频播放| 亚洲五月六月丁香激情| 91看片淫黄大片一级在线观看| 久久久久久久久久久久久女国产乱 | 91国产成人在线| 国产亚洲一区二区三区四区 | 日韩欧美亚洲国产另类| 亚洲va欧美va人人爽| 欧美三级视频在线观看| 亚洲一区二区成人在线观看| 91精品91久久久中77777| 日本一区二区三区高清不卡| 国产成人在线视频播放| 国产欧美一区二区精品性色 | 久久亚洲一区二区三区明星换脸| 麻豆91免费看| 久久久青草青青国产亚洲免观| 国内精品久久久久影院色| 久久亚洲影视婷婷| 成人黄色一级视频| 亚洲人精品午夜| 欧美日韩在线精品一区二区三区激情| 一区二区三区日本| 欧美日韩二区三区| 91免费看片在线观看| 中文字幕在线观看不卡视频| 成熟亚洲日本毛茸茸凸凹| 中文字幕一区二区三区视频| 色综合久久天天| 91福利社在线观看| 偷拍一区二区三区| 2欧美一区二区三区在线观看视频| 国内一区二区视频| 亚洲欧美自拍偷拍| 9191国产精品| 顶级嫩模精品视频在线看| 一区二区不卡在线播放 | 欧美精品少妇一区二区三区| 久热成人在线视频| 中文字幕在线观看不卡视频| 欧美日韩国产天堂| 免费精品视频在线| 国产精品国产自产拍在线| 8v天堂国产在线一区二区| 国产 欧美在线| 视频一区国产视频| 国产欧美一区二区三区沐欲| 欧美在线观看禁18| 国产综合久久久久久鬼色 | 亚洲色图欧洲色图婷婷| 欧美日韩日日夜夜| 国产suv一区二区三区88区| 亚洲已满18点击进入久久| 久久综合色天天久久综合图片| 色94色欧美sute亚洲线路二| 狠狠色综合色综合网络| 一区二区欧美精品| 日本一区二区三区在线观看| 91精品综合久久久久久| 99久久精品国产麻豆演员表| 麻豆国产精品777777在线| 综合久久久久综合| 久久久久久久久久久久久女国产乱| 在线一区二区观看| 国产91丝袜在线18| 国产在线观看一区二区| 午夜精品久久久久久久久| 国产精品高潮久久久久无| 久久综合色婷婷| 欧美一区二区三区四区视频 | 久久你懂得1024| 欧美久久高跟鞋激| 欧美影院一区二区三区| 色综合久久天天| 91官网在线免费观看|