JDBC编程

文章目录

  • 一、概述
  • 二、使用

一、概述

1.概念

JDBC(Java Database Connectivity java数据库连接)指的是通过Java代码,来操作数据库,是一种用于执行SQL语句的Java API,是Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问

2.工作原理

(1)一个成熟的数据库一般都会提供一些API(Application Programming Interface 应用程序编程接口,广义概念),供程序员使用,可以给人提供一些功能,这些功能往往是通过一些函数/类这样的方式来提供的
      【1】 Arraylist、Scanner、Random等都可以认为是Java标准库提供的API。

      【2】 Interface也是接口,特指Java语法中的一种特殊语法格式(狭义概念),Java 中的interface也是一种提供API的方式

(2)成熟的数据库有很多,如MySQL、Oracle、SQLServer、SQLite等,这些数据库提供的AIP差异很大。JDBC就是Java这边提出的一套操作数据库的API,存在的意义就是为了统一每个数据库的API,让所有的数据库都遵循Java的这套API,能按照一样的方式来操作使用。

(3)JDBC是提供了一套统一的API,但是数据库也有自己的API,这里是每个数据库厂商提供了数据库的驱动包(一些代码),类似于翻译,将API进行转化

JDBC编程_第1张图片
(4)JDBC是个jar包,.jar类似于.rar这样的压缩包,.jar是java定义的一种压缩格式,里面包含了很多的.class文件

二、使用

1.步骤

  1. 将jar包导入到项目中
  2. 创建数据源
  3. 创建数据库连接Connection
  4. 创建操作命令Statement
  5. 使用操作命令来执行SQL
  6. 处理结果集ResultSet
  7. 释放资源

2.分析

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCDemo1 {
    public static void main(String[] args) throws SQLException {
        // 假定数据库中有一个 student 表 (id, name), 往里面插入一个数据.
        // 让用户通过控制台来输入学号和姓名.
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入学号: ");
        int id = scanner.nextInt();
        System.out.println("请输入姓名: ");
        String name = scanner.next();

        // 1. 创建 "数据源"
        DataSource dataSource = new MysqlDataSource();
        	
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false");
			
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("123456");

        // 2. 和数据库服务器建立连接
        Connection connection = dataSource.getConnection();

        // 3. 构造 SQL 语句
        String sql = "insert into student values(?, ?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, id);
        statement.setString(2, name);

        // 4. 执行 SQL 语句
        int n = statement.executeUpdate();
        System.out.println("n = " + n);

        // 5. 释放必要的资源. 关闭连接.
        statement.close();
        connection.close();
    }
}

1. 创建 “数据源”

DataSource dataSource = new MysqlDataSource();
  • DataSource :JDBC的interface,MysqlDataSource :MYSQL驱动包中提供的类,实现了DataSource interface,是向上转型
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&useSSL=false");
  • 是向下转型(因为这个setUrl方法是子类独有的)
    > MysqlDataSource dataSource = new MysqlDataSource();
    > DataSource.setUrl();
       也可以这样写,不需要任何转型
  • 上述转型的写法,本意是希望,让MysqlDataSource这个类,不要扩散到代码的其他部分(目的是降低mysql驱动包和自写项目之间的耦合关系,避免后续更换数据库时,有太大的成本)
  • URL:唯一资源定位符,通常使用URL来描述网络上的一个资源的位置,mysql本体是服务器,相当于是网络上的资源
  • jdbc:mysql://127.0.0.1:3306/Test?characterEncoding=utf8&useSSL=false
    • jdbc:mysql:表示这个url是什么类型/用途的,这里意思是,【给JDBC的mysql使用的】
    • 127.0.0.1
      • 表示ip地址(网络上的一个设备的地址,通过一串数字来表示,这一串数字通常是4个部分,每个部分取值范围是0-255,4个部分使用.分割,使用点分十进制转换)
      • 127.0.0.1 是个特殊的ip地址,即环回ip(loopback)特指自己的主机
    • 3306:端口号,用来区分主机上的应用程序(进程)
    • Test:数据库名
    • characterEncoding=utf8:统一字符集是utf8
    • useSSL=false:数据库服务器和客户端之间的通信要不要加密(不写是默认加密),不写有可能会连不上数据库
((MysqlDataSource) dataSource).setUser("root");  //设置用户名
((MysqlDataSource) dataSource).setPassword("123456"); //设置密码
  • root:大家都是root
  • 123456:安装数据库时,自己设置的密码

2. 和数据库服务器建立网络上的连接

使用【Connection java.sql】,不要用【Connection com.mysql.jdbc】(MySQL驱动包的Connection)

Connection connection = dataSource.getConnection();
  • java.sql.SQLException:jdbc中提供的受查异常,务必要手动处理,(要么try catch、要么throws)
  • 一个java程序可以连多个数据库服务器
  • 和每个数据库服务器进行通信都得有一个独立的连接

3. 构造 SQL 语句

Statement对象主要是将SQL语句发送到数据库中。JDBC API中主要提供了三种Statement对象,即Statement、PreparedStatement、CallableStatement

String sql = "insert into student values(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
  • SQL语句,是String类型的,JDBC提供了Statement(语句)对象,可以将String转换成Statement再发给服务器执行,但是,我们一般会使用PreparedStatement(预处理的语句)对象来代替Statement。
    • Statement 是把sql原封不动地直接发给数据库服务器,数据库服务器自己负责解析SQL,PreparedStatement 则会在客户端这边初步解析一下SQL,如验证语法是否正确等等,此时服务器就不用做这些检查了,可以降低服务器的负担
  • String sql = “insert into student values(” + id + ", " + name + “)”;
    • 这种写法也可以达到动态输入的效果,但是不建议这么写,因为这个写法看起来比较混乱,而且这种拼接字符串的方式,并不安全(可能会受到SQL注入攻击,黑客会通过一些特定的输入,达成对数据库攻击的效果)
  • ?是一个占位符,占据一个位置,后续PreparedStatement 会把变量的数值,代入到?中

4. 执行 SQL 语句

int n = statement.executeUpdate();
System.out.println("n = " + n);
  • executQuery():本质是“读”操作, 方法执行后返回单个结果集的,通常用于select语句
    executeUpdate():本质都是“写”操作,方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete
    语句

5. 释放必要的资源. 关闭连接.

创建的语句对象和连接对象,都会持有一些计算机的硬件/软件上的资源,这些资源不用了就应该要及时释放。
java中虽然有“垃圾回收”机制,可以自动释放内存,但是计算机的资源又不仅仅是内存,这些其他的资源就需要手动释放(一般都是会提供close方法,专门负责释放资源的方法)

statement.close();
connection.close();
  • 注意关闭顺序,先创建的对象,后关闭

三、查询操作

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

// 查询
public class JDBCDemo3 {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要查询的学号: ");
        int studentId = scanner.nextInt();

        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java108?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("2222");

        Connection connection = dataSource.getConnection();

        // 这里同样可以包含一些占位符.
        String sql = "select * from student where id = ?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setInt(1, studentId);

        // 执行查询操作, 要使用 executeQuery. 返回值是一个 ResultSet 类型的对象. 表示了一个 "表格"
        ResultSet resultSet = statement.executeQuery();

        // 遍历结果集合,最先指向的是第一行记录的前一个位置,每次调用next就会往下走一行,读取成功了,返回true,否则返回false
        while (resultSet.next()) {
            // 获取到这一行的 学号 列
            int id = resultSet.getInt("id");
            // 获取到这一行的 姓名 列
            String name = resultSet.getString("name");
            System.out.println("id: " + id + ", name: " + name);
        }

        // 释放资源.
        resultSet.close();
        statement.close();
        connection.close();
    }
}

1.ResultSet对象

  • ResultSet对象它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。
  • ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

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