JavaSE基础知识分享(十一)

打印 上一主题 下一主题

主题 918|帖子 918|积分 2754

写在前面

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

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


  • 注册驱动
    告诉 Java 程序即将连接的数据库类型。
    1. Class.forName("com.mysql.cj.jdbc.Driver");
    复制代码
  • 获取连接
    打开 JVM 历程和数据库历程之间的通道。
    1. Connection conn = DriverManager.getConnection(
    2.     "jdbc:mysql://主机的IP地址:3306/数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false",
    3.     "root", "123456");
    复制代码
  • 获取数据库操尴尬刁难象
    创建用于实行 SQL 语句的对象。
    1. Statement state = conn.createStatement();
    复制代码
    注意:举行查询操作时,推荐使用 PreparedStatement,以防止 SQL 注入。
    1. PreparedStatement ps = conn.prepareStatement(
    2.     "UPDATE user SET password=? WHERE username=?");
    复制代码
  • 实行 SQL 语句

    • executeQuery: 用于查询(DQL)。
    • executeUpdate: 用于增删改(DML)。
    1. // 执行查询
    2. ResultSet resultSet = state.executeQuery("SELECT * FROM tableName");
    3. // 执行更新
    4. int rowsAffected = state.executeUpdate("UPDATE tableName SET column=value WHERE condition");
    复制代码
  • 处置惩罚查询结果集

    • 仅在实行查询语句(SELECT)时需要处置惩罚。
    1. while (resultSet.next()) {
    2.     // 获取每列的值
    3.     int eno = resultSet.getInt("eno");
    4. }
    复制代码
  • 释放资源
    使用完资源后关闭连接。
    1. state.close();
    2. 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.

Properties 集合

Properties 类用于封装和管理与 MySQL 连接相关的参数配置。
Properties 概述

Properties 类是 Map 集合的一个特殊实现,主要用于处置惩罚键值对形式的配置数据。它提供了对配置文件的读取和写入功能。
Properties 的特殊功能


  • 设置属性
    1. public Object setProperty(String key, String value);
    复制代码
    用于将指定的键值对添加到 Properties 集合中。
  • 获取属性
    1. public String getProperty(String key);
    复制代码
    根据键获取对应的值。
  • 获取所有键名
    1. public Set<String> stringPropertyNames();
    复制代码
    获取所有的键名集合。
Properties 和 IO 流的结合使用


  • 加载属性
    1. public void load(Reader reader);
    复制代码
    从指定的 Reader 中读取属性列表(键值对)。
  • 存储属性
    1. public void store(Writer writer, String comments);
    复制代码
    将属性列表(键值对)写入到指定的 Writer 中,带有注释。
使用示例


  • 创建 Properties 类对象
    1. Properties properties = new Properties();
    复制代码
  • 指定要读取的配置文件
    1. properties.load(new BufferedReader(new FileReader("路径/info.properties")));
    复制代码
  • 获取配置项
    1. String url = properties.getProperty("url");
    2. String username = properties.getProperty("user");
    3. String password = properties.getProperty("password");
    复制代码
  • 使用获取的参数建立数据库连接
    1. Connection conn = MysqlTool.getConnection(url, username, password);
    2. System.out.println("成功获取与数据库的链接对象:" + conn);
    复制代码
示例配置文件 (info.properties)
  1. password=123456
  2. user=root
  3. url=jdbc:mysql://主机的IP地址:3306/具体数据库名?useUnicode=true&characterEncoding=utf-8&useSSL=false
复制代码
序列化与反序列化

序列化流


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

    • 对象输出流:ObjectOutputStream

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

    • 对象输入流:ObjectInputStream

示例代码

读取对象
  1. ObjectInputStream ois = new ObjectInputStream(new FileInputStream("和输出文件路径一样的路径,编码不一样也会出现不能反序列化"));
  2. Object o = ois.readObject(); // 例如 new Student("魏一民", 18);
  3. Student student = (Student) o;
  4. System.out.println(student);
复制代码
写入对象
  1. ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("输入文件路径"));
  2. Student s1 = new Student("魏一民", 18, "安徽合肥", "110");
  3. oos.writeObject(s1);
  4. oos.flush(); // 确保数据写入文件
复制代码
序列化操作题目


  • 为什么要实现序列化?

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

  • 怎样实现序列化?

    • 类必须实现 java.io.Serializable 接口。这个接口是一个标记接口,没有方法需要实现。
    1. import java.io.Serializable;
    2. public class MyClass implements Serializable {
    3.     private static final long serialVersionUID = 1L; // 推荐使用
    4.     private String name;
    5.     private int age;
    6.     // Getter 和 Setter 方法
    7. }
    复制代码

    • serialVersionUID:用于版本控制,确保序列化和反序列化时的类版本一致。

  • 使用 transient 关键字声明不需要序列化的成员变量
    1. import java.io.Serializable;
    2. public class MyClass implements Serializable {
    3.     private static final long serialVersionUID = 1L;
    4.     private String name;
    5.     private transient int age; // 不会被序列化
    6.     // Getter 和 Setter 方法
    7. }
    复制代码
  • 序列化数据后,再次修改类文件,怎样办理题目?

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表