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
- java中级_写自己的JDBC框架
- java中级_apache_提供的JDBC框架_DML语句使用
- 编写自己的JDBC框架
- 编写自己的JDBC框架
- 编写自己的JDBC框架
- 编写自己的JDBC框架
- 编写自己的JDBC框架
- 编写自己的JDBC框架
- 编辑自己的JDBC框架
- 编写自己的JDBC框架
- 11 csdn java 王少飞-编写自己的JDBC框架
- java web学习总结40:编写自己的JDBC框架
- 用java的swing框架自己写贪吃蛇游戏
- java中级_apache_提供的JDBC的DQL使用
- 自己写的struts1框架
- 如何写自己的Type3 JDBC 驱动
- 数据库连接池编写自己的jdbc框架
- 编写自己的JDBC框架2
- 2015ICPC北京区域赛K. A Math Problem(数位DP)
- HTML常用的标签
- 不知不觉已经大三了!!!!
- Ant 学习
- Linux 用pv操作和共享内存实现生产者与消费者机制
- java中级_写自己的JDBC框架
- 开源JDBC工具类之DbUtils解析
- 【前缀和】 洛谷1371 NOI元丹
- 双链表反序
- LevelDB整体介绍
- 【Adobe Air程序开发】用Adobe Flex3开发AIR应用程序–入门指南
- java集合类
- 【机器学习】周志华 第一章课后习题
- 【Adobe Air程序开发】eclipse安装flash builder 4.7插件以及java、flex整合开发