📄 day01.txt
字号:
JDBC_day01 langna 2007-9-6 星期四
王海格老师 haige_wang@tarena.com.cn
课程大概:
基础语法
2.0扩展
程序设计
一、第一章 基本概念
1、JDBC是什么?能做什么?
JDBC是java访问数据库的基本接口(底层接口);包括 j2se, j2ee
高级的框架或手段 Hibernate,EJB 也是基于jdbc的。
JDBC的功能:
1)可以连接数据库;(服务器) 提供java到数据库的连接;
2)通过SQL命令来操作数据库;JDBC 借助于标准查询语言对数据库进行增删改查;
3)JDBC提供对结果集的封装和处理;
4)支持事务的操作;
2、JDBC产生的背景和基本结构(工作原理):
1)背景:
JDBC应该算是企业的特性,但是放在j2se文档里;
JDBC应该算是java最早的企业级的应用;但是当时还没有j2ee,就放在j2se里了;
因为作为通用的语言必须具有访问数据库的能力,所以在java推出时就有了JDBC;
2)原理:
JDBC仿照ODBC写的;ODBC用类C(C,C++)语言写的;
两层结构:
一层是面向java程序员;
一层是面向驱动程序/driver开发人员:
3)什么是驱动程序?
驱动程序就是将 接口的一致性,实现的多样性 结合起来;
例 :
显卡的驱动,主板上有一个显卡的插槽(公共接口,针脚排列);
操作系统来调用显卡时,只需通过驱动程序来操作那块显卡;
各个厂商的显卡是不同的,但是驱动程序都实现了这个接口;
JDBC是插槽,数据库就是显卡;
驱动程序代表实现;特点是多样性;不同的驱动就是将JDBC和不同的数据库结合起来;
JDBC是一套规范/协议;物理上是JAVA接口集;突出的特点是一致性;
4) 协议:
体现的是sun公司(java程序员)和数据库厂商(驱动的开发者)的协议;
是调用者和实现者的协议;前者是按照规范去调用;后者是按照规范实现;
sun公司定义规范;java程序员写代码调用,数据库厂商实现规范;
为什么JDBC具有一致性?
接口就是实现者和调用者之间的协议,保证一致性;接口不能修改原来的定义,只能增加;
5) 总结:
JDBC是一个由java接口组成的接口集,代表了实现者(数据库厂商)和调用者(java程序员)之间的协议;
只能让操作看起来一致,并没有实现;真正去工作的是驱动;
接口例子:
螺钉、螺母,有工业规范规定的,也是接口;
遥控器,使用者和实现者的分离;实现者工作比使用者相对复杂;
程序、驱动、jdbc接口一起才能有效的工作;
人、电视、遥控器 一起才是看电视;
3、JDBC Driver的四种类型:(不管是哪个厂商的,按照历史发展顺序)
1) JDBC-ODBC桥 驱动:
由ODBC驱动提供JDBC访问;
每年都有很多计算机语言诞生,但是不久就灭亡了;
刚开始,数据库厂商也不是很看好java这门语言;不是很想写驱动;
但是j2se中有jdbc的规范;必须得实现,sun公司很巧妙的利用了ODBC(c 访问数据库的驱动),
当时ODBC所有的数据库都能访问;将JDBC翻译成了ODBC;
应用程序--> JDBC--> 桥--> ODBC-->数据库
安全性不是很好(java的安全性建立在jvm上), 效率也不高(翻译);
2) 本地API 部分java驱动:
部分Java driver把JDBC调用转化成本地的客户端API
如果代码调用了windows的系统调用,就是windows本地调用;
应用程序--> JDBC -->JVM/OS --> 数据库
速度还可以,但是不是纯java的;
3) JDBC-net :纯java驱动;
纯的Java driver,将JDBC调用转入DBMS,与网络协议无关。然后通过服务器将调用转为DBMS协议。
没有直接访问数据库,访问了中间服务器;
应用程序--> JDBC--> 驱动--> 访问中间服务器--> 数据库
本地协议,数据库服务器的应用层协议;
中间协议,中间服务器的协议;
安全性还可以,但是协议,网络造成了效率的降低;
4) 纯 java 本地协议:
纯的java driver,将JDBC调用直接转为DBMS使用的网络协议
应用程序--> JDBC--> 驱动-(本地协议)-->数据库(内置对jvm的支持)
安全性没有问题,效率也高了;数据库厂商作出了努力;
现在我们用的就是这种驱动;
4、开发者接口的内容:
驱动程序, 有很多类,但有一个主类,实现java.sql.Driver接口,手动加载这个类;
两个包:java.sql.*;//主要接口包;
javax.sql.*;//扩展功能包;j2ee版
JDBC 贯穿课程,以后Hibernate, EJB,Spring 都要用;
Driver :接口,代表驱动程序;
DriverManager:工具类,辅助管理驱动程序的;并不是规范里的内容;规范里只有接口;
Connection:接口,连接数据库,代表和数据库的物理连接;某种意义上代表数据库本身;事务也由它代表;
Statement:接口,操作数据库的对象,发送 sql语句
PreparedStatement:Statement子接口,预编译Statement,开发中主要用这个;
CallableStatement:Statement子接口,调用数据库的存储过程,用的比较少;数据库之间的存储过程是不通用的;
ResultSet:接口,结果集,代表对数据库的查询结果,并且提供处理结果的方法;
DataBaseMetadata:接口,代表原数据,数据库原数据
ResultMetadata:接口,代表原数据,结果集原数据
Types:类,辅助的类,代表JDBC类型,定义了很多整数类型的常量;是标准SQL类型的子集;
数据库:例 :vachar=12,number=2
5、访问数据库:
0) 加载驱动; 反射的方法;
1) 连接数据库;
2) 操作数据库;
3) 返回结果集:ResultSet
4) 关闭数据库连接;
Oracle的Driver的全名oracle.jdbc.driver.OracleDriver
mysql的Driver的全名com.mysql.jdbc.Driver
SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver
Class.forName("oracle.jdbc.driver.OracleDriver");//Oracle的驱动,实现了Driver接口;
DriverManager.getConnection(url:String,username:String,passwd:String);
没有用驱动直接去要连接,而是用了一个驱动管理员,是为了更灵活,以后会细讲,这里先知道;
url:协议,ip地址,端口号; jdbc:oracle:thin:@192.168.0.201:tarena
Statement 从Connection 来的; stmt = con.createStatement();
例子:
public static void main(String[] args)
{
Connection con = null;// 接口不能直接new
Statement st = null;
ResultSet rs = null;
try
{
//1、 加载驱动;
Class.forName("oracle.jdbc.driver.OracleDriver");
//2、获取连接;实现类在驱动程序里;
con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.201:1521:tarena",
"xjh0704", "xjh0704");
//3、操作数据库;插入一条记录
stmt = con.createStatement();
stmt.executeUpdate("insert into ln_student values(4,'langna','shanghai')");
}catch(Exception e){
e.printStackTrace();
}finally{
//4、关闭连接;判断是否为空,然后关闭;
try{
if(con!=null) con.close();
}catch(SQLException ex){
ex.printStackTrace();
}
}
}
DriverManager 可以得到多个连接对象 Connection ,一个连接对象可以获取Statement对象;
DriverManager --Driver--Connection--Statement --ResultSet
类比: 经理 --工程师-- 连线-- -- 电话---- 电话记录
二、第二章 基本语法
1、开发步骤:6步
1)加载驱动:
三种方法:
A.Class.forName(DriverName);
a.加载到内存;
b.注册到DriverManager;
public class OracleDriver implements Driver
{
//利用静态代码块注册驱动
static
{
DriverManager.riegisterDriver(new OracleDriver());
}
}
B.直接创建Driver实例
a. Driver driver=new oracle.jdbc.driver.OracleDriver();
b. DriverManager.riegisterDriver(driver);
这种写的比较死,不提倡使用;
C.利用虚拟机的参数来设置环境变量;通过环境变量让虚拟机去加载;
a. 运行时: -D 设置虚拟机参数,要求虚拟机为你加载的驱动程序的名字;
jdbc.drivers 环境变量,是虚拟机的环境变量,不是操作系统的;
名字是事先定义好的,不能改变;多个参数用空格隔开;
java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver FristJdbc(要运行的程序名) (程序参数/main方法参数)
如果将Class.forName();去掉的话,会报异常:no suitable driver ;
2)建立连接
3)获取Statement
4)操作数据库
5)处理结果集,(可选)
6)释放数据库资源
实验一:配置环境
简单的数据库连接
2、协议
总协议 子协议 ip地址 端口号 资源名称
http://202.64.4.33:80/index.html
jdbc.oracle:thin:@192.168.0.20:1521:tarena
jdbc:mysql://127.0.0.1:3306/test
3、游标 :
String sql = "select * from ln_student";
rs = st.executeQuery(sql);
System.out.println("resultset "+rs);
while(rs.next())
{
System.out.print("id=" + rs.getInt(1));//也可以是字段名"id"
System.out.print(",name=" + rs.getString(2));
System.out.print(",address=" + rs.getString("address"));
System.out.println();
}
结果集,二维表;
指向记录的指针:指向当前记录;
游标刚开始放在结果集的第一条记录的上边;
rs.next();//如果有下一条记录,返回true;否则返回false;游标向下移动一位
iterator 的 hasNext();和next(); 合二为一
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -