JDBC 的使用

JDBC 的使用

步骤

JDBC 的使用_第1张图片

代码

package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        // 1. 注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 2. 获取连接
        String url="jdbc:mysql://127.0.0.1:3306/itheima";
        String username="root";
        String password="123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 3. 定义sql
        String sql="update account set money=2000 where id=1";

        // 4. 获取执行sql的对象
        Statement stmt=conn.createStatement();

        // 5. 执行sql
        int count=stmt.executeUpdate(sql); // 受影响的行数返回值

        // 6. 处理结果
        System.out.println(count);

        // 7. 释放资源
        stmt.close();
        conn.close();
    }
}

JDBC API 详解

1. DriverManager

DriverManager(驱动管理类)作用:

  1. 注册驱动
  2. 获取数据库连接

① 注册驱动

Class.forName("com.mysql.jdbc.Driver");

注意:Mysql 5之后的驱动包,可以省略注册驱动的步骤;

自动加载jar包中META-INF/services/java.sql.Driver 文件中的驱动类

② 获取连接

static Connection          getConnection(String url,String user,String password)
  • 参数

    • url:连接路径

      JDBC 的使用_第2张图片

    • user:用户名

    • password:密码

2. Connection

Connection(数据库连接对象)作用:

  1. 获取执行 SQL 的对象
  2. 管理事务

① 获取执行 SQL 的对象

  • 普通执行 SQL 对象

    Statement createStatement();
    
  • 预编译 SQL 的执行 SQL 对象:防止 SQL 注入

    PreparedStatement prepareStatement(sql);
    
  • 执行存储过程的对象

    CallableStatement prepareCall(sql)
    

② 事务管理

  • MySQL 事务管理

    开启事务:BEGIN; /START TRANSACTION;
    提交事务:COMMIT;
    回滚事务:ROLLBACK;
    
    MySQL 默认会自动提交事务
    
  • JDBC 事务管理:Connection 接口中定义了3个对应的方法

    开启事务:setAutoCommit(boolean autoCommit)true 为自动提交事务;false 为手动提交事务,即为开启事务
    提交事务:commit()
    回滚事务:rollback()
    
代码
package com.itheima.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        // 1. 注册驱动
		// Class.forName("com.mysql.jdbc.Driver");

        // 2. 获取连接
        String url="jdbc:mysql:///itheima?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 3. 定义sql
        String sql1="update account set money=3000 where id=1";
        String sql2="update account set money=4000 where id=2";

        // 4. 获取执行sql的对象
        Statement stmt=conn.createStatement();

        // 异常处理
        try {
            // 开启事务
            conn.setAutoCommit(false);
            
            // 5.1 执行sql
            int count1=stmt.executeUpdate(sql1); // 受影响的行数返回值

            // 6.1 处理结果
            System.out.println(count1);

            // 5.2 执行sql
            int count2=stmt.executeUpdate(sql2); // 受影响的行数返回值

            // 6.2 处理结果
            System.out.println(count2);
            
            // 提交事务
            conn.commit();
        } catch (Exception e) {
            // 回滚事务
            conn.rollback();
            
            e.printStackTrace();
        }

        // 7. 释放资源
        stmt.close();
        conn.close();
    }
}

3. Statement

Statement 作用:

  1. 执行 SQL 语句
执行 SQL 语句
int executeUpdate(sql):执行 DML、DDL 语句

返回值:(1)DML 语句影响的行数

​ (2)DDL 语句执行后,执行成功也可能返回 0

ResultSet executeQuery(sql):执行 DQL 语句

返回值:ResultSet 结果集对象

4. ResultSet

ResultSet(结果集对象)作用:

  1. 封装了 DQL 查询语句的结果
ResultSet stmt.executeQuery(sql):执行 DQL 语句,返回 ResultSet 对象
获取查询结果
boolean next()
(1) 将光标从当前位置向前移动一位
(2) 判断当前行是否为有效行

返回值:

  • true:有效行,当前行有数据

  • false:无效行,当前行没有数据

xxx getXxx(参数):获取数据
xxx:数据类型;如:int getInt(参数)String getString(参数)

参数:

  • int:列的编号,从1开始
  • String:列的名称
使用步骤
  1. 游标向下移动一行,并判断该行是否有数据:next()
  2. 获取数据:getXxx(参数)
// 循环判断游标是否是最后一行末尾
while(rs.next()){
	// 获取数据
	rs.getXxx(参数);
}
代码
package com.itheima.jdbc;

import javax.swing.plaf.nimbus.State;
import java.sql.*;

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        // 1. 注册驱动
        // Class.forName("com.mysql.jdbc.Driver");

        // 2. 获取连接
        String url="jdbc:mysql:///itheima?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 3. 定义sql
        String sql="select * from account";

        // 4. 获取 Statement 对象
        Statement stmt=conn.createStatement();

        // 5. 执行sql
        ResultSet rs=stmt.executeQuery(sql);

        // 6. 处理结果,遍历 rs 中的所有数据
        // 6.1 光标向下移动一行,并且判断当前行是否有数据
        while(rs.next()){
            // 6.2 获取数据 getXxx()
            int id=rs.getInt(1); // 1 表示第1列
            String name=rs.getString(2);
            double money=rs.getDouble(3);

            System.out.println(id);
            System.out.println(name);
            System.out.println(money);

            System.out.println("--------------------------------");
        }

        // 7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}
案例:查询account账户表数据,封装为Acount对象中,并且存储到ArrayList集合中

JDBC 的使用_第3张图片

步骤:

  1. 定义实体类 Account
  2. 查询数据库,封装到 Account 对象中
  3. 将 Account 对象存入 ArrayList 集合中

实体类 Account

package com.itheima.pojo;

public class Account {

    private int id;
    private String name;
    private double money;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

主函数

package com.itheima.jdbc;

import com.itheima.pojo.Account;

import javax.swing.plaf.nimbus.State;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JDBCDemo {
    public static void main(String[] args) throws Exception {
        // 1. 注册驱动
        // Class.forName("com.mysql.jdbc.Driver");

        // 2. 获取连接
        String url="jdbc:mysql:///itheima?useSSL=false";
        String username="root";
        String password="123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        // 3. 定义sql
        String sql="select * from account";

        // 4. 获取 Statement 对象
        Statement stmt=conn.createStatement();

        // 5. 执行sql
        ResultSet rs=stmt.executeQuery(sql);

        // 创建集合 ArrayList
        List<Account> list=new ArrayList<>();

        // 6. 处理结果,遍历 rs 中的所有数据
        // 6.1 光标向下移动一行,并且判断当前行是否有数据
        while(rs.next()){
            // 创建对象
            Account account=new Account();

            // 6.2 获取数据 getXxx()
            int id=rs.getInt("id"); // 1 表示第1列
            String name=rs.getString("name");
            double money=rs.getDouble("money");

            // 赋值
            account.setId(id);
            account.setName(name);
            account.setMoney(money);

            // 存入集合
            list.add(account);

        }

        System.out.println(list);

        // 7. 释放资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

5. PreparedStatement

PreparedStatement 作用:

  1. 预编译 SQL 语句并执行:预防 SQL 注入问题

SQL 注入:

SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达到执行代码对服务器进行攻击的方法

① 获取 PreparedStatement 对象

// SQL 语句中的参数值,使用 ? 占位符替代
String sql="select * from user where username=? and password=?"

// 通过 Connection 对象获取,并传入对应的 sql 语句
PreparedStatement pstmt=conn.preparedStatement(sql);

② 设置参数值

PreparedStatement 对象:setXxx(参数1,参数2):? 赋值
Xxx:数据类型;如 setInt(参数1,参数2)
参数:
	- 参数1? 的位置编号,从1开始
	- 参数2:?的值

③ 执行 SQL

executeUpdate(); / executeQuery();  :不需要再传递 sql

SQL 注入是通过操作输入来修改事先定义好的 SQL 语句,用以达到执行代码对服务器进行攻击的方法

① 获取 PreparedStatement 对象

// SQL 语句中的参数值,使用 ? 占位符替代
String sql="select * from user where username=? and password=?"

// 通过 Connection 对象获取,并传入对应的 sql 语句
PreparedStatement pstmt=conn.preparedStatement(sql);

② 设置参数值

PreparedStatement 对象:setXxx(参数1,参数2):? 赋值
Xxx:数据类型;如 setInt(参数1,参数2)
参数:
	- 参数1? 的位置编号,从1开始
	- 参数2:?的值

③ 执行 SQL

executeUpdate(); / executeQuery();  :不需要再传递 sql
PreparedStatement 原理

JDBC 的使用_第4张图片

你可能感兴趣的:(数据库,sql,java)