寫自己的JDBC框架
步驟:總體上分爲兩大步驟
一、封裝所有的DML操作的語句
二、封裝所有的查詢操作
-----注:將所有查詢方法的公共的部分抽離出來,不同的地方讓用戶當參數往方法裏傳,由於在查詢到的數據封裝時,不知道查到的數據的形式以及個數,所以在封裝數據模塊中,使用策略設計模式,讓用戶去實現這個封裝方式,對外提供一個一個藉口,調用其中唯一的方法,來封裝數據,最後返回
具體實現:
//主功能模塊
package com.bjsxt.lc.dbassist;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.bjsxt.lc.datasource.DataSource;
import com.bjsxt.lc.exception.ParmetersError;
import com.bjsxt.lc.resultset.ResultSetHandle;
public class MyJDBC {
private DataSource source = null;
public MyJDBC (DataSource source){
this.source = source;
}
/**
* 對DML語句的統一管理
* @return 修改的行的個數
*/
public int update(String sql,Object[] parameters){
Connection conn = null;
PreparedStatement prep = null;
int result = 0;
try {
conn = source.getConn();
prep = conn.prepareStatement(sql);
//獲得佔位符的個數
ParameterMetaData pmd = prep.getParameterMetaData();
int count = pmd.getParameterCount();
if(count>0){
if(parameters==null || parameters.length<1)
throw new IllegalAccessException();
if(parameters.length != count)
throw new IllegalAccessException();
for(int i=0;i<parameters.length;i++){
prep.setObject(i+1, parameters[i]);
}
}
result = prep.executeUpdate();
} catch (Exception e) {
throw new ParmetersError();
}finally{
source.closeAll(null, prep, conn);
}
return result;
}
public Object query(String sql,Object[] parameters,ResultSetHandle resh){
Connection conn = null;
PreparedStatement prep = null;
ResultSet res = null;
try {
conn = source.getConn();
prep = conn.prepareStatement(sql);
//獲得佔位符的個數
ParameterMetaData pmd = prep.getParameterMetaData();
int count = pmd.getParameterCount();
if(count>0){
if(parameters==null || parameters.length<1)
throw new IllegalAccessException("傳入的參數與佔位符的不一致");
if(parameters.length != count)
throw new IllegalAccessException("傳入的參數與佔位符的不一致");
for(int i=0;i<parameters.length;i++){
prep.setObject(i+1, parameters[i]);
}
}
res = prep.executeQuery();
//目標:封裝到對象總,只有結果集
return resh.handle(res);
} catch (Exception e) {
throw new ParmetersError();
}finally{
source.closeAll(null, prep, conn);
}
}
}
鏈接數據源用到的工具類package com.bjsxt.lc.datasource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/**
* 工具類
* **/
public class DataSource {
/**
* �常量的定義
* */
private static String user;
private static String password;
private static String driver;
private static String url;
/**
* 常量的初始化
* */
static{
Properties p = new Properties();
try {
p.load(DataSource.class.getClassLoader().getResourceAsStream("info.properties"));
user = p.getProperty("mysqlUser");
password = p.getProperty("mysqlPassword");
driver = p.getProperty("mysqlDriver");
url = p.getProperty("mysqlUrl");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 獲得鏈接
* */
public Connection getConn(){
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url,user,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 關閉流
* */
public void closeAll(ResultSet res,PreparedStatement prep,Connection conn){
if(res!=null){
try {
res.close();
} catch (SQLException e) {
e.printStackTrace();
}
<span style="white-space:pre"> </span>res= null;
}
if(prep!=null){
try {
prep.close();
} catch (SQLException e) {
e.printStackTrace();
}
<span style="white-space:pre"> </span>res = null; -------此處作用,置爲空,等待垃圾回收
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
<span style="white-space:pre"> </span>conn=null;
}
}
}
//對外提供的接口 。。以滿足封裝需求
package com.bjsxt.lc.resultset;
import java.sql.ResultSet;
/**
* 策略設計模式
* @author Administrator
*
*/
public interface ResultSetHandle {
/**
* 把結果集的東西封裝成對象
* @param res
* @return
*/
<span style="white-space:pre"> </span>Object handle(ResultSet res);
}
<strong><span style="font-size:24px;">//內置實現的基本操作</span></strong>
package com.bjsxt.lc.resultset;import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;
public class BeansHeadle implements ResultSetHandle {
private Class clazz ;
public BeansHeadle(Class clazz) {
this.clazz = clazz;
}
@Override
public Object handle(ResultSet res) {
List list = new ArrayList();
try {
while(res.next()){
//獲得javaBean類
Object bean = clazz.newInstance();
//獲得對應的 字段集
ResultSetMetaData metaData = res.getMetaData();
//獲得字段個數
int count = metaData.getColumnCount();
for(int i=0;i<count;i++){
//獲得字段名字
String columeName = metaData.getColumnName(i+1);
//獲得字段的值
Object columeValue = res.getObject(i+1);
//獲得javaBean裏的響應屬性
Field f = clazz.getDeclaredField(columeName);
//打開安全檢查
f.setAccessible(true);
//設置值
f.set(bean, columeValue);
}
list.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}