JDBC高階 資料來源

2021-07-31 04:24:01 字數 3424 閱讀 3574

上回我們知道了,通過工廠模式+配置檔案動態連線資料庫;

這次的主要目的呢,則是將增刪改查想辦法重構掉;比如查詢,到**的操作不都是一樣的嘛;所以我們自然就想到了將查詢操作重構掉;

然後我們思考一下類的組織,有這麼乙個介面,其中宣告了增刪改查,我們的類實現這個介面== 我們的類必須實現增刪改查,不實現這些,你也叫資料庫操作嗎?然後我們要將這個類的增刪改查的實際操作重構掉;這個類只需要知道該幹什麼,需要什麼齊活;

首先是介面,實現類必須實現增刪改查;

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...