java中级_写自己的JDBC框架

来源:互联网 发布:阿里云域名备案流程 编辑:程序博客网 时间:2024/06/06 08:54

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

1 0
原创粉丝点击