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