作者:java1to3
链接:http://www.cnblogs.com/java1to3/
著作权归作者所有。未经作者本人同意,禁止一切转载。
商业或非商业转载请联系作者获得授权并请注明出处。

・JDBC简介

Java为访问不同的数据库产品提供了统一的接口规范JDBC(Java Data Base Connectivity)。
也就是说如果我开发了一种新的数据库产品,并且希望能用Java语言进行查询等操作,
那么我需要针对我开发的数据库产品提供一种驱动程序,将数据操作按照JDBC的接口规范展示给Java调用者。

下图简单的描述了JDBC与数据库驱动的关系(其中MyDB是我的模拟数据库):

・我的模拟数据库产品概要

OK,下面介绍我开发的数据库产品:
它提供了一个简单的功能:输入"Hello",返回"JDBC World"
并且我安装于IP地址为"10.20.30.40"的端口"8888"上,
数据库名称为"MyDBName",
连接用户名为"MyUser",连接密码为"MyPass"

下面是我的数据库产品源代码:

 package com.java1to3.jdbc;

 /**
  * 我的简易数据库
  */
 public class MyDataBase {

     /** 是否连接成功 */
     public static boolean isConnect = false;

     /**
      * 【模拟】连接到指定的数据库服务器
      */
     public static boolean connect(String connectUrl,String userName,String password){
         if ("10.20.30.40/8888".equals(connectUrl)
             && "MyUser".equals(userName)
             && "MyPass".equals(password)
         ) {
             isConnect = true;
         } else {
             isConnect = false;
         }

         return isConnect;
     }

     /**
      * 【模拟】根据SQL查询结果
      */
     public static String query(String sql){
         if (isConnect) {
             if ("Hello".equals(sql)) {
                 return "JDBC World";
             } else {
                 return "ERROR:What?";
             }
         } else {
             return "ERROR:Not Connect!";
         }
     }
 }

MyDataBase

・为我的数据库写模拟JDBC驱动

为了让Java开发者通过JDBC接口也能访问我的数据库,下面我来为我的数据库写JDBC驱动:
我需要完成如下接口的实现:
/* 存放查询结果集 */
java.sql.ResultSet:MyResultSet
/* 对SQL语句的操作 */
java.sql.Statement:MyStatement
/* 对数据库连接的操作 */
java.sql.Connection:MyConnection
/* 数据库驱动 */
java.sql.Driver:MyDriver
我写了一个简易的DriverManager:MyDriverManager来实现对数据库驱动的管理

下面是具体实现方式:

 package com.java1to3.jdbc;

 import java.io.InputStream;
 import java.io.Reader;
 import java.math.BigDecimal;
 import java.net.URL;
 import java.sql.*;
 import java.util.Calendar;
 import java.util.Map;

 /**
  * 实现了JDBC的java.sql.ResultSet接口
  * 主要负责结果集的读取操作
  */
 public class MyResultSet implements ResultSet {

     /** 【模拟】用于存放查询结果的二维数组 */
     private String[][] result = null;
     /** 【模拟】当前行游标 */
     private int currentCursor = -1;

     /**
      * 【模拟】如果数据不包含ERROR信息,则将该数据存储到结果集中
      */
     public MyResultSet(String result){
         if (result.indexOf("ERROR:") == -1) {
             this.result = new String[][]{{result}};
             this.currentCursor = -1;
         }
     }

     /**
      * 【模拟】向前移动行游标,如果超出结果集范围返回FALSE,否则返回TRUE
      */
     public boolean next() throws SQLException {
         if (result != null && currentCursor < result.length-1) {
             currentCursor ++;
             return true;
         } else {
             return false;
         }
     }

     /**
      * 【模拟】返回当前行游标下指定列的数据
      */
     public String getString(int columnIndex) throws SQLException {
         return result[currentCursor][columnIndex-1];
     }

     // 以下接口方法略
 }

MyResultSet

 package com.java1to3.jdbc;

 import java.sql.*;

 /**
  * 实现了JDBC的java.sql.Statement接口
  * 主要负责SQL执行等相关操作
  */
 public class MyStatement implements Statement {

     /**
      * 【模拟】根据输入的SQL语句返回相应的查询结果集java.sql.ResultSet
      */
     public ResultSet executeQuery(String sql) throws SQLException {
         String result = MyDataBase.query(sql);
         return new MyResultSet(result);
     }

     // 以下接口方法略
 }

MyStatement

 package com.java1to3.jdbc;

 import java.sql.*;
 import java.util.*;

 /**
  * 实现了JDBC的java.sql.Connection接口
  * 主要负责与数据库通讯相关功能
  */
 public class MyConnection implements Connection {

     /**
      * 【模拟】创建一个用于执行SQL语句相关操作的java.sql.Statement
      */
     public Statement createStatement() throws SQLException {
         return new MyStatement();
     }

     // 以下接口方法略
 }

MyConnection

 package com.java1to3.jdbc;

 import java.sql.*;
 import java.util.*;

 /**
  * 主要负责驱动管理和根据制定URL获取相关数据库连接
  */
 public class MyDriverManager {

     /** 【模拟】存放驱动列表 */
     private static List<Driver> driverList = new ArrayList<Driver>();

     /**
      * 【模拟】注册驱动
      */
     public static void registerDriver(Driver driver){
         driverList.add(driver);
     }

     /**
      * 【模拟】遍历已注册的每一个驱动,返回接受传入url的驱动的连接
      */
     public static Connection getConnection(String url,String user,String password) throws SQLException{

         // 保存用户名密码
         java.util.Properties info = new java.util.Properties();
         info.put("user", user);
         info.put("password", password);

         // 遍历已注册的每一个驱动,返回接受传入url的驱动的连接
         for (Driver driver:driverList) {

             Connection connection = driver.connect(url, info);

             if (connection != null) {
                 // 找到驱动
                 return connection;
             }
         }

         // 没有找到驱动
         System.out.println("No suitable driver");
         throw new SQLException("No suitable driver");
     }
 }

MyDriverManager

 package com.java1to3.jdbc;

 import java.sql.*;
 import java.util.*;

 /**
  * 实现了JDBC的java.sql.Driver接口
  * 主要负责驱动的注册和JDBC连接创建
  */
 public class MyDriver implements Driver {

     static{
         // 【模拟】生成一个驱动并注册到驱动管理器
         MyDriver driver = new MyDriver();
         MyDriverManager.registerDriver(driver);
     }

     /**
      * 【模拟】根据传入的URL返回java.sql.Connection
      * 如果非MyDB产品或非jdbc协议,返回NULL
      */
     public Connection connect(String url, Properties info) throws SQLException {

         // 获取用户名,密码
         String userName = (String)info.get("user");
         String password = (String)info.get("password");

         // 协议名称:jdbc
         String protocolName = url.split(":")[0];
         // 产品名称:MyDB
         String productName = url.split(":")[1];
         // 连接参数:IP地址,端口号等
         String connectUrl = url.substring(url.indexOf(productName) + productName.length() + 1);

         // 如果协议为jdbc并且产品为MyDB,则根据连接参数连接到数据库,否则返回NULL
         if (protocolName.equals("jdbc") && productName.equals("MyDB")) {

             boolean connectResult = MyDataBase.connect(connectUrl,userName,password);

             if (connectResult) {
                 MyConnection connection = new MyConnection();
                 return connection;
             } else {
                 throw new SQLException("Can not connect to MyDB.");
             }

         } else {
             return null;
         }
     }

     // 以下接口方法略
 }

MyDriver

・测试查询

 package com.java1to3.jdbc;

 import java.sql.*;

 /**
  * 测试
  */
 public class MyTest {

     public static void main(String[] args) throws Exception{
         // 注册驱动
         Class.forName("com.java1to3.jdbc.MyDriver");
         // 获取连接
         Connection conn = MyDriverManager.getConnection("jdbc:MyDB:10.20.30.40/8888","MyUser","MyPass");
         // 获取SQL执行对象
         Statement st = conn.createStatement();
         // 获取SQL执行结果集
         ResultSet rs = st.executeQuery("Hello");

         // 输出结果
         while(rs.next()){
             String result = rs.getString(1);
             System.out.println("result is:"+result);
         }

         // 关闭连接
         rs.close();
         st.close();
         conn.close();
     }
 }

作者:java1to3
链接:http://www.cnblogs.com/java1to3/
著作权归作者所有。未经作者本人同意,禁止一切转载。
商业或非商业转载请联系作者获得授权并请注明出处。

JavaWeb核心技术学习 - 1.从JDBC说起的更多相关文章

  1. JavaWeb的学习路线

    JavaWeb的学习路线 一.BS结构 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将 ...

  2. 走进JavaWeb技术世界3:JDBC的进化与连接池技术

    走进JavaWeb技术世界3:JDBC的进化与连接池技术 转载公众号[码农翻身] 网络访问 随着 Oracle, Sybase, SQL Server ,DB2,  Mysql 等人陆陆续续住进数据库 ...

  3. JavaWeb基础学习体系与学习思路

    对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...

  4. JavaWeb王者归来学习笔记

    JavaWeb王者归来学习笔记... Ajax王者归来: Ajax:Asynchronous JavaScript And XML -------Ajax 是一些旧有技术的结合.但却以一种新的姿态.披 ...

  5. 个人技术博客(α)------javaweb的学习路程

    该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...

  6. 跟着刚哥学习Spring框架--JDBC(六)

    Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简 ...

  7. SpringBoot 企业级核心技术学习专题

    专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Boot 核心技术章节源码 Spring Boot 核心技术 ...

  8. Javaweb学习笔记7—JDBC技术

      今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容.   ps:我的思维是用的 ...

  9. JavaWeb学习总结-09 JDBC 学习和使用

    一 JDBC相关概念介绍 1.1 数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

随机推荐

  1. 工控SCADA模型 基于HTML5 Canvas WebGL制作摩托车

    工业方面制作图表,制作模型方面运用到 3d 模型是非常多的,在一个大的环境中,构建无数个相同的或者不同的模型,构建起来对于程序员来说也是一件相当头疼的事情,我们利用 HT 帮大家解决了很大的难题,以下 ...

  2. AngularJS学习篇(二十四)

    AngularJS 应用 <html ng-app="myNoteApp"> <head> <meta charset="utf-8&quo ...

  3. Python爬虫入门:Cookie的使用

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  4. .NET Core多平台项目模板eShopOnContainers编译手记

    之前写了一个功能性的文件上传asp.net core的小程序,加上点七七八八的东西,勉强能够应付了,打算学习一下微软的官方.NET CORE微服务示例https://github.com/dotnet ...

  5. CLR类型设计之泛型(二)

    在上一篇文章中,介绍了什么是泛型,以及泛型和非泛型的区别,这篇文章主要讲一些泛型的高级用法,泛型方法,泛型接口和泛型委托,协变和逆变泛型类型参数和约束性,泛型的高级用法在平时的业务中用的不多,多用于封 ...

  6. 【分享】纯jQuery实现星巴克官网导航栏效果

    前言 大冬天的没得玩,只能和代码玩. 所以就无聊研究了一下星巴克官网,在我看来应该是基本还原吧~ 请各位大神指教! 官网效果图 要写的就是最上方的会闪现的白色条条 效果分析 1.在滚动条往下拉到一定距 ...

  7. centos7 jdk8 tomcat8 安装

    安装jdk # cd /opt/# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F ...

  8. 非关系型数据库redis-java基本操作

    概述 redis是一个key-value的nosql数据库(非关系型数据库).支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set -- ...

  9. 基于树莓派的智能家居项目的设想与实现 Hestia

    注:本人内容的准确性仅限于笔者写该篇文章时的情况,不保证后续与实际项目代码一致.实时内容还请关注Github项目托管页面:https://github.com/GenialX/hestia-serve ...

  10. Struts2-052验证脚本

    下面分享一下Struts2-052验证的python脚本 #-*- coding:utf-8 -*- import requests url_list_path ="/home/d0ll4r ...