实验三 JDBC数据库操作编程(设计性)

news2024/11/14 12:20:40
实验  JDBC数据库操作编程(设计性)
  1. 实验目的
    1. 掌握JDBC的数据库编程方法
    2. 掌握采用JDBC完成数据库链接、增删改查,以及操作封装的综合应用。
  2. 实验要求
    1. 本实验要求每个同学单独完成;
    2. 调试程序要记录调试过程中出现的问题及解决办法,并写入到实验总结和心得;
    3. 完成实验后直接在题目后面按要求给出本实验的实验报告。
  3. 实验设备、环境

奔腾以上计算机,装有Myeclipse 6.0以上

  1. 实验内容
    1. 用JDBC完成数据操作层的封装,具体要求如下:
    1. 封装数据库连接
    2. 把数据库的增删改查封装成方法
    3. 完成一个基于自己实现方法的数据库带参数查询实例,要求查询参数不得少于3个,同时返回类型必须为一个具体的对象类型
    4. 查询所有信息,封装返回具体列表对象
    5. 自己建立数据库
    6. 图片信息的直接保存和读取。

根据以上要求,设计一个学生管理系统的数据库操作层StudentDao,系统可以有学生表student。

把程序运行界面截图贴在这里,源码贴到附录部分

    1. 使用4.1完成的StudentDao,完成学生管理系统的增、删、改、查的场景(可以用System.out.print在MyEclipse的 Console完成)

把程序运行界面截图贴在这里,源码贴到附录部分

  1. 设计一个学生选课系统的数据库操作层CourseSelectionDao,系统可以有学生表student、课程表course和成绩表score,可以实现:
  2. save(Student s, Course c); //一个学生选了一门课程
  3. save(Student s, List<Course> courses); //一个学生选了多门课程
  4. save(List<Student> students, Course c);//多个学生都选了同一门课程

把程序运行界面截图贴在这里,源码贴到附录部分

  1. 实验总结与心得请详细叙述你通过该实验掌握的知识点和心得,比如对错误的解决办法等)

  在实验过程中遇到了连接不到sqlserve的问题:com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: no further information。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连接,还要确保防火墙没有阻止到此端口的 TCP 连接。”。
at mssql.jdbc@12.8.1.jre8/com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:242)
at

打开这个配置管理器

把这个TCP/IP启动就好了

接着又遇到这个问题:com.microsoft.sqlserver.jdbc.SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertificate”属性设置为“false”,但驱动程序无法使用安全套接字层 (SSL) 加密与 SQL Server 建立安全连接:错误:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。 ClientConnectionId:235f4c8c-84dd-41c5-9e44-f39b34dca841
at mssql.jdbc@12.8.1.jre8/com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:4271)
at mssql.jdbc@12.8.1.jre8/com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1965)
at

private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=StudentDB_New;encrypt=false";

在引入URL时加上encrypt=false就解决问题了

INSERT 语句与 FOREIGN KEY 约束"FK__score__course_id__70DDC3D8"冲突。该冲突发生于数据库"StudentDB",表"dbo.course", column 'id'

新建了一个数据库与之前的StudentDB数据库分开,重新创建多张表并插入数据,最终解决问题

这个实验做完,通过实际操作,我对 SQL 语言有了更深入的理解,特别是在数据插入和查询方面。学习如何使用 INSERT、SELECT、DELETE 等基本 SQL 语句。在实验中,我意识到数据的完整性和一致性是非常重要的。在插入数据之前,我们需要确保没有重复的主键,这样才能避免违反约束条件。在实验过程中,我遇到了一些错误,比如主键冲突和 SQL 语法错误。通过仔细阅读错误信息和调试代码,翻阅网上资料,我学会了如何快速定位问题并进行修复。

  1. 源码附录

4.1

封装数据库连接代码:

package com.studentmanagement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class DBUtil {

    private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=StudentDB;encrypt=false";

    private static final String USER = "sa"; // 替换为你的数据库用户名

    private static final String PASSWORD = "123456"; // 替换为你的数据库密码

    public static Connection getConnection() {

        Connection conn = null;

        try {

            conn = DriverManager.getConnection(URL, USER, PASSWORD);

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return conn;

    }

    public static void closeConnection(Connection conn) {

        if (conn != null) {

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

数据库的增删改查封装成StudentDao方法

package com.studentmanagement;

import java.sql.*;

import java.util.ArrayList;

import java.util.List;

public class StudentDao {

    public int addStudent(Student student) {

        String sql = "INSERT INTO student (id, name, age, gender, photo) VALUES (?, ?, ?, ?, ?)";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setInt(1, student.getId());

            ps.setString(2, student.getName());

            ps.setInt(3, student.getAge());

            ps.setString(4, student.getGender());

            ps.setBytes(5, student.getPhoto());

            return ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return 0;

    }

    public int deleteStudent(int id) {

        String sql = "DELETE FROM student WHERE id = ?";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setInt(1, id);

            return ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return 0;

    }

    public int updateStudent(Student student) {

        String sql = "UPDATE student SET name = ?, age = ?, gender = ?, photo = ? WHERE id = ?";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setString(1, student.getName());

            ps.setInt(2, student.getAge());

            ps.setString(3, student.getGender());

            ps.setBytes(4, student.getPhoto());

            ps.setInt(5, student.getId());

            return ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return 0;

    }

    public Student findStudentByIdAndNameAndAge(int id, String name, int age) {

        String sql = "SELECT * FROM student WHERE id = ? AND name = ? AND age = ?";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setInt(1, id);

            ps.setString(2, name);

            ps.setInt(3, age);

            try (ResultSet rs = ps.executeQuery()) {

                if (rs.next()) {

                    return new Student(rs.getInt("id"), rs.getString("name"),

                            rs.getInt("age"), rs.getString("gender"), rs.getBytes("photo"));

                }

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return null;

    }

    public List<Student> findAllStudents() {

        List<Student> students = new ArrayList<>();

        String sql = "SELECT * FROM student";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql);

             ResultSet rs = ps.executeQuery()) {

            while (rs.next()) {

                students.add(new Student(rs.getInt("id"), rs.getString("name"),

                        rs.getInt("age"), rs.getString("gender"), rs.getBytes("photo")));

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return students;

    }

    public int saveStudentPhoto(int id, byte[] photo) {

        String sql = "UPDATE student SET photo = ? WHERE id = ?";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setBytes(1, photo);

            ps.setInt(2, id);

            return ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return 0;

    }

    public byte[] getStudentPhoto(int id) {

        String sql = "SELECT photo FROM student WHERE id = ?";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setInt(1, id);

            try (ResultSet rs = ps.executeQuery()) {

                if (rs.next()) {

                    return rs.getBytes("photo");

                }

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return null;

    }

}

一个具体的student学生类,可以创建具体对象,并且有对应的图片信息

package com.studentmanagement;

public class Student {

    private int id;

    private String name;

    private int age;

    private String gender;

    private byte[] photo;

    public Student(int id, String name, int age, String gender, byte[] photo) {

        this.id = id;

        this.name = name;

        this.age = age;

        this.gender = gender;

        this.photo = photo;

    }

    // Getter 和 Setter 方法

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getGender() {

        return gender;

    }

    public void setGender(String gender) {

        this.gender = gender;

    }

    public byte[] getPhoto() {

        return photo;

    }

    public void setPhoto(byte[] photo) {

        this.photo = photo;

    }

}

图片信息的保存和读取:

package com.studentmanagement;

import java.nio.file.Files;

import java.nio.file.Paths;

import java.util.List;

import java.io.IOException;

import java.nio.file.Path;

public class Main {

    public static void main(String[] args) {

        StudentDao studentDao = new StudentDao();

        // 1. 添加学生

        byte[] photo1 = null; // 假设这是学生1的图片

        try {

            photo1 = Files.readAllBytes(Paths.get("src/6458.jpg_wh860.jpg")); // 读取 src 目录下的图片文件

        } catch (Exception e) {

            e.printStackTrace();

        }

        Student student1 = new Student(1, "Alice", 20, "Female", photo1);

        studentDao.addStudent(student1);

        // 2. 保存图片

        int savePhotoResult = studentDao.saveStudentPhoto(1, photo1);

        System.out.println("保存学生 Alice 的图片,结果:" + (savePhotoResult > 0 ? "成功" : "失败"));

        // 3. 读取图片

        byte[] retrievedPhoto = studentDao.getStudentPhoto(1);

        System.out.println("读取学生 Alice 的图片,结果:" + (retrievedPhoto != null ? "成功" : "失败"));

        // 确保目标目录存在

        Path outputPath = Paths.get("src/retrieved_photo.jpg");

        try {

            // 如果父目录不存在,创建它

            if (!Files.exists(outputPath.getParent())) {

                Files.createDirectories(outputPath.getParent());

            }

            Files.write(outputPath, retrievedPhoto); // 保存到 src 目录

            System.out.println("已将读取的图片保存为 retrieved_photo.jpg");

        } catch (IOException e) {

            e.printStackTrace();

        }

        // 4. 查询所有学生信息

        List<Student> allStudents = studentDao.findAllStudents();

        System.out.println("当前所有学生:");

        for (Student student : allStudents) {

            System.out.println("学生 ID: " + student.getId() + ", 姓名: " + student.getName());

        }

    }

}

对于学生的增删查改:

package com.studentmanagement;

import java.nio.file.Files;

import java.nio.file.Paths;

import java.util.List;

public class Main {

public static void main(String[] args) {

        StudentDao studentDao = new StudentDao();

        // 1. 添加学生

        byte[] photo1 = null; // 假设这是学生1的图片

        try {

            photo1 = Files.readAllBytes(Paths.get("src/6458.jpg_wh860.jpg")); // 读取图片文件

        } catch (Exception e) {

            e.printStackTrace();

        }

        Student student1 = new Student(1, "Alice", 20, "Female", photo1);

        studentDao.addStudent(student1);

        // 2. 保存图片

        int savePhotoResult = studentDao.saveStudentPhoto(1, photo1);

        System.out.println("保存学生 Alice 的图片,结果:" + (savePhotoResult > 0 ? "成功" : "失败"));

        // 3. 读取图片

        byte[] retrievedPhoto = studentDao.getStudentPhoto(1);

        System.out.println("读取学生 Alice 的图片,结果:" + (retrievedPhoto != null ? "成功" : "失败"));

        // 可以将 retrievedPhoto 写入文件进行查看

        try {

            Files.write(Paths.get("path/to/retrieved_photo.jpg"), retrievedPhoto); // 保存到文件

            System.out.println("已将读取的图片保存为 retrieved_photo.jpg");

        } catch (Exception e) {

            e.printStackTrace();

        }

        // 4. 查询所有学生信息

        List<Student> allStudents = studentDao.findAllStudents();

        System.out.println("当前所有学生:");

        for (Student student : allStudents) {

            System.out.println("学生 ID: " + student.getId() + ", 姓名: " + student.getName());

        }

    }

}

4.3CourseSelectionDao的实现

Main测试函数

package com.studentmanagement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class Main {

    public static void main(String[] args) {

        String url = "jdbc:sqlserver://localhost:1433;databaseName=StudentDB_New;encrypt=false;user=sa;password=123456";

        

        try (Connection conn = DriverManager.getConnection(url)) {

            // 清理现有数据

            String deleteScoreSQL = "DELETE FROM score";

            String deleteCourseSQL = "DELETE FROM course";

            String deleteStudentSQL = "DELETE FROM student";

            try (PreparedStatement pstmt = conn.prepareStatement(deleteScoreSQL)) {

                pstmt.executeUpdate();

            }

            try (PreparedStatement pstmt = conn.prepareStatement(deleteCourseSQL)) {

                pstmt.executeUpdate();

            }

            try (PreparedStatement pstmt = conn.prepareStatement(deleteStudentSQL)) {

                pstmt.executeUpdate();

            }

            // 插入学生数据

            String insertStudentSQL = "INSERT INTO student (id, name, age, gender) VALUES (?, ?, ?, ?)";

            try (PreparedStatement pstmt = conn.prepareStatement(insertStudentSQL)) {

                pstmt.setInt(1, 1);

                pstmt.setString(2, "Alice");

                pstmt.setInt(3, 20);

                pstmt.setString(4, "Female");

                pstmt.executeUpdate();

                pstmt.setInt(1, 2);

                pstmt.setString(2, "Bob");

                pstmt.setInt(3, 22);

                pstmt.setString(4, "Male");

                pstmt.executeUpdate();

            }

            // 插入课程数据

            String insertCourseSQL = "INSERT INTO course (id, name, credits) VALUES (?, ?, ?)";

            try (PreparedStatement pstmt = conn.prepareStatement(insertCourseSQL)) {

                pstmt.setInt(1, 101);

                pstmt.setString(2, "Mathematics");

                pstmt.setInt(3, 3);

                pstmt.executeUpdate();

                pstmt.setInt(1, 102);

                pstmt.setString(2, "Physics");

                pstmt.setInt(3, 4);

                pstmt.executeUpdate();

            }

            // 插入成绩数据

            String insertScoreSQL = "INSERT INTO score (student_id, course_id) VALUES (?, ?)";

            try (PreparedStatement pstmt = conn.prepareStatement(insertScoreSQL)) {

                pstmt.setInt(1, 1); // Alice

                pstmt.setInt(2, 101); // Mathematics

                pstmt.executeUpdate();

                pstmt.setInt(1, 2); // Bob

                pstmt.setInt(2, 102); // Physics

                pstmt.executeUpdate();

            }

            System.out.println("数据插入成功!");

            // 查询并展示学生数据

            System.out.println("学生数据:");

            String selectStudentSQL = "SELECT * FROM student";

            try (PreparedStatement pstmt = conn.prepareStatement(selectStudentSQL);

                 ResultSet rs = pstmt.executeQuery()) {

                while (rs.next()) {

                    int id = rs.getInt("id");

                    String name = rs.getString("name");

                    int age = rs.getInt("age");

                    String gender = rs.getString("gender");

                    System.out.printf("ID: %d, Name: %s, Age: %d, Gender: %s%n", id, name, age, gender);

                }

            }

            // 查询并展示课程数据

            System.out.println("课程数据:");

            String selectCourseSQL = "SELECT * FROM course";

            try (PreparedStatement pstmt = conn.prepareStatement(selectCourseSQL);

                 ResultSet rs = pstmt.executeQuery()) {

                while (rs.next()) {

                    int id = rs.getInt("id");

                    String name = rs.getString("name");

                    int credits = rs.getInt("credits");

                    System.out.printf("ID: %d, Name: %s, Credits: %d%n", id, name, credits);

                }

            }

            // 查询并展示成绩数据

            System.out.println("成绩数据:");

            String selectScoreSQL = "SELECT * FROM score";

            try (PreparedStatement pstmt = conn.prepareStatement(selectScoreSQL);

                 ResultSet rs = pstmt.executeQuery()) {

                while (rs.next()) {

                    int studentId = rs.getInt("student_id");

                    int courseId = rs.getInt("course_id");

                    System.out.printf("Student ID: %d, Course ID: %d%n", studentId, courseId);

                }

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

定义一个course类

package com.studentmanagement;

public class Course {

    private int id;

    private String name;

    private int credits;

    public Course(int id, String name, int credits) {

        this.id = id;

        this.name = name;

        this.credits = credits;

    }

    // Getter 和 Setter 方法

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getCredits() {

        return credits;

    }

    public void setCredits(int credits) {

        this.credits = credits;

    }

}

核心CourseSelectionDao.java

package com.studentmanagement;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.List;

public class CourseSelectionDao {

    // 保存单个学生选一门课程

    public int save(Student student, Course course) {

        String sql = "INSERT INTO score (student_id, course_id) VALUES (?, ?)";

        try (Connection conn = DBUtil.getConnection();

             PreparedStatement ps = conn.prepareStatement(sql)) {

            ps.setInt(1, student.getId());

            ps.setInt(2, course.getId());

            return ps.executeUpdate();

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return 0;

    }

    // 保存单个学生选多门课程

    public int save(Student student, List<Course> courses) {

        int totalRows = 0;

        for (Course course : courses) {

            totalRows += save(student, course); // 调用上面的save方法

        }

        return totalRows;

    }

    // 保存多个学生选同一门课程

    public int save(List<Student> students, Course course) {

        int totalRows = 0;

        for (Student student : students) {

            totalRows += save(student, course); // 调用上面的save方法

        }

        return totalRows;

    }

}

数据库连接代码封装在类里面

package com.studentmanagement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class DBUtil {

    private static final String URL = "jdbc:sqlserver://localhost:1433;databaseName=StudentDB_New;encrypt=false";

    private static final String USER = "sa"; // 替换为你的数据库用户名

    private static final String PASSWORD = "123456"; // 替换为你的数据库密码

    public static Connection getConnection() {

        Connection conn = null;

        try {

            conn = DriverManager.getConnection(URL, USER, PASSWORD);

        } catch (SQLException e) {

            e.printStackTrace();

        }

        return conn;

    }

    public static void closeConnection(Connection conn) {

        if (conn != null) {

            try {

                conn.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

    }

}

学生student类的创建:

package com.studentmanagement;

public class Student {

    private int id;

    private String name;

    private int age;

    private String gender;

    private byte[] photo;

    public Student(int id, String name, int age, String gender, byte[] photo) {

        this.id = id;

        this.name = name;

        this.age = age;

        this.gender = gender;

        this.photo = photo;

    }

    // Getter 和 Setter 方法

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public String getGender() {

        return gender;

    }

    public void setGender(String gender) {

        this.gender = gender;

    }

    public byte[] getPhoto() {

        return photo;

    }

    public void setPhoto(byte[] photo) {

        this.photo = photo;

    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java期末复习暨学校第二次上机课作业

Java期末复习暨学校第二次上机课作业&#xff1a;了解程序的控制结构&#xff0c;掌握顺序结构程序的设计方法&#xff0c;掌握分支程序设计方法。 第一题&#xff1a; 闰年有两种判断方式&#xff1a; &#xff08;1&#xff09;&#xff1a;能被4整除但不能被100整除 &…

Windows配置NTP时间同步

Windows下实现NTP时间同步 1、Windows时间服务(W32Time)2、Windows 时间同步的工作原理3、配置和管理 Windows 时间同步3.1 命令行工具&#xff1a;w32tm3.2 控制面板中的设置 4. 高级设置&#xff08;Windows Server 环境&#xff09;5.调整时间同步的间隔5.1 通过组策略调整时…

Go八股(Ⅳ)***slice,string,defer***

***slice&#xff0c;string&#xff0c;defer*** 1.slice和arry的区别 arry&#xff1a; Go语言中arry即为数据的一种集合&#xff0c;需要在声明时指定容量和初值&#xff0c;且一旦声明就长度固定&#xff0c;访问时按照索引访问。通过内置函数len可以获取数组中的元素个…

STM32H503开发(2)----STM32CubeProgrammer烧录

STM32H503开发----2.STM32CubeProgrammer烧录 概述硬件准备视频教学样品申请源码下载参考程序自举模式BOOT0设置UART烧录USB烧录 概述 STM32CubeProgrammer (STM32CubeProg) 是一款用于编程STM32产品的全功能多操作系统软件工具。 它提供了一个易用高效的环境&#xff0c;通过…

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver(二)

ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver&#xff08;二&#xff09; 本教程作为gdb/gdbserver编译安装教程的一个补充&#xff0c;教会大家如何使用gdb/gdbserver进行远程调试。 如上图所示&#xff0c;我们需要将编译后的gdbserver上传至目标设备&#xff0c;其上…

架构零散知识点

1 数据库 1.1 数据库范式 有一个学生表&#xff0c;主键是学号&#xff0c;含有学生号、学生名、班级、班级名&#xff0c;违反了数据库第几范式&#xff1f; --非主属性不依赖于主键&#xff0c;不满足第二范式 有一个订单表&#xff0c;包含以下字段&#xff1a;订单ID&…

【时间之外】IT人求职和创业应知【31】

目录 新闻一&#xff1a;2024年“秦创原沣东杯”陕西省科技工作者创新创业大赛颁奖仪式暨沣东新城机器人产业发展大会盛大启幕 新闻二&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 新闻三&#xff1a;“5G工业互联网”融合应用试点城市名单…

移动开发(七):.NET MAUI使用RESTAPI实现查询天气笔记

目录 一、接口准备 二、实体部分 三、页面部分 四、后台代码逻辑 五、总结 在移动开发过程中,第三方对接是非常常见的。今天给大家分享.NET MAUI如何使用REST API实现输入城市名称查询天气的示例,希望对大家学习.NET MAUI可以提供一些帮助! 一、接口准备 首先我们需要…

Javascript中如何实现函数缓存?函数缓存有哪些应用场景?

#一、是什么 函数缓存&#xff0c;就是将函数运算过的结果进行缓存 本质上就是用空间&#xff08;缓存存储&#xff09;换时间&#xff08;计算过程&#xff09; 常用于缓存数据计算结果和缓存对象 解释 const add (a,b) > ab; const calc memoize(add); // 函数缓存…

【网络安全 | 并发问题】Nginx重试机制与幂等性问题分析

未经许可,不得转载。 文章目录 业务背景Nginx的错误重试机制proxy_next_upstream指令配置重试500状态码非幂等请求的重试问题幂等性和非幂等性请求non_idempotent选项的使用解决方案业务背景 在现代互联网应用中,高可用性(HA)是确保系统稳定性的关键要求之一。为了应对服务…

利用游戏引擎的优势

大家好&#xff0c;我是小蜗牛。 在当今快速发展的游戏产业中&#xff0c;选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎&#xff0c;为开发者提供了丰富的工具和资源&#xff0c;使他们能够高效地开发出优秀的游戏。本文将探讨如何…

财务源码 财务软件 SaaS 云财务

&#x1f50d; 专业财务源码&#xff0c;助您快速开展财务管理&#xff01;&#x1f4c8; &#x1f3af; 我们提供一系列高质量、可定制、易于使用的财务源码&#xff0c;帮助您快速搭建强大的财务管理系统。无论是小型企业、中型企业&#xff0c;还是个人用户&#xff0c;我们…

数据流图,学习笔记

目录 一、数据流图的基本元素 外部实体&#xff08;External Entity&#xff09; 加工&#xff08;Process&#xff09; 数据存储&#xff08;Data Store&#xff09; 数据流&#xff08;Data Flow&#xff09; 二、数据流图的层次结构 顶层数据流图 中层数据流图 底层…

docker镜像文件导出导入

1. 导出容器&#xff08;包含内部服务&#xff09;为镜像文件&#xff08;docker commit方法&#xff09; 原理&#xff1a;docker commit命令允许你将一个容器的当前状态保存为一个新的镜像。这个新镜像将包含容器内所有的文件系统更改&#xff0c;包括安装的软件、配置文件等…

Android中桌面小部件framework层使用到的设计模式

在Android中&#xff0c;桌面小部件&#xff08;App Widget&#xff09;的Framework层采用了多种设计模式&#xff0c;以实现模块化、可维护性和高效的交互。 以下是Android桌面小部件Framework层中常用的设计模式及其具体应用&#xff1a; 1. 观察者模式&#xff08;Observe…

7.《双指针篇》---⑦三数之和(中等偏难)

题目传送门 方法一&#xff1a;双指针 1.新建一个顺序表用来返回结果。并排序数组。 2.for循环 i 从第一个数组元素遍历到倒数第三个数。 3.如果遍历过程中有值大于0的则break&#xff1b; 4.定义左右指针,以及target。int left i 1, right n - 1; int target -nums[i];…

DBeaver工具连接Hive

DBeaver工具连接Hive 首先解压安装包dbeaver-ce-latest-x86_64-setup.zip,并安装dbeaver-ce-latest-x86_64-setup.exe; 安装Kerberos客户端4.1-amd64.msi; 查看集群节点/etc/hosts文件内容,并追加到C:\Windows\System32\drivers\etc\hosts; 下载集群用户keytab文件,并解压…

从零开始 blender插件开发

blender 插件开发 文章目录 blender 插件开发环境配置1. 偏好设置中开启相关功能2. 命令行打开运行脚本 API学习专有名词1. bpy.data 从当前打开的blend file中&#xff0c;加载数据。2. bpy.context 可用于获取活动对象、场景、工具设置以及许多其他属性。3. bpy.ops 用户通常…

深入理解JVM

文章目录 1. JVM内存区域划分2. JVM中类加载过程类加载&#xff08;1&#xff09;类加载的基本流程&#xff08;2&#xff09;双亲委派模型 《深入理解java虚拟机》 在这本书前&#xff0c;面试官对于JVM也不是很了解。 这本书主要还是写个一下开发 JVM 的人。 1. JVM内存区域…

c# 开发web服务 webserver

024-11-10<<<<<<<<<<<<<<<<<<<<<<<<<< 开始插件前Cyber_CallWeb acajax_dac_database_viewer 2024-11-10<<<<<<<<<<<<<<<<<<<<…