亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产成人av在线| 九九热这里只有精品免费看| 国产在线播放不卡| 亚洲人精选亚洲人成在线| 精品久久久久久久久国产字幕| 中文字幕亚洲精品| 精品国产精品三级精品av网址| 亚洲免费一在线| 亚洲精品av在线| 久久久久成人精品| 97超级碰碰人国产在线观看| 亚洲国产成人91精品| 亚洲在线视频福利| 久久久视频免费观看| 国产综合在线看| 91久久久久久久一区二区| 色噜噜狠狠色综合网图区| 欧美大胆在线视频| 国产精品99蜜臀久久不卡二区| 国内精品视频在线| 欧美激情欧美激情在线五月| 91国偷自产一区二区三区的观看方式| 久久久精品久久| 激情久久av一区av二区av三区| 久久手机精品视频| 两个人的视频www国产精品| 色噜噜狠狠狠综合曰曰曰88av| 成人xxxx视频| 久久99精品久久久久久琪琪| 欧美激情综合色| 国产日韩欧美在线看| 成人在线国产精品| 久久久国产一区二区三区| 欧美精品第一页在线播放| 欧美成人免费在线视频| 亚洲人a成www在线影院| 日韩欧美国产黄色| 2018日韩中文字幕| 中文字幕日韩欧美在线| 国产一区二区三区在线播放免费观看| 午夜精品美女自拍福到在线| 九九九久久久久久| 欧美亚洲国产视频| 国产精品最新在线观看| 55夜色66夜色国产精品视频| 中文字幕免费精品一区| 亚洲国产小视频| 欧美成人亚洲成人日韩成人| 91av成人在线| 91精品久久久久久久久久入口| 日韩视频中文字幕| 欧美激情aaaa| 欧美激情亚洲综合一区| 青青草99啪国产免费| 日韩大陆毛片av| 成人免费看黄网站| 亚洲第一福利在线观看| 午夜精品久久久久久久99热浪潮| 亚洲国产免费av| 亚洲国产成人在线播放| 最近免费中文字幕视频2019| 97人人爽人人喊人人模波多| 亚洲国产精品嫩草影院久久| 中文字幕一区二区三区电影| 精品视频在线播放免| 俺去亚洲欧洲欧美日韩| 日韩中文字幕av| 日韩在线观看免费全| 国产男女猛烈无遮挡91| 中文字幕精品视频| 日本高清久久天堂| 亚洲一区二区久久久| 欧美亚洲第一区| 91在线免费观看网站| 欧美特黄级在线| 亚洲精品一区二区网址| 国产视频精品一区二区三区| 最新日韩中文字幕| 日韩亚洲第一页| 国产suv精品一区二区| 中文字幕av一区中文字幕天堂| 久久久久久久久国产| 国产成人精品国内自产拍免费看| 欧美国产乱视频| 日韩风俗一区 二区| 亚洲天堂一区二区三区| 亚洲加勒比久久88色综合| 国内精品模特av私拍在线观看| 国产精品露脸自拍| 日韩高清免费观看| 久久精品视频在线观看| 精品久久中文字幕| 国产精彩精品视频| 亚洲午夜未满十八勿入免费观看全集| 国产中文字幕91| 亚洲风情亚aⅴ在线发布| 国产不卡精品视男人的天堂| 精品国产一区二区三区久久狼黑人| 欧美激情精品久久久久久变态| 国产欧美最新羞羞视频在线观看| 日韩精品在线影院| 色偷偷综合社区| 成人黄色av免费在线观看| 欧美日韩一区二区在线| 久久久久久久久爱| 91日韩在线播放| 欧美多人爱爱视频网站| 北条麻妃一区二区三区中文字幕| 亚洲视频在线视频| 成人免费午夜电影| 成人免费淫片aa视频免费| 91久久精品日日躁夜夜躁国产| 日本精品性网站在线观看| 亚洲在线一区二区| 欧美国产日韩中文字幕在线| 欧美精品videossex88| 亚洲欧美中文日韩在线| 久久久精品视频在线观看| 国产午夜精品视频| 亚洲福利影片在线| 日韩精品www| 欧美日韩一区二区免费视频| 国产精品自产拍在线观| 欧美有码在线视频| 亚洲欧美日韩在线高清直播| 亚洲一区二区三区四区视频| 97在线看免费观看视频在线观看| 欧美—级高清免费播放| 日本免费久久高清视频| 美女久久久久久久久久久| 国产精品一区二区电影| 国产精品免费视频xxxx| 欧洲成人在线视频| 欧美激情videos| 国外日韩电影在线观看| 国产日韩欧美影视| 国产精品自在线| 91精品美女在线| 国内成人精品一区| 久久久久久久国产| 欧美做爰性生交视频| 久久久国产一区| 亚洲国产精品成人va在线观看| 亚洲字幕一区二区| 亚洲区在线播放| 最近免费中文字幕视频2019| 亚洲精品网站在线播放gif| 尤物yw午夜国产精品视频明星| 在线观看国产精品淫| 亚洲国产精品va在线看黑人| 日韩欧美精品在线观看| 国产精品爽爽爽爽爽爽在线观看| 国产精品久久综合av爱欲tv| 亚洲电影成人av99爱色| 欧美成人性生活| 国产欧美日韩高清| 国产69久久精品成人| 九九九热精品免费视频观看网站| 欧美激情精品久久久久久| 91影视免费在线观看| 国产精品自在线| 日韩中文字幕视频在线观看| 亚洲欧美日韩在线高清直播| 久久精品视频中文字幕|