JavaWeb核心技术学习 - 1.从JDBC说起
作者: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说起的更多相关文章
- JavaWeb的学习路线
JavaWeb的学习路线 一.BS结构 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将 ...
- 走进JavaWeb技术世界3:JDBC的进化与连接池技术
走进JavaWeb技术世界3:JDBC的进化与连接池技术 转载公众号[码农翻身] 网络访问 随着 Oracle, Sybase, SQL Server ,DB2, Mysql 等人陆陆续续住进数据库 ...
- JavaWeb基础学习体系与学习思路
对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...
- JavaWeb王者归来学习笔记
JavaWeb王者归来学习笔记... Ajax王者归来: Ajax:Asynchronous JavaScript And XML -------Ajax 是一些旧有技术的结合.但却以一种新的姿态.披 ...
- 个人技术博客(α)------javaweb的学习路程
该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...
- 跟着刚哥学习Spring框架--JDBC(六)
Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简 ...
- SpringBoot 企业级核心技术学习专题
专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Boot 核心技术章节源码 Spring Boot 核心技术 ...
- Javaweb学习笔记7—JDBC技术
今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的 ...
- JavaWeb学习总结-09 JDBC 学习和使用
一 JDBC相关概念介绍 1.1 数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
随机推荐
- 关于easyui隐藏后数据不能刷新??
原因是div用display属性隐藏后不能重新加载table数据 解决方法:使用hide()方法在初始化时隐藏 $("#two").hide(); //点击按钮隐藏与显示表单域 $ ...
- Nginx Location 匹配
location匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写~* #表示执行一个正则匹配,不区分大小写^~ #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配 ...
- Nginx HTTP 核心模块
原文链接:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=17238776&id=2982697aio 语法:aio [ ...
- js实现小球的弹性碰撞。
前 言 MYBG 小编最近在做自己的个人网站,其中就用到了一个小球碰撞检测的功能,想自己写,无奈本人能力不足啊(毕竟还是一个菜鸟)!!就想着找个插件用一下也好,可是找了好久也没有找到一个比较好用 ...
- 浅谈字体小图标font awesome,iconfont,svg各自优缺点
三种都是矢量图(即放大不失真),但是个自又有个自的优缺点, 1.font awesome: 优点:相对比较简单,查看官网看例子基本上都会用 (http://www.bootcss.com/p/font ...
- 二:Maven中pom.xml元素详解
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6628201.html 一个pom.xml中包含了许多标签,各个标签是对项目生命周期.依赖管理的配置.常用的主 ...
- 基础进阶(一)之HashMap实现原理分析
HashMap实现原理分析 1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二 ...
- VUE环境配置——运行Demo
如果有Vue的Demo 不知道怎么运行的同学可以看这里 这里只讲Win下面环境配置 一.NodeJs安装 1.下载Windows 安装包(.msi),并安装https://nodejs.org/d ...
- ES6中class关键字
1 .介绍 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + th ...
- Verilog中变量位宽注意
Verilog中,变量定义方式可以为:reg[位宽-1:0] 数据名:reg[位宽:1] 数据名.其他变量也类似. 以reg变量cnt为例,当cnt位宽为4时,可定义为reg[3:0] cnt,或者定 ...