A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夕阳下的少年 初级黑马   /  2018-5-9 17:26  /  781 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
        }
    }

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马