当前位置: 首页 > article >正文

【MySQL】JDBC编程

在这里插入图片描述

  • 👑专栏内容:MySQL
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:前路未远,步履不停

目录

  • 一、JDBC工作原理
  • 二、JDBC 使用
    • 1、准备工作
    • 2、使用实例
    • 3、手动输入


一、JDBC工作原理

JDBC是Java语言中用于与数据库进行交互的一组API(应用程序接口)。JDBC允许Java应用程序通过标准的SQL语句访问数据库,并处理查询、更新和管理数据库中的数据。JDBC提供了一种统一的方式,使Java应用程序能够与各种不同类型的数据库进行通信,而不需要针对每个数据库系统编写特定的代码。

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

二、JDBC 使用

1、准备工作

可以在中央仓库下载数据库驱动包:https://mvnrepository.com/
下载数据库驱动包,并添加到项目的依赖中: 在项目中创建文件夹lib,并将依赖包mysql-connector-java-5.1.47.jar复制到lib中。
image.png
再配置该jar包到本项目的依赖中:右键点击项目添加为库,将该lib文件夹配置进依赖中,表示该文件夹下的jar包都引入作为依赖。
image.png

2、使用实例

public class demo1 {
    public static void main(String[] args) throws SQLException {
        //1.创建一个数据源
        DataSource dataSource = new MysqlDataSource();
        //2.设置数据源的属性,为连接数据库做准备
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:3306/java108?user=root&password=11111&useUnicode=true&characterEncoding=UTF-8");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("11111");
        //3.和数据库建立连接
        Connection connection = dataSource.getConnection();
        //4.拼装sql语句
        String sql = "insert into student values(1,'张三')";
        PreparedStatement statement = connection.prepareStatement(sql);
        //5.执行sql语句,返回值是这次操作影响了几行
        int ret = statement.executeUpdate();
        System.out.println("影响了"+ret+"行");
        //6.关闭释放资源
        statement.close();
        connection.close();
    }
}
  1. 创建一个数据源
DataSource dataSource = new MysqlDataSource();

这里面 DataSource是 JDBC 的 interface
MysqlDataSourceMySQL 驱动包中提供的类,这个类就实现了 DataSource interface。同时,这个代码也是一个非常常见的向上转型操作。

  1. 设置数据源的属性,为连接数据库做准备
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("11111");

向下转型又回来了,目的是为了使用 setUrl 方法,因为是这个方法是子类才有的。
为什么不直接 dataSource.setUrl();因为,按照转型的写法,可以让 MysqlDataSource这个类不要扩散到代码的其他部分,目的是降低MySQL 的驱动包和其他代码之间的耦合关系,避免后续更换数据库导致成本太高。
setURL为设置MySQL数据连接的URL参数格式: jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值
setUsersetPassword分别为设置用户名和密码。

  1. 和数据库建立连接
Connection connection = dataSource.getConnection();
  1. 拼装 sql 语句
String sql = "insert into student values(1,'张三')";
PreparedStatement statement = connection.prepareStatement(sql);

SQL 语句本身是 String 类型的,但是 JDBC 提供了 Statement 对象,让我们把 String 转化为 Statement 再发给服务器执行。但是,我们一般使用 PreparedStatement来代替 Statement
Statement是把 SQL 原封不动的转发给数据库服务器,数据库服务器负责自己解析 SQL,而 PreparedStatement会先在客户端这边初步解析一下 SQL 语句。

  1. 执行sql语句,返回值是这次操作影响了几行
int ret = statement.executeUpdate();
System.out.println("影响了"+ret+"行");

executeUpdate() 方法通常用于执行更新数据库的操作,例如插入、更新或删除数据,这个操作的返回值是影响的行数。
executeQuery() 方法通常用于读取数据库的操作。这个方法返回一个 ResultSet 对象,其中包含查询结果的数据。
下面是一个查询操作的写法:

public class demo2 {
    //查询操作基本写法
    public static void main(String[] args) throws SQLException {
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("11111");
        Connection connection = dataSource.getConnection();
        String sql = "select * from student";
        PreparedStatement statement = connection.prepareStatement(sql);
        //执行查询操作,要是有executeQuery,返回值是一个ResultSet类型的对象
        ResultSet resultSet = statement.executeQuery();
        //遍历结果集合
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println("id:"+id+"   "+"name:"+name);
        }
    }
}
  1. 关闭释放资源
statement.close();
connection.close();

创建的语句对象和连接对象,都会持有一些计算机硬件/软件上的资源,这些资源不用了就应该及时释放。Java 虽然有垃圾回收机制,自动释放内存,但是计算机资源不仅仅是内存。这些其他资源也是需要手动释放的。
这里也需要注意一下关闭顺序,一般整体原则是:先创建的对象后关闭,后创建的先关闭

3、手动输入

上面的代码能执行 SQL 语句,但是有一个最重要的问题就是,代码是写死的。我们想要用户通过控制台来输入。
将上面的插入内容改成 ?,这是一个占位符,后续 PreparedStatement会把变量的数值带入到 ?中。

String sql = "insert into student values(?,?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);

http://www.kler.cn/a/145362.html

相关文章:

  • Go反射指南
  • doris:异常数据处理
  • 17.Word:李楠-学术期刊❗【29】
  • (done) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)
  • 安全漏洞扫描与修复系统的高质量技术详解
  • doris:HLL
  • 【JVM系列】- 穿插·对象的实例化与直接内存
  • spring boot整合Jasypt实现配置加密
  • tidyverse数据特征学习
  • 斐波那契数(力扣LeetCode)动态规划
  • 超声波雪深传感器冬季里的科技魔法
  • 3、Qt使用windeploy工具打包可执行文件
  • 复数及其代数运算
  • itop4412移植lrzsz工具踩坑笔记
  • 【Java】实现一个自己的定时器
  • Ansible的错误处理
  • JVM虚拟机:G1垃圾回收器的日志分析
  • C++中声明友元
  • 90. 打家劫舍II (房子围成一圈)
  • 【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令
  • linux shell操作 - 05 进程 与 IO 模型
  • vue--The template root requires exactly one element.的解决办法
  • RT-DETR 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU
  • 【LeetCode】挑战100天 Day17(热题+面试经典150题)
  • 第四题-abb 【第六届传智杯程序设计挑战赛解题分析详解复盘】(JavaPythonC++实现)
  • 【数据结构实验】排序(一)冒泡排序改进算法 Bubble及其性能分析