詳解JDBC數(shù)據(jù)庫(kù)鏈接及相關(guān)方法的封裝
使用的是MySQL數(shù)據(jù)庫(kù),首先導(dǎo)入驅(qū)動(dòng)類(lèi),然后根據(jù)數(shù)據(jù)庫(kù)URL和用戶名密碼獲得數(shù)據(jù)的鏈接。由于使用的是MySQL數(shù)據(jù)庫(kù),它的URL一般為,jdbc:mysql://主機(jī)地址:端口號(hào)/庫(kù)名。
下面是封裝的具體類(lèi),用到了泛型和反射,不過(guò)還存在些問(wèn)題,就是對(duì)使用的泛型對(duì)象有些限制,只能用于泛型類(lèi)對(duì)象屬性名與數(shù)據(jù)庫(kù)表中列名相同的對(duì)象,而且初始化對(duì)象的方法必須為set+屬性名的方法。本來(lái)想通過(guò)返回值類(lèi)型,參數(shù)列表來(lái)確定該屬性初始化方法的,然而可能是目前學(xué)到的還是太少,只學(xué)了三周,所以并沒(méi)有實(shí)現(xiàn),感覺(jué)這個(gè)方法還是很low,以后還要繼續(xù)完善。本來(lái)看到網(wǎng)上有用beanUtils包,利用map將查詢的一列存起來(lái),直接轉(zhuǎn)化成該對(duì)象的,但是就是想試試新學(xué)到的反射。而且最后的垃圾回收器并不能如同C++的析構(gòu)函數(shù)一樣,所以關(guān)閉數(shù)據(jù)庫(kù)鏈接的地方也需要改善。
實(shí)現(xiàn)代碼:
public class Consql { private static Consql consql=null;//單例設(shè)計(jì)模式 private Connection conn=null;//數(shù)據(jù)庫(kù)鏈接 private final String url;//數(shù)據(jù)庫(kù)url private final String username;//數(shù)據(jù)庫(kù)用戶名 private final String password;//數(shù)據(jù)庫(kù)密碼 //驅(qū)動(dòng)類(lèi)的加載 static{//以靜態(tài)代碼塊的形式加載驅(qū)動(dòng)類(lèi),靜態(tài)代碼塊只在類(lèi)加載的時(shí)候執(zhí)行一次 try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //構(gòu)造函數(shù) private Consql(String url,String username,String password) throws SQLException{ this.url = url; this.username = username; this.password = password; open();//創(chuàng)建連接 } private Connection open() throws SQLException { try {//驅(qū)動(dòng)器獲取數(shù)據(jù)庫(kù)鏈接 conn=DriverManager.getConnection(url, username, password); } catch (SQLException e) { // TODO Auto-generated catch block //e.printStackTrace(); throw e; } return conn; } /** * 帶限制條件查找 * @param sql 帶占位符?的sql語(yǔ)句 * @param t 返回相關(guān)類(lèi)型對(duì)象的類(lèi)(T.class) * @param params 替換占位符的數(shù)據(jù),為動(dòng)態(tài)數(shù)組 * @return ArrayListT> * @throws SQLException */ public T> ArrayListT> select(String sql,ClassT> t,Object...params) throws SQLException {//獲取T類(lèi)所有public方法 Method[] declaredMethods = t.getDeclaredMethods(); //創(chuàng)建一個(gè)盛放該類(lèi)型對(duì)象集合 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(); //獲取查詢到結(jié)果表的列數(shù) int columnCount = rData.getColumnCount(); while (rSet.next()) { T a=t.newInstance();//創(chuàng)建泛型類(lèi)實(shí)例 for(int i=0;icolumnCount;i++) {//獲得方數(shù)組里的set方法,這里造成了局限性,只能數(shù)據(jù)庫(kù)表列名與對(duì)象名一致,且只能是set方法 String aString="set"+rData.getColumnName(i+1); for (Method method : declaredMethods) { if(method.getParameterCount()==1method.getReturnType().toString().equals("void")method.getName().equalsIgnoreCase(aString)) {//這里存在問(wèn)題,前兩個(gè)判斷條件基本沒(méi)用,主要是最初不想用上面拼串的方式來(lái)判斷是不是調(diào)用該參數(shù)的方法 method.setAccessible(true); //利用反射調(diào)用該方法 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; } /** * 數(shù)據(jù)插入 * @param sql 帶占位符?的sql語(yǔ)句 * @param params 替換占位符的數(shù)據(jù),動(dòng)態(tài)數(shù)組 * @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; } } /** * 數(shù)據(jù)更新 * @param sql 帶占位符?的sql語(yǔ)句 * @param params 替換占位符的數(shù)據(jù),動(dòng)態(tài)數(shù)組 * @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語(yǔ)句 * @param params 替換占位符的數(shù)據(jù),動(dòng)態(tài)數(shù)組 * @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; } } /** * 無(wú)限制條件查找 * @param sql * @param t 泛型類(lèi)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; } /** * 返回表中數(shù)據(jù)行數(shù) * @param tableName 數(shù)據(jù)庫(kù)表名 * @return 行數(shù) * @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; } /** * 判斷數(shù)據(jù)是否存在 * @param sql 帶占位符?的sql語(yǔ)句 * @param params 替換占位符的數(shù)據(jù),動(dòng)態(tài)數(shù)組 * @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; } /** * 創(chuàng)建實(shí)例 * @param url 數(shù)據(jù)庫(kù)url * @param username 用戶名 * @param password 密碼 * @return consql對(duì)象 * @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; } //垃圾回收,貌似并不能達(dá)到析構(gòu)函數(shù)的效果 protected void finalize() throws Throwable { if(conn!=null) { conn.close(); } super.finalize(); } }
以上就是詳解JDBC數(shù)據(jù)庫(kù)鏈接及相關(guān)方法的封裝的實(shí)例詳解,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
標(biāo)簽:防疫工作 汕尾 廣西 溫州 撫順 固原 浙江 內(nèi)江
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解JDBC數(shù)據(jù)庫(kù)鏈接及相關(guān)方法的封裝》,本文關(guān)鍵詞 詳解,JDBC,數(shù)據(jù)庫(kù),鏈接,及,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。