Java后端笔记(3)数据库访问

1.JDBC(Java Data Base Connectivity)

JDBC是一种用来执行SQL语句的Java API,由一组用java语言编写的类和接口组成。

JDBC工作原理:Java后端笔记(3)数据库访问

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’

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值