JavaSE基础知识分享(十一)

news/2024/11/13 15:13:31/文章来源:https://www.cnblogs.com/cjybigdatablog/p/18370074

写在前面

今天继续讲Java连接MySQL数据库和Java中的对象流(序列化与反序列化)的知识!

Java 与 MySQL 连接

要使用 Java 操作 MySQL 数据库,我们需要通过 JDBC(Java Database Connectivity)进行连接。JDK 本身不提供对具体数据库的操作能力,因此需要使用数据库提供的驱动包来实现。

JDBC 编程 6 步

  1. 注册驱动
    告诉 Java 程序即将连接的数据库类型。

    Class.forName("com.mysql.cj.jdbc.Driver");
    
  2. 获取连接
    打开 JVM 进程和数据库进程之间的通道。

    Connection conn = DriverManager.getConnection("jdbc:mysql://主机的IP地址:3306/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false","root", "123456");
    
  3. 获取数据库操作对象
    创建用于执行 SQL 语句的对象。

    Statement state = conn.createStatement();
    

    注意:进行查询操作时,推荐使用 PreparedStatement,以防止 SQL 注入。

    PreparedStatement ps = conn.prepareStatement("UPDATE user SET password=? WHERE username=?");
    
  4. 执行 SQL 语句

    • executeQuery: 用于查询(DQL)。
    • executeUpdate: 用于增删改(DML)。
    // 执行查询
    ResultSet resultSet = state.executeQuery("SELECT * FROM tableName");// 执行更新
    int rowsAffected = state.executeUpdate("UPDATE tableName SET column=value WHERE condition");
    
  5. 处理查询结果集

    • 仅在执行查询语句(SELECT)时需要处理。
    while (resultSet.next()) {// 获取每列的值int eno = resultSet.getInt("eno");
    }
    
  6. 释放资源
    使用完资源后关闭连接。

    state.close();
    conn.close();
    

MySQL Connector/J 版本对比

  • MySQL Connector/J 5.1

    • 支持 Java 5 及以上版本。
    • 支持 MySQL 5.6、5.7 和 8.0。
    • 支持 JDBC 3.0、4.0、4.1 和 4.2。
    • Driver 实现类:com.mysql.jdbc.Driver.
  • MySQL Connector/J 8.0

    • 支持 Java 8 及以上版本。
    • 支持 MySQL 5.6、5.7 和 8.0。
    • 支持 JDBC 4.2。
    • Driver 实现类:com.mysql.cj.jdbc.Driver.

对象流

序列化与反序列化

序列化流

  • 序列化:将对象转换为可以通过网络传输的字节流。

    • 对象输出流:ObjectOutputStream
  • 反序列化:将字节流还原为对象。

    • 对象输入流:ObjectInputStream

示例代码

读取对象

ObjectInputStream ois = new ObjectInputStream(new FileInputStream("和输出文件路径一样的路径,编码不一样也会出现不能反序列化"));
Object o = ois.readObject(); // 例如 new Student("魏一民", 18);
Student student = (Student) o;
System.out.println(student);

写入对象

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("输入文件路径"));
Student s1 = new Student("魏一民", 18, "安徽合肥", "110");
oos.writeObject(s1);
oos.flush(); // 确保数据写入文件

序列化操作问题

  • 为什么要实现序列化?

    • 持久化:将对象状态保存到磁盘或数据库中,以便后续恢复。
    • 通信:在网络中将对象通过字节流发送到远程计算机。
    • 深度复制:通过序列化和反序列化实现对象的深度复制。
  • 如何实现序列化?

    • 类必须实现 java.io.Serializable 接口。这个接口是一个标记接口,没有方法需要实现。
    import java.io.Serializable;public class MyClass implements Serializable {private static final long serialVersionUID = 1L; // 推荐使用private String name;private int age;// Getter 和 Setter 方法
    }
    
    • serialVersionUID:用于版本控制,确保序列化和反序列化时的类版本一致。
  • 使用 transient 关键字声明不需要序列化的成员变量

    import java.io.Serializable;public class MyClass implements Serializable {private static final long serialVersionUID = 1L;private String name;private transient int age; // 不会被序列化// Getter 和 Setter 方法
    }
    
  • 序列化数据后,再次修改类文件,如何解决问题?

    • 版本控制:使用 serialVersionUID 来控制版本匹配,确保序列化和反序列化的类版本一致。
    • 自定义 readObjectwriteObject 方法:处理类的版本变化。
    • transient 关键字:标记不需要序列化的字段,避免因字段缺失导致问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/784451.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

py2puml 是一个用于将 Python 代码转换为 PlantUML 图的工具,python代码生成py2puml案例

py2puml 是一个用于将 Python 代码转换为 PlantUML 图的工具,但它可能不是广泛认知或广泛使用的库,因为存在多个类似名称的工具和库,且它们的功能和用法可能有所不同。不过,基于你的需求,我将提供一个假设性的例子,说明如何使用一个假想的 py2puml 库来生成 Python 代码的…

Jumpserver 忘记admin(超级管理员)登录密码——解决方式

1. 登录失败 由于各种原因导致多次尝试密码登录失败:2. 解决办法 2.1 查看docker运行的进程 [root@jumpserver01 ~]$ docker ps2.2 进入jumpserver01 这个容器,进行修改账户密码 [root@jumpserver01 ~]$ docker exec -it jumpserver01 /bin/bash# 如果没有按装django 需执行下…

Python、R用RFM模型、机器学习对在线教育用户行为可视化分析|附数据、代码

全文链接:https://tecdat.cn/?p=37409 原文出处:拓端数据部落公众号 分析师:Chunni Wu 随着互联网的不断发展,各领域公司都在拓展互联网获客渠道,为新型互联网产品吸引新鲜活跃用户,刺激用户提高购买力,从而进一步促进企业提升综合实力和品牌影响力。然而,为了更好地了…

有题

今天又有谁要女装,快我可以赞助

制造业生产管理流程图

制造业生产管理流程图

NSSCTF [SWPUCTF 2021 新生赛]crypto8

NSSCTF [SWPUCTF 2021 新生赛]crypto8开启环境,什么东西?只有一个文件???那就先下载下来看看73E-30U1&>V-H965S95]I<U]P;W=E<GT`这样一串字符,没有网页,只有文件,那肯定是用某种加密方式加密之后的结果。但是这个形式的加密是真没见过,才疏学浅,只能先上…

Element Plus 应用和router应用

1.Element Plus 折叠按钮的应用 el-menu组件为最初框架 el-menu-item 子框架 按钮键 el-sub-menu 折叠按钮 .el-menu--horizontal > .el-menu-item:nth-child(7) { margin-right:auto; } 位置样式 const activeIndex = ref(1)使用索引 main.js中引用全局 ElementPlus 引用…

数据结构-队列 c语言使用链表和数组分别实现

基于链表和数组两种方法实现的队列 C语言队列 定义 队列(queue)是一种遵循先入后到规则的线性数据结构,将队列头部称为“队首”,尾部称为“队尾”,把元素加入队尾称为“入队”,删除队首元素称为“出队”。队列实现 基于链表的实现 将链表的头节点和尾结点分别视为“队首”和…

liunx下安装Nginx

Linux下nginx的安装以及环境配置https://blog.csdn.net/qq_42815754/article/details/82980326第一步:下载nginx压缩包 在这里可以去nginx官网下载 https://nginx.org/en/download.html 也可以直接使用wget命令下载,指令如下所示(请根据自己的需求进行下载):建议选择官网发…

StringGrid单元格绑定ComboBox、DateTimePicker或窗口传值

一、初始化控件状态procedure TForm7.FormCreate(Sender: TObject); beginwith StringGrid1 dobeginColWidths[0] := 15;Cells[1, 0] := Combobox;ColWidths[1] := 100;Cells[2, 0] := DateTimePicker;ColWidths[2] := 100;Cells[3, 0] := Form;ColWidths[3] := 100;end;ComboB…

鸿蒙Next-支付宝SDK接入教程

App适配鸿蒙Next,开始做支付功能了,目前来说只有支付宝支持鸿蒙Next,微信还没上架,但是支付宝官方的文档跟Demo都很老,下载官方的Demo用最新版的DevEco-Studio导入都不成功。 后面在OpenHarmony三方库中心仓找到了最新的代码:https://ohpm.openharmony.cn/#/cn/detail/@c…

java 11

输出二维数组: public class erwei{ public static void main(String[] args){ int [][]arr={{0,0,0,0,0,0}, {,0,0,1,0,0,0}, {0,2,0,0,3,0}, {0,0,0,0,0,0}}; for(int i=0;i<arr.length;i++){ for (int j=0;j<arr[i].length ;j++ ) { System.out.print(arr[i][j]+&quo…