⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 day01.txt

📁 JDBC描述详解JDBC描述详解JDBC描述详解JDBC描述详解
💻 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 + -