MySQL JDBC

JDBC:Java的数据库编程

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

MySQL本身提供了一组API供程序员调用,Oracle,SQL server,SQLite都提供了这样的API让程序员调用,这些不同的数据库提供的API并不相同

程序员希望,大家的API是一样的,但是各个数据库厂商互不相让,此时Java就站了出来

Java给出一套API接口标准,让数据库厂商来照着写,每个数据库厂商都额外写一点代码从而程序员就可以学会Java的这一套API标准就可以让程序员在各个数据库之间来回无缝衔接

这一套API就是JDBC,这一套接口标准可以形象表示为下图

接口转换程序称为"数据库驱动",平时我们所理解的驱动是硬件方面,但是它是软件,在以前,浏览器需要下载驱动才能运行,一旦版本不匹配需要重新匹配,在自动测试方面就有WebDriverManager来实现驱动管理

JDBC是Java标准库提供的,你只要装了JDK就都自带了JDBC,但是使用JDBC操作MySQL就需要下载并导入MySQL驱动包,下载安装一个程序,最好就是去官网下载,但是对于MySQL驱动包来说,Oracle官网藏得很深,强制你注册登录,这时我们可以用到中央仓库(Maven),去中央仓库下载即可

下载MySQL驱动包

搜索MySQL即可找到驱动包,Connector/J是新版本,另一个Java则是旧版本,小版本区别不大

注意:小版本前面的最高序号需要与你的MySQL版本号最高位一致,我的是5.7,所以下载5开头版本的Connector包

我们可以使用下载依赖的方法来注入依赖,这里我们采用引入第三方库

点击这里进行下载,

.jar其实是一个类似于.rar这样的压缩文件,里面包含了很多.class文件,写好的Java文件,就可以把编译出来的.class拷贝给别人,别人就能运行使用了,但是由于一个程序中,往往.class文件会有很多,涉及到一些复杂的目录结构,直接拷贝一堆.class文件非常不友好,于是就把这些要发布的.class按照待定格式打包压缩就得到了.jar文件,后续直接拷贝就可以了,同时JJVM也可以直接识别.jar内部的.class文件并直接运行

  • 创建一个目录,并且把下载好的驱动放在该目录里

  • 右键这个目录,单击add as library,告诉IDEA,当前这个目录是存放第三方库的目录,此时IDEA就能够识别咱们拷贝进来的驱动包了

此时IDEA能够识别驱动包

以上就是JDBC程序的准备工作了,准备工作完成后就可以编写代码了

编写JDBC代码

  •  DateSource数据源:要操作的数据库,数据,是在哪里

package org.example.demo;

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

import javax.sql.DataSource;//JDBC自带的interface

public class Demo {
    public static void main(String[] args) {
        //1.创建数据源 - 这个过程就是所谓的 "数据库厂商写代码和JDBC进行对接"
        DataSource dataSource = new MysqlDataSource();//MySQLDataSource 这个类就是来自于MySQL的驱动包
        MysqlDataSource mysqlDataSource = new MysqlDataSource();
        //这样写也可以,但是第一种是向上转型的写法,更能体现代码的解耦合

    }
}
  • 在MySQL中,就需要设定好,MySQL服务器的位置,要访问的数据库的名字,访问数据库的用户名和密码

package org.example.demo;

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

import javax.sql.DataSource;

public class Demo {
    public static void main(String[] args) {

        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/j?characterEncoding=utf8&useSSL=false");
        //此时seturl中分别是固定格式jdbc:mysql://127.0.0.1:3306/这个地方是数据库名称?这个地方是编码&这个地方是某种协议(加密通信)
        ((MysqlDataSource) dataSource).setUser("root");
        //设置用户名
        ((MysqlDataSource) dataSource).setPassword("root");
        //设置用户名密码
    }
}

MySQL是一个客户端 服务器程序,服务器是保存数据的本体,之前的类似cmd黑框是MySQL客户端,进行客户端-服务器之间的通信的时候,常见的有两种通信的模式:

  1. 有连接(JDBC就属于‘有连接’),可以通俗理解为需要先拨号
  2. 无连接
  • 此时需要创建连接,注意一定是第第三个 java.sql

 

package org.example.demo;

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

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class Demo {
    public static void main(String[] args) throws SQLException {

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

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

        //此时需要抛出异常,抛出SQLException异常
        //这一步写错有很多原因,
        //数据库服务器没有正确启动
        //url写错了,用户名写错了,密码写错了,网络断开了()等等
    }
}
  • 按照表的结构构造两个参数

        Scanner scanner = new Scanner(System.in);
        // 3. 能够构造一个操作数据库的 sql 语句.
        System.out.println("请输入id: ");
        int id = scanner.nextInt();
        System.out.println("请输入name: ");
        String name = scanner.next();
  • 此时创建一个预编译对象

 一个字符串SQL发送到数据库服务器上,是要先对sql进行解析,进行各种校验(判断sql是否符合语法要求等才能执行),这个解析操作也是需要花费一定开销的,虽然开销不是很大,但是MySQL服务器需要同时给多个客户端提供服务,将结果解析在客户端完成,此时把解析的结果发送给服务器,服务器直接执行即可

        // String sql = "insert into test values(" + id + ", '" + name + "')";
        String sql = "insert into JDBC values(?, ?)";//可以把这个理解为通配符
        //这是一个带有"预编译"功能的语句对象
        //此时这里进行编译工作,IDEA相当于是客户端
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, id);
        preparedStatement.setString(2, name);
  • 将MySQL客户端中的 XX rows affected (0.00sec),只是要将得到的结果返回给服务器

        // 4. 执行 sql, 把刚才解析好的语句发给数据库服务器了.
        //    返回值是一个 int 类型, 表示这个操作影响了几行数据.
        int n = preparedStatement.executeUpdate();
        System.out.println("n = " + n);
  • 将资源释放

··      // 5. 执行完毕, 有收尾操作. 释放前面创建的各种资源.
        //    主要是释放 语句对象 和 连接对象. DataSource 是不必释放的.
        preparedStatement.close();
        connection.close();
        scanner.close();
        //此时需要保证先断开预编译对象,在释放连接

总结:

  • DataSource:数据源
  • Connection:连接对象
  • PreparedStatement:预编译对象

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 21:12:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 21:12:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 21:12:02       58 阅读
  4. Python语言-面向对象

    2024-07-17 21:12:02       69 阅读

热门阅读

  1. 构建新纪元:Gradle中Kotlin插件的配置全指南

    2024-07-17 21:12:02       22 阅读
  2. 软设之命令模式

    2024-07-17 21:12:02       21 阅读
  3. Linux系统中调试蓝牙的常用命令

    2024-07-17 21:12:02       19 阅读
  4. C++中调用Pytorch模型

    2024-07-17 21:12:02       18 阅读
  5. 若依自定义文件上传下载

    2024-07-17 21:12:02       17 阅读
  6. 蓝牙芯片智能秤解决方案

    2024-07-17 21:12:02       19 阅读
  7. 深度解析:《聚类算法研究》综述论文精粹

    2024-07-17 21:12:02       20 阅读
  8. 全网 最强 最全 Linux 命令总结

    2024-07-17 21:12:02       16 阅读
  9. E.Checksum(东北四省联赛ccpc)

    2024-07-17 21:12:02       22 阅读