MySQL初阶学习日记(8)--- JDBC

这篇会写得比较粗糙,但基本操作会讲到(*^-^*)

1.JDBC编程的前置准备

1.1 jdbc的简单介绍

JDBC --java针对不同数据库上的API不同给出的一个解决方案

JDBC本质上是Java标准库提供的一套类/方法,通过这组类/方法,把数据库C的原生API 进行封装,转换成Java版本的,同时也对不同数据库厂商的API进行了风格的统一

1.2 数据库的驱动程序的下载

1)通过 maven 仓库下载

maven仓库可以简单理解为是一个应用商店

这个jar包当然也可以通过其他方式进行下载,其他方式这里就不介绍了

2)在项目中创建一个目录(名字可以随便起,这里叫lib),把这个jar包复制进去

3)让项目能够识别到这个lib

2.JDBC编程

2.1 过程

1)创建数据源(DataSource)对象

设置属性:

正确调用方法设置属性的格式:

还有一种写法,如果不进行转型也是可以的,但有观点认为使用转型可以降低代码的**耦合性,**我们大概率都使用第一种写法

设置属性参数:

这里面的Url是一个字符串,作用于标识一个网络上的唯一资源地址,下面的Url可以不用背,只需要存一个地方,你需要用的时候能找到就可以了

上述所有的setURL()方法更正为setUrl()

2)和数据库服务器进行通信,建立网络连接

3)构造SQL语句

4)执行SQL(把SQL处理后的中间结果发给服务器)

5)资源的释放(关闭连接)

通常情况下,在Java中的内存资源不需要手动释放,Java内置了**" 垃圾回收机制 "** 可以自动回收内存资源,但是这个机制并不是万能的,在有些情况例外,和数据库交互时,此时申请的资源不仅仅是内存的资源,还包括一些和网络通信相关的资源,所以我们还是通过**close()**释放比较好

这里还有一个关注点,这两个的释放先后顺序问题,我们应该遵循先申请 的资源,后释放的规则

6)运行

修改完后,我们尝试进行执行,执行成功后,返回结果我们影响了一行

我们可以返回Navicat中查看结果

我们不难发现,我们想要其他操作,就要修改一次代码,重新编译,但在现实生活中,我们更希望由用户来输入他们想要的修改操作

7)优化修改操作

虽然这个代码能解决一些问题,但在字符串拼接部分,我们不难发现,这个代码非常的繁琐,有各种的引号,使用起来非常不方便,为此我们引入了preparedStatement的占位符来帮我们解决这个问题

代码示例:

sql 复制代码
import com.mysql.cj.jdbc.MysqlDataSource;

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

public class JdbcDeom1 {
    public static void main(String[] args) throws SQLException {
        Scanner scanner = new Scanner(System.in);

        //1,创建数据源(DataSource)对象
        DataSource dataSource = new MysqlDataSource();
        //设置三个属性

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

        //2.和数据库服务器进行通信,建立网络连接
        Connection connection = dataSource.getConnection();

        //3.构造SQL语句
        System.out.println("请输入要插入的 id:");
        int id = scanner.nextInt();
        System.out.println("请输入要插入的 name:");
        String name = scanner.next();
        String sql = "insert into student values(?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1,id);
        preparedStatement.setString(2,name);

        //4.执行SQL(把SQL处理后的中间结果发给服务器)
        //通过.executeUpdate();进行增、删、改、建表、删表
        //preparedStatement.executeUpdate();
        //而它的返回结果是当前操作影响到的行数
        int n = preparedStatement.executeUpdate();
        System.out.println("n = " + n);

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

2.2 查找

我们刚刚写的代码是有关于增、删、改的,现在我们来写一下查找的代码,和之前的有一点点的不一样,但基本步骤还是一样的

略有不同的是执行SQL,查询我们使用到的是executeQuery() ,此时这个方法返回的是一个resultSet()结果集,想要查询到临时表,我们就需要遍历这个结果集

这里还要注意,需要多关闭一个结果集

代码示例:

sql 复制代码
import com.mysql.cj.jdbc.MysqlDataSource;

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

public class JdbcDemo2 {
    public static void main(String[] args) throws SQLException {
        //1.创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java117?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("javawxl");

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

        //3.构造SQL
        String sql = "select*from student";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //4.执行SQL,返回结果是一个对象,结果集(ResultSet)
        ResultSet resultSet = preparedStatement.executeQuery();

        while (resultSet.next()) {
            //针对一行进行处理
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println(id + " " + name);
        }

        //5.关闭连接和相关资源
        resultSet.close();
        preparedStatement.close();
        connection.close();

    }
}

3.一些补充知识点

3.1 不是所有的数据库都是客户端服务器结构

以下是几种常见的数据库架构模式:

  1. ‌客户端-服务器架构(Client-Server) ‌

    这是最常见的数据库架构,如MySQL、Oracle等。客户端应用程序通过网络请求数据,服务器处理请求并返回结果

  2. ‌嵌入式数据库(Embedded Database) ‌

    数据库直接嵌入应用程序中运行,如SQLite。适用于桌面应用或小型系统,无需独立服务器

  3. ‌分布式数据库(Distributed Database) ‌

    数据分散存储在多台服务器上,通过网络协同工作。如Hadoop、Cassandra

  4. ‌NoSQL数据库 ‌

    包括键值存储(如Redis)、文档存储(如MongoDB)、列式存储(如HBase)等,架构灵活多样

  5. ‌云数据库(Cloud Database) ‌

    数据存储在云端,如AWS RDS、Azure SQL。客户端通过API访问

  6. ‌对等网络数据库(Peer-to-Peer) ‌

    所有节点既是客户端也是服务器,如BitTorrent。适用于去中心化应用

每种架构适用于不同场景,选择需根据应用需求、性能要求和扩展性来决定

3.2 向上转型和向下转型

向上转型(Upcasting )和向下转型(Downcasting)是面向对象编程中的关键概念,主要涉及继承关系中的类型转换

3.2.1 向上转型(Upcasting)

定义‌:将子类对象赋值给父类引用变量,即从子类型转换为父类型
特点‌:

  • 安全‌:总是安全的,因为子类对象包含父类的所有属性和方法
  • 隐式‌:自动进行,无需显式转换操作符
  • 用途‌:实现多态性,通过父类引用调用子类方法
3.2.2 向下转型(Downcasting)

定义‌:将父类引用转换为子类引用,即从父类型转换为子类型
特点‌:

  • 风险‌:可能抛出ClassCastException,需确保对象实际类型匹配
  • 显式‌:需要使用 ( 子类类型 ) 父类引用 语法
  • 用途‌:访问子类特有的属性和方法
3.2.3注意事项
  • 类型检查‌:向下转型前必须使用 instanceof 检查类型,避免异常
  • 性能影响‌:向下转型可能增加运行时开销,但现代JVM优化有限
  • 设计原则‌:优先使用向上转型实现多态,减少向下转型的使用

通过理解这两者,可以更好地管理对象类型转换,避免运行时错误

3.3 Java的 " 垃圾回收机制 "

Java的垃圾回收机制**(GC)**是自动管理内存的,帮你省去手动释放内存的麻烦,避免内存泄漏和溢出问题。简单来说,它会自动清理不再使用的对象,释放内存空间

核心概念‌

  • ‌可达性分析‌:从"GC Roots"(如静态变量、栈帧引用等)出发,通过引用链判断对象是否可达。不可达对象被视为垃圾

  • ‌分代收集‌:将堆内存划分为新生代(Eden + Survivor)和老年代,根据对象生命周期采用不同算法优化回收效率

加油加油!!( ̄︶ ̄)↗ 

相关推荐
高级程序源2 小时前
django校园寻物通失物招领平台32261-计算机课程设计、毕业设计
vue.js·python·mysql·小程序·django·flask·课程设计
KIDULT°3 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
我不是程序员三三3 小时前
透明加密软件偶发解密异常排错实录:文件时能打开时乱码
数据库·域智盾
snhna3 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
天行健,君子而铎3 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
别动我齐刘海4 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
牛战士coding4 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
志尊宝4 小时前
Vue3 零基础每日笔记(071):暗黑模式与主题切换——CSS 变量 + Element Plus 暗黑方案
前端·css·笔记·vue·html·前端开发·软件开发
goehou5 小时前
MCP 查数实战:让 LLM 安全地查数据库(只读账号、SQL 校验、参数漂移)
数据库·ai·llm·教程·mcp·function calling
code2cat5 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程