Doy_10 JDBC的概述
#### 什么是数据库驱动
* 驱动: 两个设备(应用)之间通信的桥梁.
## JDBC的入门
### JDBC的环境准备
### 创建数据库和表
```
create database web_test3;
use web_test3;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20),
age int
);
insert into user values (null,'aaa','123','小丽',34);
insert into user values (null,'bbb','123','大王',32);
insert into user values (null,'ccc','123','小明',28);
insert into user values (null,'ddd','123','大黄',21);
```
### JDBC的开发步骤
* 第一步:加载驱动
```
Class.forName("com.mysql.jdbc.Driver");
```
* 第二步:获得连接
```
Connection conn =DriverManager.getConnection("jdbc:mysql://localhost:3306/web_test3", "root", "abc");
```
* 第三部:基本操作
* 获取执行SQL语句的对象:
```
Statement statement = conn.createStatement();
```
* 编写SQL语句:
```
String sql = "select * from user";
```
* 执行SQL:
```
ResultSet rs = statement.executeQuery(sql)
```
* 遍历结果:
```
while(rs.next()){
System.out.print(rs.getInt("id")+" ");
System.out.print(rs.getString("username")+" ");
System.out.print(rs.getString("password")+" ");
System.out.print(rs.getString("nickname")+" ");
System.out.print(rs.getInt("age"));
System.out.println();
}
```
* 第四步:释放资源
```
rs.close();
statement.close();
conn.close();
```
![52576897452](C:\Users\ADMINI~1\AppData\Local\Temp\1525768974529.png)
# 模糊查询:
![52577108874](C:\Users\ADMINI~1\AppData\Local\Temp\1525771088743.png)
##DriverManager:驱动管理类
#### 作用一:注册驱动
* Class.forname("com.mysql.jdbc.Driver");
#### 作用二:获得连接
这个方法就是用来获得与数据库连接的方法:这个方法中有三个参数:
* url :与数据库连接的路径
* user:与数据库连接的用户名
* password:与数据库连接的密码
主要关注的是url的写法"
```
jdbc:mysql://localhost:3306/web_test3
```
* jdbc :连接数据库的协议
* mysql : 是jdbc的子协议
* localhost :连接的MySQL数据库服务器的主机地址。(连接是本机就可以写成localhost),如果连接不是本机的,就需要写上连接主机的IP地址.
* 3306 : MySQL数据库服务器的端口号.
* web_test3 :数据库名称
url如果连接的是本机的路径,可以简化为如下格式:
```
jdbc:mysql:///web_test3
```
### Connection:与数据库连接对象
#### 作用一:创建执行SQL语句的对象
执行SQL语句对象
* Statement : 执行SQL
* CallableStatement :执行数据库中存储过程
* PreparedStatement : 执行SQL.对SQL进行预处理。解决SQL注入漏洞
####Statement:执行SQL
#### 作用一:执行SQL
* 执行SQL的方法
* boolean execute(String sql);
* 执行查询,修改,添加,删除的SQL语句。
* ResultSet executeQuery(String sql);
* 执行查询(执行select语句)。
* int executeUpate(String sql);
* 执行修改,添加,删除的SQL语句。
#### ResultSet:结果集
通过select语句的查询结果
#### 结果集的获取
* 结果集获取可以使用结果集中的:
* getXXX();方法通常都会有一个重载的方法。
* getXXX(int columnIndex);
* **getXXX(StringcolumnName);**
#### JDBC资源释放
JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement,Connection。
这几个对象中尤其是Connection对象是非常稀有的。这个对象一定要做到尽量晚创建,尽早释放掉。
* 将资源释放的代码写入到finally的代码块中。
* 资源释放的代码应该写的标准:
```
if(rs !=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
#### 抽取一个JDBC的工具类
因为传统JDBC的开发,注册驱动,获得连接,释放资源这些代码都是重复编写的。所以可以将重复的代码提取到一个类中来完成
### JDBC的配置信息提取到配置文件
#### 配置文件
* 属性文件
* 格式: 扩展名是.properties
* XML文件
#### 什么是SQL注入漏洞
####演示SQL注入漏洞
* 输入用户名
* aaa’ or ‘1=1 密码随意
* aaa’ -- 密码随意
#### SQL注入漏洞分析
##### SQL注入漏洞分析
![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\OICE_292C666C-50DC-403A-A15A-F4B5183EC8E5.0\msohtmlclip1\01\clip_image002.jpg)
#### SQL注入漏洞解决
需要采用PreparedStatement对象解决SQL注入漏洞。这个对象将SQL预先进行编译,使用?作为占位符。?所代表内容是SQL所固定。再次传入变量(包含SQL的关键字)。这个时候也不会识别这些关键字。
#### 保存操作代码实现
```
@Test
/**
* 保存操作
*/
public void demo1(){
Connection conn = null;
PreparedStatement pstmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL语句:
String sql = "insert into user values (null,?,?,?,?)";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数:
pstmt.setString(1, "eee");
pstmt.setString(2, "abc");
pstmt.setString(3, "旺财");
pstmt.setInt(4, 32);
// 执行SQL
int num = pstmt.executeUpdate();
if(num > 0){
System.out.println("保存成功!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(pstmt, conn);
}
}
```
### JDBC的CRUD操作之PreparedStatement的修改操作
#### 修改操作代码实现
```
@Test
/**
* 修改操作
*/
public void demo2(){
Connection conn = null;
PreparedStatement pstmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL语句:
String sql = "update user set username = ?,password =?,nickname=?,age = ? where id = ?";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数:
pstmt.setString(1, "abc");
pstmt.setString(2, "1234");
pstmt.setString(3, "旺旺");
pstmt.setInt(4, 23);
pstmt.setInt(5, 6);
// 执行SQL:
int num = pstmt.executeUpdate();
if(num > 0){
System.out.println("修改成功!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(pstmt, conn);
}
}
```
#### 删除操作的代码实现
```
@Test
/**
* 删除操作
*/
public void demo3(){
Connection conn = null;
PreparedStatement pstmt = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL语句:
String sql = "delete from user where id = ?";
// 预编译SQL
pstmt = conn.prepareStatement(sql);
// 设置参数:
pstmt.setInt(1, 4);
// 执行SQL:
int num = pstmt.executeUpdate();
if(num > 0){
System.out.println("删除成功!");
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(pstmt, conn);
}
}
```
#### 查询操作代码实现
```
@Test
/**
* 查询操作
*/
public void demo4(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
// 获得连接:
conn = JDBCUtils.getConnection();
// 编写SQL:
String sql = "select * from user";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数:
// 执行SQL:
rs = pstmt.executeQuery();
// 遍历结果集:
while(rs.next()){
System.out.println(rs.getInt("id")+" "+rs.getString("username")+" "+rs.getString("password")+" "+rs.getString("nickname"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtils.release(rs, pstmt, conn);
}
}
|
|