上回我們知道了,通過工廠模式+配置檔案動態連線資料庫;
這次的主要目的呢,則是將增刪改查想辦法重構掉;比如查詢,到**的操作不都是一樣的嘛;所以我們自然就想到了將查詢操作重構掉;
然後我們思考一下類的組織,有這麼乙個介面,其中宣告了增刪改查,我們的類實現這個介面== 我們的類必須實現增刪改查,不實現這些,你也叫資料庫操作嗎?然後我們要將這個類的增刪改查的實際操作重構掉;這個類只需要知道該幹什麼,需要什麼齊活;
首先是介面,實現類必須實現增刪改查;
public
inte***ce
userdao
我們的目標是這樣的,只需要引數,和做什麼;
public
class
userdaoimp1
extends
basedao
implements
userdao
@override
public
boolean
finduser(users user)
然後就是重點的重構過程了:其實就是增加了乙個父類;
public
class
basedao
jdbcutils.free(rs, ps, connection);
} catch (sqlexception e) catch (illegalargumentexception e) catch (instantiationexception e) catch (illegalacces***ception e) catch (invocationtargetexception e)
return objs;
}//例項化對映物件
object obj = clazz.newinstance();
//獲取對映物件的方法
method methods = clazz.getmethods();
//獲取結果集中元資料資訊
resultsetmetadata meta = rs.getmetadata();
// 按欄位數目迴圈結果集中記錄,進行物件對映
system.out.println(meta.getcolumncount());
for(int i=1;i<=4;i++)}}
return obj;}}
上面就是最重要的部分,反射+元資料;我們為什麼重構,因為對任意乙個表,查詢操作是不是都只是將全部資料拿出來。然後放到結果集裡;那我們將結果集抽象成物件,必然得set很多啊;比如這樣:
users users = new users();
users.setuserid(resultset.getint(1));
users.setusername(resultset.getstring(2));
users.setuserage(resultset.getint(3));
users.setgender(resultset.getint(4));
users.setbirthday(resultset.getdate(5));
users.setaddress(resultset.getstring(6));
arraylist.add(users);
現在的情況是什麼呢?
你給我你要將結果集放在什麼物件裡;我從結果集裡看看元資料(我的資料長什麼樣,是不是符合要求);如果符合,如果搭配就初始化到物件中的屬性去;而結果集是怎麼來的,通過sql語句,sql語句怎麼來的?你自己傳進去的;
你可以怎麼想呢?,你找了乙個函式,然後告訴他:去那邊找找有沒有足球,然後放到這個足球框裡;要求和物件都是你給的;這個函式當然也就可以做找籃球,放籃球框裡;如果是更改的話,就是:「你找找有沒有沒氣的皮球」,用這個皮球代替一下;
其實這個也很好理解,就是連線是一種資源;在瀏覽網頁的時候,和資料庫建立的連線,要可以控制啊;就像a,b之間有5條路,每次一條路只能通過乙個人;一旦有人走,就等於可用路線少了;反過來,如果這個人走完了,那麼必然總路線有多了乙個;
資料來源要做什麼呢? 首先來乙個使用者,是不是得申請乙個連線,所以會有getconnection()方法;資料來源有一大堆的連線,那麼他們從**來的,一定得有建立的啊;還有就是資料來源的資料結構,一大堆的資料結構,用的時候,就給乙個,結束,就返回乙個;所以建造了乙個鍊錶;
public
class
mydatasource
implements
datasource catch (ioexception e)
url = prop.getproperty("url");
username = prop.getproperty("username");
password = prop.getproperty("password");
try catch (classnotfoundexception e)
connection realconn = null;
try catch (sqlexception e)
connection myconn = new myconnection(realconn, this.connpool);
return myconn;}/*
獲取乙個connection,得到乙個連線,
*/@override
public connection getconnection()else}/*
還有好多需要重寫的方法;*/}
這裡使用到了**,乙個連線,怎麼也不應該結束連線的時候,還能放到連線池中吧;而很顯然,這件事也不適合資料來源去做;因為你可以建立連線,但是不能關閉連線,關閉連線是連線自己的行為;所以為了讓連線和連線池發生關係,我們使用了**;(不恰當的比喻)就像中介,既有我們的需求,又有市場的情況,所以就能調和兩者;
public
class
myconnection
implements
connection
@override
public
void
clearwarnings() throws sqlexception
@override
public
void
close() throws sqlexception
@override
public
void
commit() throws sqlexception
/*還有好多需要重寫的方法;*/}
Springboot配置jdbc資料來源
通過 properitessource註解讀取配置資訊 1,加入依賴 2,通過自定義配置檔案配置資料來源資訊 3,建立配置類 package com.bdqn.springbootjdbc.config import com.alibaba.druid.pool.druiddatasource im...
常用JDBC資料來源連線方法
oracle driver oracle.jdbc.driver.oracledriver url jdbc oracle thin hostname 1521 dbname n jdbc odbc n driver sun.jdbc.odbc.jdbcodbcdriver nurl jdbc od...
動態修改JDBC資料來源配置
因專案需要能動態修改資料來源的配置,及修改後不用重啟整個應用。使用的資料來源是apache的basicdatasource,網上千篇一律的是如下實現 basicdatasource bds getdatasource trycatch exception e bds.setusername sa b...