国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 13:14:18
字體:
來源:轉載
供稿:網友

詳解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 ArrayList<T>  * @throws SQLException   */ public <T> ArrayList<T> select(String sql,Class<T> t,Object...params) throws SQLException {//獲取T類所有public方法  Method[] declaredMethods = t.getDeclaredMethods();  //創建一個盛放該類型對象集合  ArrayList<T> arrayList=new ArrayList<>();  try (PreparedStatement pStatement=conn.prepareStatement(sql);)  {      for(int i=0;i<params.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;i<columnCount;i++)     {//獲得方數組里的set方法,這里造成了局限性,只能數據庫表列名與對象名一致,且只能是set方法      String aString="set"+rData.getColumnName(i+1);      for (Method method : declaredMethods) {       if(method.getParameterCount()==1&&method.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;i<params.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;i<params.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;i<params.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 ArrayList<T>  * @throws SQLException   */ public <T> ArrayList<T> select(String sql,Class<T> t) throws SQLException {  Method[] declaredMethods = t.getDeclaredMethods();  ArrayList<T> 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;i<columnCount;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;i<params.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數據庫鏈接及相關方法的封裝的實例詳解,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
在线一二三区| 国产精品一卡二卡三卡| 国产高清一级片| 色吊丝av中文字幕| 福利视频网址导航| 亚洲精品影院在线| 中文字幕亚洲精品视频| 日本成人免费网站| 在线观看午夜av| 在线黄色av| 欧美人成在线观看网站高清| 欧美日韩视频精品一区二区| 天天av综合网| 精品麻豆一区二区三区| 秋霞av在线| 中文字幕在线观看av| 国产91在线视频蝌蚪| 麻豆视频在线观看免费网站| 亚洲精品白浆| 国产免费视频在线| 99福利在线| 最新亚洲精品国自产在线观看| 国产网友自拍视频导航网站在线观看| 国产精选在线观看| 国产网红在线| 黄网在线免费| 精品成人免费自拍视频| 尤物在线视频| 蜜桃av在线免费观看| 国产成人亚洲精品播放器下载| 天堂中文在线观看| 国产福利电影在线| 黄色av网站在线| 四虎成人精品在永久在线观看| 天天爱天天做色综合| 天天艹天天操| 亚洲精品天堂在线| 精品av中文字幕在线毛片| 99视频在线观看地址| 久久香蕉一区| 高潮白浆视频| 国产在线www| 麻豆电影传媒二区| 日本亚洲欧美| 在线播放一区二区精品产| 国产精品777一区二区| 国产三级在线免费观看| 国产精选在线观看| 国产中文字幕网| 国产在线高潮| 天堂在线一二区| 天堂在线视频| 国产成人亚洲欧美电影| 国产成人午夜精品| 在线视频婷婷| 本道综合精品| 国产鲁鲁视频在线观看免费| 99视频资源网| 国产高清免费视频| 中文资源在线官网| 免费在线看v| 黄色片av在线| 日本中文字幕视频| 在线中文字幕第一页| 欧美性猛交xxxx免费看蜜桃| 成年网站免费入口在线观看| 国产色视频网站| av网址在线播放| 国产理论在线观看| 中文资源在线网| 超碰免费在线播放| 精品一二三四| 91sp网站在线观看入口| 91麻豆免费在线视频| 久草视频国产| 亚洲sss视频| 国产精品xxx电影| 亚洲一区二区三区在线观看网站| 欧美日韩一区二区三区在线播放| 国产日本视频| 青青草在线视频免费观看| 国产精品天堂| 四虎成人欧美精品在永久在线| 国产免费高清| 性网站在线观看| 国产不卡在线| 最新超碰在线| 青草青在线视频| av一级在线| 伊人永久在线| 中文字幕av免费| 国产精彩视频在线观看免费蜜芽| www555久久| 亚洲成人电视网| 在线中文字幕资源| 国产黄色一级片| 国产一卡2卡3卡四卡网站| 高潮白浆视频| 国产精品自产拍在线观看2019| gogo在线观看| 亚洲欧美精品日韩欧美| 精品视频二区三区| 国产不卡视频| 999精品网| 国产二区三区四区| 91精品国产91久久久久久青草| 午夜免费福利在线观看| 超碰在线观看免费| 热99re久久精品这里都是免费| 亚洲激情丁香| 快射av在线播放一区| 九色福利视频| 国产一卡2卡3卡免费网站| 国产69久久| 国产一区电影| 国产黄色一级片| 伊人网在线免费观看| 中文在线视频| www.99av| 午夜视频在线观看网站午夜视频在线| 丁香在线视频| 69久久久久| 四虎成人精品在永久免费| 老师我好爽再深一点的视频| 国产亚洲精品拍拍拍拍拍| 国产黄色一级电影| 在线视频1区2区| 国产免费黄网站| 国产国产国产国产国产国产 | 欧美日韩亚洲国内综合网| 日本亚洲欧美| 国产区av在线| 麻豆国产视频| 精精国产xxxx视频在线中文版 | 亚洲网站一区| 超碰免费在线观看| 国产精品白浆流出视频| 白浆爆出在线观看| 国产黄色在线观看| 99视频免费| 久色视频在线观看| 在线免费国产视频| 国产污视频在线| 狠狠操五月天| h网站久久久| 亚洲激情丁香| 18成年在线观看| 国产精品剧情一区二区在线观看| 嫩草在线播放| 国产三区视频在线观看| 黄网在线免费| 免费的黄网站在线观看| 天天插天天狠天天透| 国产精品99爱免费视频| 国产九九在线| 欧美大交乱xxxx| www.毛片| 蜜桃av在线免费观看| www.eeuss影院| sm国产在线调教视频| eeuss影院在线观看| eeuss影院在线播放| 亚洲视频在线网| 在线观看av网站永久| 国产乱在线观看视频| 久草.com| 激情丁香在线| 丁香婷婷在线观看| 中文字幕一区免费| 国产精品自拍在线观看| 免费在线高清av| 2019中文字幕在线电影免费| 国产精品天堂| 成人超碰在线| 国产福利三区| 一级二级三级在线观看| 日本电影在线观看| 超碰在线中文| 1区2区视频| 国产高清免费在线播放| 精品51国产黑色丝袜高跟鞋| 亚洲男人的天堂成人| 免费高清视频日韩| 尤物视频在线免费观看| 2019中文字幕视频| 亚洲www色| 中文字幕日本在线| 2020亚洲男人天堂| 男人天堂99| 国产日韩欧美一区二区三区视频| 91欧洲在线视精品在亚洲| 日本国产在线| 国产一区二区影视| 日本国产在线| 天堂资源在线中文| 在线看黄网址| 国产探花视频在线观看| wwww在线观看| 精品一二三区视频| 天天操人人爽|