目录


元数据概念

元数据 : 数据库、表、列的定义信息;( 就是一个信息的定义信息 ;)


DataBaseMetaData

DataBaseMetaData 数据库元数据对象 (- Connection.getDatabaseMetaData();)

    ·getURL(): 返回一个String类对象,代表数据的URL 。

    ·getUserName():返回连接当前数据库管理系统的用户名

    ·getDatabaseProductName(): 返回数据库的产品名称

    ·getDatabaseProduceVersion(): 返回数据库的版本号

    ·getDriverName(): 返回驱动程序的名称

    ·getDriverVersion(): 返回驱动程序的版本号

    ·isReadOnly() : 返回 boolean 值,指示数据库是否允许读操作 ;

ParameterMetaData

ParameterMetaData 参数的元数据

     ·PreparedStatement.getParameterMetaData():获得代表 sql参数的元数据的 ParamenterMetaData 对象

     ·getParameterCount() :获得指定sql语句的参数的个数

     ·getParameterType(int param) : 获得指定参数的sql类型 ;(mysql的驱动不支持)

ResultSetMetaData

ResultSetMetaData (从reasultSet上获取;代表ResultSet对象元数据)

    ·getColumnCount() :返回resultset对象的列数。

    ·getColumuName(int column) : 获得指定列的名称 ;

    ·getColumnTypeName(int column) : 获得指定列的类型 ;

编写简化版的JDBC

其实老方讲的就是明天要讲的dbutils的设计思路

在简化 查询 操作的时候,有一种思想在里面(策略模式,treeSet 也是这种模式)!

由于我们是框架设计者,在设计的时候,也不知道查询出来的是什么;

也不知道使用者,准备怎么处理结果集;

对于这种情况,我们就对外暴露一个接口,让使用者自己来写,他自己最清楚怎么操作结果集;

但是,我们也不能任何操作都让使用者自己写;

用你个查询,还要自己写个处理器;还不如使用原始的呢

因此,我们默认实现一些处理器接口的实现类,提供日常操作的实现类 ;

·BeanHandler 实现类 :

        构造器接受一个要返回对象的类型,方法内部使用反射进行赋值 ;

·BeanListHandler 实现类 :

        一样的思路;注意下结果集的游标,之前判断非空被移动到第一行了,再次查询之前需要将它移到表头,否则就从第二行开始查找了

O-R Mapping 概念

O-R Mapping简介

    ·什么是O-R Mapping 映射工具

        O: Object  对象 ;

        R:关系

        就是将对象关系映射到数据库里面 ;

    ·常用的O-R Mapping 映射工具

        ·Hibernate

        ·Ibatis

        ·Commons Dbutils(只是对JDBC 进行简单的封装)

自定义简化版JDBC


--------------------- 处理器接口 ------------------------- // 对外暴露的 处理器 接口
interface ResultSetHandler {
// 对 结果集 进行的操作
Object handler(ResultSet resultSet);
} ----------------------- 已实现类 -------------------------------- // 已实现类 将结果集数据封装到 bean 中
class BeanHandler implements ResultSetHandler { private Class clazz; public BeanHandler(Class clazz) {
this.clazz = clazz;
} @Override
public Object handler(ResultSet resultSet) {
try {
Object object = clazz.newInstance();
// 查询结果集中有多少行数据
ResultSetMetaData meta = resultSet.getMetaData();
int count = meta.getColumnCount(); for (int i = 0; i < count; i++) {
// 获取每列的字段的名字
String name = meta.getColumnName(i + 1);
System.out.println(name);
// 获取字段列的值
Object value = resultSet.getObject(name);
// 用反射技术,根据名字反射出字段
Field field = clazz.getDeclaredField(name);
// 破除掉 private 限制
field.setAccessible(true);
// 字段赋值
field.set(object, value);
} return object; } catch (Exception e) {
throw new RuntimeException(e);
}
}
} -------------------------- 已实现类 ----------------------------- // 已实现类 将结果集内容封装进 list 里面
class BeanListHandler implements ResultSetHandler {
private Class clazz; public BeanListHandler(Class clazz) {
this.clazz = clazz;
} @Override
public Object handler(ResultSet resultSet) {
try {
List list = new ArrayList();
// 需要将结果集游标往前移动一位,因为之前判断是否为空 往后移了一位
// 移到表头
resultSet.beforeFirst();
ResultSetMetaData meta = resultSet.getMetaData();
int count = meta.getColumnCount();
while (resultSet.next()) {
Object bean = clazz.newInstance();
for (int i = 0; i < count; i++) {
// 获得字段名字
String name = meta.getColumnName(i + 1);
// 反射出字段对象
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
// 通过resultSET查出结果
Object value = resultSet.getObject(name);
field.set(bean, value);
}
list.add(bean);
} return list;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
} --------------------------简化版JDBC框架类---------------------------- // 简化版JDBC框架类
public class SimpleJdbcUtils { /**
* 先简化 增删改
*/
public static int update(String sql, Object[] objects) {
// 获取连接
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null; try {
connection = JdbcC3P0Utils.getConnection();
statement = connection.prepareStatement(sql); // 循环赋值
for (int i = 0; i < objects.length; i++) {
statement.setObject(i + 1, objects[i]);
} return statement.executeUpdate(); } catch (Exception e) {
throw new ExceptionInInitializerError(e);
} finally {
JdbcC3P0Utils.closedConnection(resultSet, statement, connection);
} } /**
* 简化 查询 操作
*/
public static Object query(String sql, Object[] objects, ResultSetHandler handler) { Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
connection = JdbcC3P0Utils.getConnection();
statement = connection.prepareStatement(sql); for (int i = 0; i < objects.length; i++) {
statement.setObject(i + 1, objects[i]);
} resultSet = statement.executeQuery(); if (!resultSet.next()) {
return null;
} return handler.handler(resultSet); } catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
JdbcC3P0Utils.closedConnection(resultSet, statement, connection);
}
}
} ---------------------- 测试简化版JDBC ---------------------- // 增删改查 只需要3行代码。。
@Test
public void test1() {
String sql = "insert into employee(name,money) values(?,?)";
Object[] objects = {"qqqq", 12000};
SimpleJdbcUtils.update(sql, objects);
} @Test
public void test2() {
String sql = "update employee set money = ? where id = ?";
Object[] objects = {"14000", 1};
SimpleJdbcUtils.update(sql, objects);
} @Test
public void test3() {
String sql = "delete from employee where id = ?";
Object[] objects = {2};
SimpleJdbcUtils.update(sql, objects);
} @Test
public void test4() {
String sql = "select * from employee where id = ?";
Object[] objects = {4};
Employee employee = (Employee) SimpleJdbcUtils.query(sql, objects,new BeanHandler(Employee.class));
System.out.println(employee.getId());
System.out.println(employee.getMoney());
System.out.println(employee.getName());
} @Test
public void test5() {
String sql = "select * from employee ";
Object[] objects = {};
List<Employee> list = (List) SimpleJdbcUtils.query(sql, objects,new BeanListHandler(Employee.class)); for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).getName()+" ");
System.out.print(list.get(i).getId()+" ");
System.out.print(list.get(i).getMoney()+" ");
System.out.println();
}

(二十二)自定义简化版JDBC(Dbutils框架的设计思想)的更多相关文章

  1. WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]

    原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...

  2. 使用Typescript重构axios(二十八)——自定义序列化请求参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  3. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  4. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  5. VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池

    VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...

  6. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  7. 二十二. Python基础(22)--继承

    二十二. Python基础(22)--继承 ● 知识框架   ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A:     def get(s ...

  8. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  9. FreeSql (二十二)Dto 映射查询

    适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...

随机推荐

  1. 【概率论】4-2:期望的性质(Properties of Expectation)

    title: [概率论]4-2:期望的性质(Properties of Expectation) categories: - Mathematic - Probability keywords: - ...

  2. Luogu5369 [PKUSC2018]最大前缀和

    题目链接:洛谷 题目大意:给定一个长为$n$的整数序列,求全排列的最大前缀和(必须包含第一个数)之和. 数据范围:$1\leq n\leq 20,1\leq \sum_{i=1}^n|a_i|\leq ...

  3. 离线语音Snowboy热词唤醒+ 树莓派语音交互实现开关灯

    离线语音Snowboy热词唤醒 语音识别现在有非常广泛的应用场景,如手机的语音助手,智能音响(小爱,叮咚,天猫精灵...)等. 语音识别一般包含三个阶段:热词唤醒,语音录入,识别和逻辑控制阶段. 热词 ...

  4. Selenium执行cdp命令,driver.execute_cdp_cmd用法

    Chrome自带的开发者工具DevTools功能非常强大.有时候我们在使用Selenium操作浏览器时需要通过调用一下DevTools的方法来完成一些设置,如模拟移动设备,弱网模拟等等. Seleni ...

  5. mac: jenkins+ant+jmeter接口测试

    最近研究Jenkins平台上使用ant进行集成测试,在网上查阅了很多资料,将 jenkins+ant+jmeter简单使用方法记录下来,方便以后查阅.有很多不足之处,后期不断优化. 一.环境搭建 1. ...

  6. python数据分析与应用

    python数据分析与应用笔记 使用sklearn构建模型 1.使用sklearn转换器处理数据 import numpy as np from sklearn.datasets import loa ...

  7. JAVA基础知识|Socket

    一.什么是Socket? Socket本身并不是协议,是一套完成TCP.UDP协议的调用接口(API),通过socket我们才能使用TCP/IP协议(JAVA基础知识|TCP/IP协议).Socket ...

  8. 动态连通性问题——算法union-find

    问题定义:问题的输入是一列整数对,其中每个整数都表示一个某种类型的对象,一对整数p,q可以被理解为"p和q是相连的".我们假设“相连”是一种对等的关系. 这也意味着它具有: 1.自 ...

  9. php-fpm(绕过open_basedir,结合ssrf)

    环境的安装->https://www.cnblogs.com/zaqzzz/p/11870489.html 1.nginx的畸形访问 因为安装的是php7.0,所以需要手动修改一下(版本低的时候 ...

  10. 感知机算法及BP神经网络

    简介:感知机在1957年就已经提出,可以说是最为古老的分类方法之一了.是很多算法的鼻祖,比如说BP神经网络.虽然在今天看来它的分类模型在很多数时候泛化能力不强,但是它的原理却值得好好研究.先学好感知机 ...