[1]jdbc的概念
-
什么是jdbc
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
-
图例:
-
jdbc的由来
-
早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循JDBC规范的,可以访问自己数据库的API被称之为驱动!
-
JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!
-
总的来说,大致分为以下四个阶段:
-
1:JDBC-ODBC桥接阶段 :Java-ODBC-DB
使用odbc,桥接访问数据库
java刚出名,缺少访问数据库的方式,sun公司找数据库厂商提供,厂商未提供,采用中转方案,使用用为c语言编写的odbc技术来访问数据库。 -
2:Native阶段:Java-JDBC-Client-DB
使用数据库厂商提供的实现访问数据库
Java出名一段时间了,sun公司又找数据库厂商提供,厂商提供了一套自己实现的jdbc-client,用与访问数据库。 -
3:JDBC-net pure java drvier: client-general protocol-server-DB
Java通过访问容器服务,去获取数据库连接,进而访问数据库
Java更出名了,由于出现了数据库迁移的需求,例如sqlserver转oracle,由于jdbc-client的差异,导致迁移问题,于是sun公司出了一套jdbc访问数据库的接口,统一了各个厂商之间的jdbc-client底层代码实现差异。 -
4:native protocal pure java:java-JDBC-DB
jdbc的持续更新,可以通过java程序去找数据库驱动,然后来连接数据库
-
-
-
jdbc包含的内容
-
接口部分:sun公司提供,在jdk的
java.sql.*
和javax.sql.*
包中,例:class java.sql.DriverManager 管理多个数据库驱动类,提供了获取数据库连接的方法。 interface java.sql.Connection 代表一个数据库连接(当Connection对象不为null时,代表已经连接上了数据库)。 interface java.sql.Statement 发送SQL语句到数据库的工具。 interface java.sql.PreparedStatement Statement的子类,对其进行了封装,可以处理带占位符的sql语句,解决了sql注入的问题 interface java.sql.ResultSet 保存SQL查询语句的结果数据(结果集)。 -
DriverManger(驱动管理器)的作用有两个:
- 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
- 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
-
Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:
- Connection最为重要的一个方法就是用来获取Statement对象;
- Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句
- void executeUpdate(String sql):执行更新操作(insert、update、delete等);
- ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
-
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:
- boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
- XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
-
-
实现部分:由数据库厂商提供,例oracle
- ojdbc14 jdk1.4编写
- ojdbc5 jdk1.5编写
- ojdbc6 jdk1.6编写
[2]jdbc开发步骤[重点]
我使用的Ecllipse,需要新建一个普通的java project
-
注册驱动
I. 将Oracle数据库驱动
ojdbc14.jar
复制到项目的lib文件夹中。II.
ojdbc14.jar
右键 -> build path -> add to build path。III.
Class.forName("oracle.jdbc.OracleDriver");
//手动加载字节码文件到JVM中。 -
获取连接
-
获取连接需要两步,一是使用DriverManager来注册驱动,二是使用DriverManager来获取Connection对象。
获取连接的也只有一句代码:
DriverManager.getConnection(url,username,password),
-
通过DriverManager获取数据库连接对象(Connection),指定三个参数,如下所示:
url:jdbc:oracle:thin:@192.168.230.10:1521:orcl username:username password:password
-
-
获得发送SQL的工具:
I. 编写即将执行的SQL语句(语句中不能包含分号)。
II. 通过Connection创建Statement对象。例:
Statement stm = con.createStatement();
III. Statement是用来向数据库发送要执行的SQL语句的!
-
发送sql并接收执行结果
I. DML语句:增删改时,返回受影响行数(int类型)。
II. DQL语句:查询时,返回结果数据(ResultSet结果集)。
-
处理结果
I. DML:增删改时,返回受影响行数(int类型)。
II. DQL:查询时,返回结果集(ResultSet类型)。
-
释放资源
I. 遵循先开后关。
II. Connection、PreparedStatement、ResultSet。
[3]ResultSet(结果集)【重点】:
-
作用:存储查询到的结果数据。
-
使用:
ResultSet rs = stat.executeQuery(sql);
-
获得ResultSet中的数据:
-
数据行指针:
初始位置在第一行数据前,每调用一次boolean next()方法,返回为true,则ResultSet的指针向下移动一位 -
ResultSet的API:
rs.next() //判断是否存在下一行
rs.getXXX(columnIndex) //列的编号(从1开始)
rs.getXXX(columnLabel) //列的名称
[4]PreparedStatement【重点】:
-
概念:预编译SQL命名对象
-
参数化SQL:可通过" ? "进行参数的占位
String sql = "select * from t_account where cardId = ? and password = ?";
-
绑定动态参数:
ps.setInt(1,值);
ps.setDouble(2,值);
ps.setString(3,值);
ps.setDate(4,值);
ps.setObject(5,值); //通用
-
发送绑定参数到数据库执行SQL:
I. int ps.executeUpdate(); //执行增删改
II. ResultSet ps.executeQuery(); //执行查询
-
PreparedStatement的好处:
I. 作用:发送预编译的SQL语句。
II. 优势:防止SQL注入攻击,执行多个同构SQL的效率高。
III. 计算访问计划(Access Plan)等效于Oracle的Map集合,将SQL语句一起缓存到内存中。//首次访问相对耗时 SQL = key/plan = value
IV. 通过SQL语句查找Oracle缓存访问计划并执行。
[5]jdbc常见错误
类名错误 | |
---|---|
URL错误 | |
服务没开 | |
Listener服务没开 | |
动态参数个数与占位符个数不匹配 | |
书写了小于零,或大于占位符个数的值 |