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

首頁 > 網站 > 幫助中心 > 正文

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

2024-07-09 22:47:58
字體:
來源:轉載
供稿:網友

詳解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(); }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美成人精品| 欧美老肥婆性猛交视频| 日韩电视剧免费观看网站| 国产一区视频在线| 欧美一级大片在线观看| 午夜精品蜜臀一区二区三区免费| 国产精品18久久久久久首页狼| 亚洲性猛交xxxxwww| 91精品美女在线| 中文字幕久久久| 国产三级精品网站| 北条麻妃一区二区三区中文字幕| 日韩电影免费观看中文字幕| 亚洲精品自在久久| 亚洲性生活视频| 久久久久久久97| 亚洲三级 欧美三级| 久久亚洲精品小早川怜子66| 91免费版网站入口| 久久久久久久久久婷婷| 精品久久久香蕉免费精品视频| 欧美精品在线观看| 国产成人在线一区| 国产精品亚洲精品| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲一区二区中文字幕| 97视频网站入口| 在线观看精品国产视频| 色噜噜久久综合伊人一本| 久久综合免费视频| 136fldh精品导航福利| 国产精品美女久久久免费| 日韩精品免费在线视频观看| 国产福利精品在线| 亚洲免费视频一区二区| 久热精品在线视频| 欧美激情按摩在线| 国产成人激情小视频| 中文字幕在线亚洲| 色婷婷综合久久久久中文字幕1| www.日韩视频| 亚洲va国产va天堂va久久| 亚洲精品视频在线观看视频| 精品福利免费观看| 日韩美女视频免费看| 欧美美女操人视频| 日韩欧美在线观看视频| 午夜精品久久久久久久久久久久| 国产精品久久久精品| 国产精品久久久久久久久久尿| 日韩中文字在线| 国产日韩在线看片| 全亚洲最色的网站在线观看| 国产免费一区二区三区在线观看| 国产精品va在线播放我和闺蜜| 欧美成人sm免费视频| 国产91色在线免费| 国产欧美一区二区白浆黑人| 国产精品91久久久久久| 亚洲精品视频免费在线观看| 国产精品极品美女粉嫩高清在线| 久久精品国产综合| 超在线视频97| 日韩电影视频免费| 国产日韩在线看片| 国产午夜精品一区二区三区| 91在线精品播放| 中文字幕亚洲一区二区三区五十路| 亚洲第一视频网站| 91亚洲精华国产精华| 欧美日产国产成人免费图片| 欧美高跟鞋交xxxxhd| 欧美一级大片在线观看| 亚洲一级黄色片| 亚洲日本中文字幕免费在线不卡| 亚洲肉体裸体xxxx137| 国产精品大陆在线观看| 欧美大人香蕉在线| 亚洲精品欧美日韩专区| 国产精品久久久久av免费| 欧美裸体xxxx| 久久99精品久久久久久琪琪| 国产亚洲精品久久久优势| 免费av在线一区| 久久精品国产免费观看| 2019亚洲男人天堂| 日韩av最新在线观看| 国产精品91视频| 久久av资源网站| 中文字幕日韩视频| 日韩一二三在线视频播| 国产丝袜一区二区三区| 日韩高清av在线| 欧美大全免费观看电视剧大泉洋| 91在线视频一区| 奇米影视亚洲狠狠色| 中文字幕亚洲国产| 亚洲天堂日韩电影| 精品国产一区二区三区久久久| 国产欧美日韩中文字幕| 国产99视频在线观看| 欧美大码xxxx| 久久欧美在线电影| 久久久国产影院| 欧美精品videosex极品1| 丁香五六月婷婷久久激情| 国产精品一区二区三区久久久| 久久久91精品国产| 岛国视频午夜一区免费在线观看| 欧美激情视频一区二区三区不卡| 青青草原成人在线视频| 最近2019中文免费高清视频观看www99| 欧美性xxxxx| 国产精品永久免费观看| 亚洲欧美成人精品| 欧美日本国产在线| 国产精品偷伦视频免费观看国产| 欧美成人合集magnet| 国产成人精品电影| 欧美成人黑人xx视频免费观看| 社区色欧美激情 | 国产精品高清免费在线观看| 亚洲欧美日韩国产中文专区| 欧美整片在线观看| 欧美精品日韩三级| 亚洲男人天堂网站| 欧美久久精品一级黑人c片| 国内精品久久久久伊人av| 国内精品美女av在线播放| 亚洲成人a**站| 日韩精品中文字幕在线观看| 午夜精品一区二区三区视频免费看| 尤物九九久久国产精品的分类| 一本色道久久综合狠狠躁篇的优点| 91亚洲精品一区| 成人免费午夜电影| 91国自产精品中文字幕亚洲| 美女视频久久黄| 欧美激情一区二区三区高清视频| xxx成人少妇69| 日韩美女视频免费看| 成人xvideos免费视频| 日本亚洲精品在线观看| 奇米四色中文综合久久| 国产色婷婷国产综合在线理论片a| 亚洲va久久久噜噜噜| 久久人人爽人人爽人人片av高清| 欧美裸体视频网站| 国产在线98福利播放视频| 成人精品视频99在线观看免费| 亚洲精品福利免费在线观看| 久久成人免费视频| 国产日韩欧美综合| 欧美理论电影在线观看| 精品久久久香蕉免费精品视频| 亚洲综合视频1区| 日本久久久a级免费| 亚洲欧美日韩第一区| 欧美日韩亚洲天堂| 九九热r在线视频精品| 国产日韩欧美在线播放| 久色乳综合思思在线视频| 亚洲美腿欧美激情另类| 欧美性色视频在线|