詳解JDBC數(shù)據(jù)庫(kù)鏈接及相關(guān)方法的封裝
詳解JDBC數(shù)據(jù)庫(kù)鏈接及相關(guān)方法的封裝
使用的是MySQL數(shù)據(jù)庫(kù),首先導(dǎo)入驅(qū)動(dòng)類,然后根據(jù)數(shù)據(jù)庫(kù)URL和用戶名密碼獲得數(shù)據(jù)的鏈接。由于使用的是MySQL數(shù)據(jù)庫(kù),它的URL一般為,jdbc:mysql://主機(jī)地址:端口號(hào)/庫(kù)名。
下面是封裝的具體類,用到了泛型和反射,不過(guò)還存在些問(wèn)題,就是對(duì)使用的泛型對(duì)象有些限制,只能用于泛型類對(duì)象屬性名與數(shù)據(jù)庫(kù)表中列名相同的對(duì)象,而且初始化對(duì)象的方法必須為set+屬性名的方法。本來(lái)想通過(guò)返回值類型,參數(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)類的加載
static{//以靜態(tài)代碼塊的形式加載驅(qū)動(dòng)類,靜態(tà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)類型對(duì)象的類(T.class)
* @param params 替換占位符的數(shù)據(jù),為動(dòng)態(tài)數(shù)組
* @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();
//創(chuàng)建一個(gè)盛放該類型對(duì)象集合
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();
//獲取查詢到結(jié)果表的列數(shù)
int columnCount = rData.getColumnCount();
while (rSet.next()) {
T a=t.newInstance();//創(chuàng)建泛型類實(shí)例
for(int i=0;i<columnCount;i++)
{//獲得方數(shù)組里的set方法,這里造成了局限性,只能數(shù)據(jù)庫(kù)表列名與對(duì)象名一致,且只能是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))
{//這里存在問(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;i<params.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;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語(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;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;
}
}
/**
* 無(wú)限制條件查找
* @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;
}
/**
* 返回表中數(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;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;
}
/**
* 創(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ì)本站的支持!
相關(guān)文章
MySQL中的數(shù)據(jù)備份與SQL語(yǔ)句
這篇文章主要介紹了MySQL中的數(shù)據(jù)備份與SQL語(yǔ)句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
MySQL主從復(fù)制搭建流程分步實(shí)現(xiàn)
這篇文章主要介紹了MySQL的主從復(fù)制原理詳細(xì)分析,讀寫(xiě)分離是基于主從復(fù)制來(lái)實(shí)現(xiàn)的。文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-11-11
親手教你怎樣創(chuàng)建一個(gè)簡(jiǎn)單的mysql數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)是存放數(shù)據(jù)的“倉(cāng)庫(kù)”,維基百科對(duì)此形象地描述為“電子化文件柜”,這篇文章主要介紹了親手教你怎樣創(chuàng)建一個(gè)簡(jiǎn)單的mysql數(shù)據(jù)庫(kù),需要的朋友可以參考下2022-11-11
最全的mysql 5.7.13 安裝配置方法圖文教程(linux) 強(qiáng)烈推薦!
這篇文章主要為大家詳細(xì)介紹了linux下mysql 5.7.13 安裝配置方法圖文教程,感興趣的小伙伴們可以參考一下2016-08-08
關(guān)于MySQL數(shù)據(jù)遷移--data目錄直接替換注意事項(xiàng)的詳解
本篇文章是對(duì)關(guān)于MySQL數(shù)據(jù)遷移--data目錄直接替換的注意事項(xiàng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
MySQL使用show status查看MySQL服務(wù)器狀態(tài)信息
這篇文章主要介紹了MySQL使用show status查看MySQL服務(wù)器狀態(tài)信息,需要的朋友可以參考下2017-01-01

