ITOne 2016-12-13 23:18
1.JDBC(Java Data Base Connectivity)
JDBC是一种用来执行SQL语句的Java API,由一组用java语言编写的类和接口组成。
JDBC工作原理:
JDBC工作原理
JDBC API:集成在JDK中了。
主要接口:
Connection接口:负责数据库连接并担任传送数据的任务
Statement接口:负责执行SQL语句,由Connection接口产生
方法:
executeQuery 执行SQL查询并返回ResultSet对象
executeUpdate 可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行
execute 可以执行任意SQL语句,返回一个布尔值,表示是否返回ResultSet
PreparedStatement接口:Statement接口的子接口
ResultSet接口:负责保存和处理查询结果集,由Statement或PreparedStatement接口产生
面试题:什么是resultSet游标?获得ResultSet对象时游标定位在哪里?
ResultSet的结构和数据库表类似,每行代表一条记录,每列代表一个字段,还存在一个游标。游标相当于一个定位器,定位正在操作的当前行。
当通过executeQuery()方法从数据库得到ResultSet结果集时,游标定位在第一行之前,通过ResultSet对象的next()方法可以将游标移到下一行,ResultSet对象的getXxx()方法可以完成对游标指定行数据的获取。
(了解即可)方法:
next 将游标从当前位置向下移动一行,返回布尔类型
previous 将游标从当前位置向上移动一行,返回布尔类型
getRow 得到游标当前所在行数
absolute 游标移动到指定行,输入参数为指定的行数
close 关闭ResultSet对象
getInt 获取结果集当前行指定字段号(或字段名)值,输入参数可以是字段的序号,也可以是字段名称,返回值为Int数据类型
getFloat 与getInt类似,返回值为Float数据类型
getString 与getInt类似,返回值为String数据类型
JDBC Driver Manager:集成在JDK中
通过操作DriverManager类,根据数据库不同,管理相应的JDBC驱动
JDBC驱动:由各个数据库厂商提供的
连接数据库的时候首先要加载JDBC驱动(通过Class.forName(JDBC驱动)加载)
JDBC驱动分类:
1)JDBC-ODBC桥驱动:由SUN提供,是JDK的标准API。他是把所有JDBC的调用传递给ODBC(开放数据库互连,Open Database Connectivity,可通过控制版面->管理工具 访问ODBC配置)再由ODBC调用本地(应用程序端)数据库驱动代码来操作数据库。
缺点:效率低,且要求应用程序端必须安装对应数据库的ODBC驱动
2)本地API驱动:在应用程序端,直接把JDBC调用转变为数据库自己的标准调用,然后再去访问数据库。
特点:效率比ODBC高单仍要在应用程序端加载数据库厂商提供的代码库
3)网络协议驱动:JDBC先把对数据库的访问请求传递给网络上的中间件服务器,中间件服务器把请求翻译为符合数据库规范的调用,再把这种调用传给数据库服务器。如果中间件服务器也是用Java开发的,那么中间层也可以使用前两种类型的JDBC驱动作为访问数据库的方法。
特点:不需要在应用程序端加载数据库厂商的代码库,且大部分功能实现在中间件上,所以执行效率和可升级性比较好。但这种驱动在中间层仍需要配置数据库驱动程序,并且由于多了中间层传递,执行效率也会受影响。
4) 本地协议驱动(纯java驱动):直接把JDBC调用转化为符合相关数据库系统规范的请求。
特点:执行效率非常高,不需要在应用程序端和数据库端加载任何软件和驱动(但要加jar包),更方便
2.JDBC操作数据库步骤:
1.导入jar包
2.加载数据库驱动类Class.forName();
3.创建数据库连接对象
4.准备sql语句
5.执行sql语句
6.关闭数据库
代码模板:
try{
//加载驱动
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("加载数据库驱动不成功");
}
try {
//创建JDBC连接
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11","xiaolan","tiger");
//创建Statement对象,准备执行sql语句
Statement stmt=conn.createStatement();
//执行sql语句,返回结果(可能是结果集)
ResultSet rs=stmt.executeQuery("SELECT id,name FROM users");
//操作结果集
while(rs.next()){
int id=rs.getInt("id");
String name=rs.getString("name");
}
//关闭连接
conn.close();
} catch (SQLException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
3.PreparedStatement和Statement的区别
1、PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。
2、PreparedStatement 继承了 Statement 的所有功能,还添加了一整套方法,用于设置发送给数据库以取代占位符的值。三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数,但功能不变.
3、防止SQL注入。PreparedStatement 实例包含已编译的 SQL 语句,使得SQL语句已经准备好,等待SQL语句执行之前,通过适当的setXxx()方法来给占位符提供具体的值
4.SQL注入
在没有合法用户名和密码的情况下,通过拼接出特殊的SQL语句,插入到提交或输入域名或请求的查询字符串,达到欺骗服务器执行恶意SQL命令
案例:输入用户名:good,密码:'good'or'2'='2'
执行的sql语句是:SELECT * FROM USERS WHERE name=‘good’and passward=‘good’or‘2’=‘2’