国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 彰武县| 高清| 潼关县| 井研县| 揭西县| 天津市| 汝阳县| 通榆县| 喀喇| 红安县| 房山区| 广宁县| 彰武县| 平潭县| 揭阳市| 资中县| 施秉县| 桃园县| 灵台县| 屯留县| 文水县| 沙雅县| 东阿县| 清新县| 双江| 丰都县| 武陟县| 孟连| 茶陵县| 民乐县| 南投市| 鄂尔多斯市| 五寨县| 鄂伦春自治旗| 芦溪县| 淄博市| 定安县| 秭归县| 盖州市| 神池县| 南涧|