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;
}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为中级Java工程师的面试题通常包括以下内容: 1. Java基础知识:包括Java的数据类型、变量、运算符、流程控制语句等基本语法知识。 2. 面向对象编程:包括封装、继承、多态等概念,以及Java中的类、对象和接口的使用。 3. 集合框架:包括ArrayList、LinkedList、HashMap等常用集合类的使用和区别,以及集合框架的特性和性能。 4. 异常处理:包括异常的分类、try-catch语句的使用等。 5. 多线程:包括线程的创建和启动、线程同步和线程间通信的方式。 6. IO操作:包括文件读、字符流和字节流的使用等。 7. JDBC数据库连接:包括数据库驱动的加载、连接的建立和关闭,以及基本的SQL查询和更新操作。 8. 设计模式:包括常见的设计模式如单例模式、工厂模式、观察者模式等的概念和实现方式。 除了以上内容,面试题还可能涉及到Java的内存管理、垃圾回收机制、网络编程、Java虚拟机等方面的知识。在面试准备中,可以结合自身的实际经验和项目经历,对这些知识点进行深入理解和准备。阅读提供的面试题手册可以更全面地了解中级Java工程师面试题的内容和答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java中级面试题及答案(120道Java中级面试题大汇总)](https://blog.csdn.net/u012889902/article/details/121208556)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值