java中級_寫自己的JDBC框架

寫自己的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;
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章