`

jdbc 原理

    博客分类:
  • Jdbc
阅读更多

.JDBC原理概述

 

1JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并规定了JAVA开发人员访问数据库所使用的方法的调用规范。

 

2JDBC的实现是由数据库厂商提供,以驱动程序形式提供。

 

3JDBC在使用前要先加载驱动。 

JDBC对于使用者要有一致性,对不同的数据库其使用方法都是相同的。

 

驱动开发必须要实现Driver接口。 

数据库驱动的实现方式 

JDBC-ODBC桥接式 

JDBC网络驱动,这种方式是通过中间服务器的协议转换来实现的 

JDBC+本地驱动,这种方式的安全性比较差。 

JDBC驱动,由数据库厂商实现。

 

.JDBCAPI

 

java.sql包和javax.sql包 

Driver接口(驱动),在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序 

Class.forName("oracle.jdbc.driver.OracleDriver") 

DriverManager类(驱动管理器),它可以创建连接,它本身就是一个创建Connection的工厂(Factory)。 

Connection接口,会根据不同的驱动产生不同的连接 

Statement接口,发送sql语句 

ResultSet接口(结果集),是用来接收select语句返回的查询结果的。其实质类似于集合。

 

.JDBC应用步骤 

1,注册加载一个driver驱动 

2,创建数据库连接(Connection) 

3,创建一个Statement(发送sql) 

4,执行sql语句 

5,处理sql结果(select语句)

6,关闭Statement 

7,关闭连接Connection

 

注意:67两个步骤是必须要做的,因为这些资源是不会自动释放的,必须要自己关闭

 

访问Oracle的数据库的驱动名字叫ojdbc14.jar,要使用这个驱动程序,要先将他加到环境变量CLASSPATH中。

 

注册加载驱动driver,也就是强制类加载 

Class.forName(Driver包名.Driver类名)

 

Driver d=new Driver();//注意:这个方法不能用参数来构造 

DriverManager.registerDriver(d);

 

OracleDriver的全名oracle.jdbc.driver.OracleDriver 

mysqlDriver的全名com.mysql.jdbc.Driver 

SQLServerDriver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver

 

创建连接 

DriverManager.getConnection(String url,String username,String password); 

Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的,这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。 

OracleURL值是由连接数据库的协议和数据库的IP地址及端口号还有要连接的数据库的库名(DatebaseName

 

Oracle URL的格式 

jdbc:oracle:thin:(协议)@XXX.XXX.X.XXX:XXXXIP地址及端口号):XXXXXXX(所使用的库名) 

例:jdbc:oracle:thin:@192.168.0.20:1521:tarenadb

 

MySql URL的写法 

例: jdbc:mysql://localhost:3306/tarena 

SQLServer URL的写法 

例:jdbc:microsoft:sqlserver://localhost:1433/test

 

java -Djdbc.drivers=驱动的完整类名

 

使用虚拟机参数,加载驱动 -D表示为虚拟机参数赋值 

java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver:com.mysql.jdbc.Driver 

 

.JDBC基本方法 

DriverManager:如果有多个驱动可用的话,DriverManager会根据URL选择其中一个可用的驱动

 

Driver:可以选择固定的驱动 

Driver driver = new oracle.jdbc.driver.OracleDriver(); 

String user = "sd0613"; 

String password = "sd0613"; 

Properties prop = new Properties(); 

prop.setProperty("user",user); 

prop.setProperty("password",password); 

driver.connect(url,properties); 

 

executeQuery(sqlString);//返回结果集 

executeUpdate(sqlString);//返回值为该次操作影响的记录条数,create table返回

execute(sqlString); 

//适用于不知道具体的操作是什么,返回值是boolean类型的 

//如果返回值是true,代表执行查询操作;否则代表执行更新操作

 

ResultSet 

next()方法

1.判断是否存在下一条记录 

2.将游标移向下一条记录 

getXXX(字段名或字段序号)//注意:字段序号从1开始 

 

关闭问题

使用Connection对象获得一个StatementStatement中的executeQuery(String sql) 方法可以使用select语句查询,并且返回一个结果集 ResultSet通过遍历这个结果集,可以获得select语句的查询结果,ResultSetnext()方法会操作一个游标从第一条记录的前边开 始读取,直到最后一条记录。executeUpdate(String sql) 方法用于执行DDLDML语句,可以updatedelete操作。 

注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为StatementResultSet是需要连接时才可以使用的,所以在使用结束之后有可能其他的Statement还需要连接,所以不能先关闭

一、Statement 

execute(sql); 当不知道执行的SQL语句是什么类型的时候执行 ,返回值是boolean 

executeQuery(sql); 执行查询语句 

executeUpdate(sql); 执行更新语句

 

二、PreparedStatement 

可以使用参数替代sql语句中的某些参数使用 "?"代替,他先将带参数的sql语句发送到数据库,进行编译,然后PreparedStatement会将参数发送给数据库。 

在使用PreparedStatement时,在设置相应参数时,要指明参数的位置和类型,以及给出参数值 

根据不同的参数类型使用不同的setXXX(参数的位置,参数值)来设置参数

 

例: 

public void insert(Student s){ 

Connection con=ConnectionFactory.getConnection();//建立连接 

String sql="insert into student(id,name) values(?,?)"; 

PreparedStatement ps=null; 

try { 

ps=con.prepareStatement(sql);//创建一个PreparedStatement 

int index=1; 

ps.setInt(index++,s.getStuId()); //为参数赋值 

ps.setString(index++,s.getName()); 

ps.executeUpdate(); 

} catch (SQLException e) { 

e.printStackTrace(); 

}finally{ 

if(ps!=null) 

try { 

ps.close(); 

} catch (SQLException e) { 

e.printStackTrace(); 

if(con!=null) 

try { 

con.close(); 

} catch (SQLException e) { 

e.printStackTrace(); 

}

 

CallableStatement是可以用非sql语句来访问数据库,他是通过调用存储过程(PL/SQL)来访问数据库的。可以直接使用连接来调用 prepareCall(...)方法,来执行这个存储过程,"..."是存储过程的名字。

 

对于系统时间要去数据库时间 

TimeStamp 和 Date都可以保存时间 

TimeStamp可以保存时、分、秒的数据,Date只保存日期年月的信息。

 

SQLException是检查异常必须处理要么throws ,要么try{}catch(){} 

getErrorCode()可以获得错误码,可以对错误进行查询。

 

三、源数据 

JDBC中有两种源数据,一种是数据库元数据,另一种是ResultSet元数据。

 

源数据就是描述存储用户数据的容器的数据结构。

 

ResultSet rs=ps.executeQuery(sql); 

ResultSetMetaData m=rs.getMetaData();

 

getColumnCount(),获得实际列数 

getColumnName(int colnum),获得指定列的列名 

getColumnType(int colnum),获得指定列的数据类型 

getColumnTypeName(int colnum),获得指定列的数据类型名

 

//打印结果集 

public static void printRS(ResultSet rs)throws SQLException{ 

ResultSetMetaData rsmd = rs.getMetaData(); 

while(rs.next()){ 

for(int i = 1 ; i < = rsmd.getColumnCount() ; i++){ 

String colName = rsmd.getColumnName(i); 

String colValue = rs.getString(i); 

if(i>1){ 

System.out.print(","); 

System.out.print(name+"="+value); 

System.out.println(); 

}

 

四、数据库源数据

 

DatabaseMetaData 

getURL(),获得连接数据库的URL 

getDatabaseProductName() 获得数据库产品的名称 

getDriverVersion() 获得JDBC驱动程序的String形式的版本号 

getTables()获得数据库中该用户的所有表 

getUserName() 获得数据库用户名。

 

五、异常的处理 

try{} 

catch(SQLException){} 

try{} 

catch(Exception){}

 

.事务(Transaction) 

原子操作:不可再分的操作,一个操作不能再分成比它更细小的操作

事务是针对原子操作的,要求原子操作不可再分,并且必须同时成功同时失败。 

事务就是把一些非原子操作,变成原子操作,由应用服务器来提出要求,由数据库服务器来执行操作.

 

JDBC中默认是自动提交的,如果要想使用事务,需要按以下步骤执行

1.要调用con.setAutoCommite(false)方法,把自动提交(commit)置为false。 

2.进行正常的数据库操作 

3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback(); 

注意:打开事务就要关闭自动提交,当不需要再使用事务的时候调用setAutoCommite(true). 

 

.事务并发产生的问题 

三种并发产生的后果

1,脏读:一个事务读取到了另外一个事务没有提交的数据。 

2,重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一时间点上读取到的数据相同,希望在一段时间内的数据是不变的。 

3,幻读:一个事务读取到了另外一个事务提交的数据。用同样的操作读取两次,得到的记录数不相同。

 

.事务隔离级别 

五种控制级别

TRANSACTION_NONE不使用事务。 

TRANSACTION_READ_UNCOMMITTED 允许脏读。 

TRANSACTION_READ_COMMITTED防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别 

TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读, 

TRANSACTION_SERIALIZABLE可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率

 

以上的五个事务隔离级别都是在Connection类中定义的静态常量,使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。 

:con.setTransactionIsolation(Connection.REPEATABLE_READ);

 

.JDBC2.0新特性 

1.可滚动特性和可更新特性 

JDBC1.0中是指游标的移动的方向和方式是单向,单步(相对)移动,功能比较简单

JDBC2.0中游标可以双向,相对或者绝对移动

可滚动结果集:这种结果集不但可以双向滚动,相对定位,绝对定位,并且还可以修改数据信息。

 

1)滚动特性 

定位函数

boolean absolute(int row),定位到指定的记录位置。定位成功返回true,不成功返回false。 

void afterLast() ,把游标移动到最后一条记录的后面(逻辑位置)。 

void beforeFirst() ,把游标移动到第一条记录的前面(逻辑位置)。 

//由于第一条记录的前面和最后一条记录的后面这两个位置肯定存在,所以无需判断是否存在,返回值设为void. 

boolean first(),把游标定位到第一条记录。 

boolean last(),把游标定位到最后一条记录。 

//当结果集为空的时候,这两个方法会返回false. 

boolean next(),此方法是使游标向下一条记录移动。 

boolean previous() ,此方法可以使游标向上一条记录移动,前提是前面还有记录。 

boolean relative(int rows) ,相对定位方法,参数值可正可负,参数为正,游标从当前位置向后移动指定值条记录,参数为负,游标从当前位置向前移动指定值条记录。

 

判断函数

ifBeforeFirst()判断是否在在第一条记录之前

ifAfterLast()判断是否在在最后一条记录之后

ifFirst()判断是否为第一条记录

ifLast()判断是否为最后一条记录.

 

要使用可滚动结果集时,需要一次设置更新特性与滚动特性,不能分开.

 

1.更新特性常量

CONCUR_READ_ONLY 只读结果集(默认

CONCUR_UPDATABLE 可更新结果集

 

2.滚动特性常量

TYPE_FORWARD_ONLY ,该常量表示指针只能向前移动的 ResultSet 对象的类型。(默认

TYPE_SCROLL_INSENSITIVE ,该常量指示可滚动但通常不受其他更改影响的 ResultSet 对象的类型。 

TYPE_SCROLL_SENSITIVE ,该常量指示可滚动并且通常受其他更改影响的 ResultSet 对象的类型。 

//敏感:数据库改变,结果集改变

语法

Statement st=null; 

st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE) 

在创建Statement的时候就要指定这两个参数,使用Statement,第一个参数代表滚动特性常量,第二个代表更新特性常量

 

2)可更新特性 

a.moveToInsertRow();记录当前游标位置,将游标移到和结果集结构类似的缓冲区

b.使用updateXxx(int column,columnType value)方法来更新指定列数据

c.使用insertRow() 方法插入记录

d.将游标指回原位,moveToCurrentRow() 

 

能否使用JDBC2.0 ResultSet的新特性,要看使用的数据库驱动是否支持

还有只能用于单表且表中有主键字段(可能会是联合主键),不能够有表连接,会取 

可更新操作必须满足以下条件

a.查询只能引用一张表

b.不能包含任何连接操作

c.必须把完整的主键查到结果集里面

d.保证所有字段为非空字段并且没有默认值。

 

.数据库元数据

DatabaseMetaData dbmd = con.getMetaData();//得到数据库元数据 

dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY, 

ResultSet.CONCUR_UPDATABLE);//判断是否支持可更新操作

 

.批量更新 

优势

1.节省传递时间 

2.并发处理

 

PreparedStatement: 

1.addBatch() 将一组参数添加到 PreparedStatement对象内部 

2.executeBatch() 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

 

Statement: 

addBatch(String sql)方法会在批处理缓存中加入一条sql语句 

executeBatch()执行批处理缓存中的所有sql语句。

 

注意:PreparedStatement中使用批量更新时,要先设置好参数后再使用addBatch()方法加入缓存。 

批量更新中只能使用更新或插入语句

 

.SQL3中的数据类型 

Array:数组 

Sturct:结构 

大对象

Blob:大的二进制数据文件对象。 

Clob:大的文本文件对象。 

优点

1.理论上大小没有上限,受制于数据库表空间的大小

2.流式读取.

 

使用大对象的步骤

1.先插入一个空的占位对象empty_blob()(oracle的函数):insert into t_blob values(?,?,empty_blob()); 

2.获得大对象:select blob_data from t_blob where name = ? for update; 

3.获取流进行写入:blob.setBinaryStream(0); 

4.通过流来获取blob中存储的数据:blob.getBinaryStream()

 

一、IDHigh/Low算法 

高位数字分别与低位数字相匹配,得到的数字是唯一的 

减少与数据库的交互

 

二、ORM 

1、类映射成表 

类名与表名对应 

2、属性定义映射成列,类型之间必须是兼容的 

3、类关系映射成表关系

 

一对一双向关系 

内存中都保存对方的一个引用 

数据库中,表bid是主键,也是外键,引用a表的id主键 -- share pk 

b中有一个字段aid是外键,引用a表的主键,并且有唯一约束  -- pk+fk 

共享主键: 

create table car_pk ( 

id number(10,0) not null, 

name varchar2(15), 

serial varchar2(30), 

manufacturer varchar2(50), 

producedate date, 

primary key (id) 

);

 

create table engine_pk ( 

id number(10,0) not null, 

model varchar2(20), 

manufacturer varchar2(50), 

producedate date, 

primary key (id) 

);

 

alter table engine_pk 

add constraint fk_engine_car_pk 

foreign key (id) 

references car_pk(id); 

 

外键+唯一约束 

create table car_fk ( 

id number(10,0) not null, 

name varchar2(15) not null, 

serial varchar2(30) not null, 

manufacturer varchar2(50) not null, 

producedate date, 

primary key (id) 

);

 

create table engine_fk ( 

id number(10,0) not null, 

model varchar2(20) not null, 

manufacturer varchar2(50) not null, 

producedate date, 

carid number(10,0) unique, 

primary key (id) 

);

 

alter table engine_fk 

add constraint fk_engine_car_fk 

foreign key (carid) 

references car_fk(id); 

 

实体对象:在内存中有id属性的 

值对象:没有id的,依赖其他对象存在

 

一对多关系 

一的一方保存多一方的一个集合,最好使用set,保证无重复元素 

多的一方保存一一方的一个对象的引用 

public class Order implements Serializable{ 

private int id; 

private String owner; 

private String phone; 

private String address; 

private Set<Item> items = new HashSet<Item>(); 

public class Item implements Serializable{ 

private int id; 

private String product; 

private int amount; 

private Order order; 

 

create table ec_item ( 

id number(10,0) not null, 

product varchar2(15) not null, 

amount number(10,0) not null, 

orderid number(10,0) not null, 

primary key (id) 

);

 

create table ec_order ( 

id number(10,0) not null, 

owner varchar2(15) not null, 

phone varchar2(15) not null, 

address varchar2(50), 

primary key (id) 

);

 

alter table ec_item 

add constraint fk_item_order 

foreign key (orderid) 

references ec_order(id); 

 

 

多对多 

双方都保存对方的多个引用 

例子:学生选课 

public class TarenaCourse implements Serializable{ 

private int id; 

private String name; 

private int period; 

private Set<TarenaStudent> students = new HashSet<TarenaStudent>(); 

public class TarenaStudent implements Serializable{ 

private int id; 

private String name; 

private Date birthday; 

private Set<TarenaCourse> courses = new HashSet<TarenaCourse>(); 

}

 

create table student ( 

id number(10,0) not null, 

name varchar2(15) not null, 

birthday date, 

primary key (id) 

);

 

create table student_course ( 

sid number(10,0) not null, 

cid number(10,0) not null, 

primary key (sid, cid) 

);

 

create table course ( 

id number(10,0) not null, 

name varchar2(15) not null, 

perion number(10,0), 

primary key (id) 

);

 

alter table student_course 

add constraint fk_student 

foreign key (sid) 

references student(id);

 

alter table student_course 

add constraint fk_course 

foreign key (cid) 

references course(id);

 

通过学生姓名找课程 

select c.name from cource c,student s,student_course sc 

where c.id=sc.cid and s.id=sc.sid 

and s.name = 's1' 

 

三、继承关系 

public abstract class Computer implements Serializable{ 

private int id; 

private int price; 

private String manufacturer; 

}

 

public class Desktop extends Computer{ 

private boolean isLCD; 

}

 

public class Notepad extends Computer{ 

private float weight; 

private float thickness; 

 

1、建3张表 table per class 

子类中保存父类的主键作为外键 

create table computer_tpc ( 

id number(10,0) not null, 

price number(10,0) not null, 

manufacturer varchar2(30) not null, 

primary key (id) 

);

 

create table desktop_tpc ( 

computerid number(10,0) not null, 

islcd char(1), 

primary key (computerid) 

);

 

create table notepad_tpc ( 

computerid number(10,0) not null, 

weight float, 

thickness float, 

primary key (computerid) 

);

 

alter table desktop_tpc 

add constraint fk_desk_computer_tpc 

foreign key (computerid) 

references computer_tpc(id);

 

alter table notepad_tpc 

add constraint fk_note_computer_tpc 

foreign key (computerid) 

references computer_tpc(id);

 

查找所有电脑的配制(只要是电脑就能被查出来) 

select c.id,c.price,d.islcd,n.weight,n.thickness 

from computer c, desktop d,notepad n 

where c.id = d.computerid(+) 

and c.id = n.computer(+) 

 

2、建2张表 

create table desktop ( 

id number(10,0) not null, 

price number(10,0) not null, 

manufacturer varchar2(30) not null, 

islcd char(1), 

primary key (id) 

);

 

create table notepad ( 

id number(10,0) not null, 

price number(10,0) not null, 

manufacturer varchar2(30) not null, 

weight float, 

thickness float, 

primary key (id) 

);

 

3、建1张表 

create table computer_tph ( 

id number(10,0) not null, 

category char(1) not null, 

price number(10,0) not null, 

manufacturer varchar2(30) not null, 

islcd char(1), 

weight float, 

thickness float, 

primary key (id) 

);

 

四、JDBC2.0扩展

 

1JDBC DataSource 

DataSourse(数据源),包含了连接数据库所需的信息,可以通过数据源或的数据库连接,有时由于某些连接数据库的信息会变更, 

所以经常使用包含数据库连接信息的数据源。 

 

JDBC取连接有2种方式:Driver Manager 和 数据源 

 

2JNDIDataSourse 

主要功能:定位服务 

JNDI,(命名路径服务)也用于存储数据,但是他所存储的是一写零散的信息。 

JNDI的方法是在javax.naming包下

 

InitialContext 连接,初始化上下文,这个类的提供者一般也是服务器的提供者 

查找和绑定 

查找由我们做,绑定我们并不关心,只配制数据源就好了 

 

代替DriverManager定位数据源 

遍布式企业的数据源的属性可以存储在同一个目录(JNDI)中 

以这种方式集中管理用户名、密码、数据库名和JDBC URL 

创建连接: 

Context jndiContext = new InitialContext(); 

DataSource source = (DataSource)jndiContext.lookup(" "); 

COnnection con = source.getConnection(); 

 

3、连接池 

要提供连接池数据源,带缓存的连接 

带缓存的连接,即可池化的连接,其close()方法,在物理上并没有被关闭,而是保留在一个队列中并被反复使用。 

 

4、分布式事务 

事务分为JDBC事务和JTA 

JDBC事务,由容器管理 

JTA,分布式事务,由容器管理

<!--EndFragment-->

分享到:
评论

相关推荐

    java之JDBC原理及方法

    该文档介绍了java数据库开发的基本原理模型,常用的数据库连接方法及数据库操作

    JDBC原理(pdf)

    JDBC 的工作原理 一、JDBC 的工作原理 二、访问数据库所要做的基本配置

    让你彻底了解JDBC的原理

    让你真正的了解JDBC,不只是知道它应该这样敲出来,更要知道它为什么要这样做的原理!!!

    01-JDBC原理概述.pdf

    。。。

    01-JDBC原理概述.docx

    。。。

    jdbc访问数据库的步骤

    jdbc原理 jdbc访问数据库的步骤 数据库

    Java中JDBC概述的资料,帮助初学者掌握何为JDBC

    2、JDBC原理 早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现 这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们 讨论,最终得出的...

    JDBC的学习笔记收集

    JDBC原理概述 1,JDBC是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并规定了JAVA开发人员访问数据库所使用的方法的掉用规范。 2,JDBC的实现是由数据库厂商...

    jdbc连接池原理

    关于jdbc连接池连接数据库的原理

    servlet+jdbc+jsp 应用

    采用基本的servlet和jsp,jdbc,采用mvc模式的架构开发

    JDBC学习资料

    2、理解JDBC原理、知道什么是JDBC驱动;3、知道JDBC的功能;4、掌握JDBC中几个重要类的使用:Connection、Statement、ResultSet;5、理解JDBC操作数据库的一般步骤;6、掌握SQLException的异常处理;7、理解数据库事务、...

    JDBC开发过程与原理

    JDBC应用步骤 1,注册加载一个driver驱动 2,创建数据库连接(Connection) 3,创建一个Statement(发送sql) 4,执行sql语句 5,处理sql结果(select语句) 6,关闭Statement 7,关闭连接Connection...

    JDBC数据库连接池实现原理

    java实现JDBC数据库连接池的原理,里面有oracle驱动jar包,以及代码的阅读步骤

    java重要讲座课间JDBC、网络

    java课件 jdbc原理 jdbc使用 java连接网络 java连接数据库,java得基本知识

    java 访问数据库JDBC的工作原理 课件

    主要介绍JDBC应用程序接口的使用,技术访问数据库的方法和JDBC技术

    JDBC学习(九)dbUtils原理代码实例

    JDBC学习(九)dbUtils原理代码实例,包含三个demo:正常C3P0数据库池对数据库的增删改查操作;自己实现dbutils对数据库实现增删改查操作;使用apache的工具类dbutils对数据库增删改查操作。

    数据库原理实验六ODBC和JDBC数据库编程实用.pdf

    数据库原理实验六ODBC和JDBC数据库编程实用.pdf

    JDBC技术剖析

    JDBC技术剖析1.JDBC概述2.JDBC原理2.1 JDBC中主要类2.1.1 DriverManager类2.1.2 Connection2.1.3 Statement3 JDBC应用示例1、 加载驱动2.、获取连接3、获取Statement4、执行sql的增删改查语句5、关闭资源6、示例代码...

    JDBC---初学者入门

    一.JDBC原理概述(了解 能说出来就行) 二.JDBC的API (熟记于心) 三.JDBC应用步骤(熟记于心) 四.元数据(了解) 五.事务(Transaction)(熟记于心) 六.JDBC2.0新特性(了解) 其中批处理必须掌握。

    JDBC流程

    推荐一篇超详细的JDBC原理和开发步骤 https://www.jianshu.com/p/8a9635c156ea 具体流程 1、加载驱动(注册驱动) 这里推荐使用Class.forName()反射方法载入驱动,这样不会对详细驱动类产生依赖 连接Oracle Class....

Global site tag (gtag.js) - Google Analytics