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)和老年代,根据对象生命周期采用不同算法优化回收效率

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

相关推荐
落羽凉笙1 小时前
Python学习笔记(3)|数据类型、变量与运算符:夯实基础,从入门到避坑(附图解+代码)
笔记·python·学习
Quintus五等升1 小时前
深度学习①|线性回归的实现
人工智能·python·深度学习·学习·机器学习·回归·线性回归
哈里谢顿1 小时前
MySQL 索引失效的 12 宗罪:一条 SQL 是怎样把索引踢出执行计划的?
mysql
@淡 定1 小时前
Redis热点Key独立集群实现方案
数据库·redis·缓存
野生的码农1 小时前
码农的妇产科实习记录
android·java·人工智能
laocooon5238578862 小时前
mysql,100个题目。
数据库·sql·mysql
Web极客码2 小时前
如何在Ubuntu服务器上安装和配置BIND9
服务器·数据库·ubuntu
W001hhh2 小时前
数据库实训Day004上午
数据库
jz_ddk2 小时前
[学习] 卫星导航的码相位与载波相位计算
学习·算法·gps·gnss·北斗
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 高校人才培养方案管理系统的设计与实现为例,包含答辩的问题和答案
java