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 数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
随机推荐
- Hibernate的基础入门(一)
一Java三层结构 1 web层:struts框架 2 service层:Spring框架 3 dao层 :hibernate框架 相当于MVC的思想 1 M:模型èhibernate框架 2 V: ...
- SVN Upgrade working copy
出现这个的原因是因为你机器上安装的svn客户端版本过高,而你从别的地方拷贝代码中的svn版本过低,点击SVN Upgrade working copy可以将代码中的svn版本升级.
- python 3 ---购物车练习
# -*- coding:utf-8 -*-#Author Chen #定义商品列表List_of_commodities = [ ('Iphone',6888), ('Mac Pro',12888) ...
- 几种文件查找命令,whereis ,find ,locate.
whereis对于文件的查找,是将系统内的所有文件放在一个数据库文件里.whereis 和 locate 都是以该数据库为准的(由于每个数据库会有一个更新时间,一般在更新时间之后才可以找到).而fin ...
- c# 条形码(求指教)
因公司需要完成一条形码打印问题,所以在找到一些资料做了一个Demo 特请教! 不知道此条形码是否正确: 图: 源码: 代码 )); } g.Save(); ...
- 接受第三方app分享的数据
前段时间公司项目需要一个需求: 把第三方的app分享的数据接受到自己的apk中, 涉及到的第三方app是: Youtube/Amazon/NetFlix, 这些app通过分享功能把当前的信息分享出去. ...
- ZooKeeper全面介绍
ZooKeeper简介 ZooKeeper是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. ZooKe ...
- [转载] Java实现生产者消费者问题
转载自http://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费 ...
- Ext3和Ext4文件系统区别
inode http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html Ex3使用15个inode查询数据块,前12个为直接数据块,直接指 ...
- Java Web基础入门
前言 语言都是相通的,只要搞清楚概念后就可以编写代码了.而概念是需要学习成本的. Java基础 不用看<编程思想>,基础语法看 http://www.runoob.com/java/jav ...