MVP模式

1、创建数据库表单对应的实体类。

package com.mvp.model;
//Model(模型),数据库表单对应的实体类。
public class Word {
    private int id;
    private String engName;
    private String chiVal;
    private String lastUsedTime;
    private int usedTimes;
    private String createdTime;
    private int priority;

    public Word(int id, String engName, String chiVal, String lastUsedTime, int usedTimes, String createdTime, int priority) {
        this.id = id;
        this.engName = engName;
        this.chiVal = chiVal;
        this.lastUsedTime = lastUsedTime;
        this.usedTimes = usedTimes;
        this.createdTime = createdTime;
        this.priority = priority;
    }

    // 省略getter和setter方法

    @Override
    public String toString() {
        return "Id: " + id +
                "\n英语原文: " + engName +
                "\n汉语意义: " + chiVal +
                "\n最后使用时间: " + lastUsedTime +
                "\n使用次数: " + usedTimes +
                "\n创建时间: " + createdTime +
                "\n优先级: " + priority +
                "\n---------------------";
    }
}

2、创建WordModel类对数据进行具体的操作:

package com.mvp.model;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
//模型类WordModel负责具体的数据操作逻辑。
public class WordModel {
    // JDBC连接信息
    private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DB_URL = "jdbc:mysql://localhost/test_data";
    private static final String USER = "root";
    private static final String PASS = "admin";

    public void insertWord(String engName, String chiVal, String lastUsedTime, int usedTimes, String createdTime, int priority) {
        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            // 注册JDBC驱动
            Class.forName(JDBC_DRIVER);

            // 打开数据库连接
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 构建插入数据的SQL语句
            String sql = "INSERT INTO words_info (eng_name, chi_val, last_used_time, used_times, created_time, priority) VALUES (?, ?, ?, ?, ?, ?)";

            // 创建PreparedStatement对象
            stmt = conn.prepareStatement(sql);

            // 设置参数
            stmt.setString(1, engName);
            stmt.setString(2, chiVal);
            stmt.setString(3, lastUsedTime);
            stmt.setInt(4, usedTimes);
            stmt.setString(5, createdTime);
            stmt.setInt(6, priority);

            // 执行SQL语句
            stmt.executeUpdate();

            System.out.println("数据插入成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void deleteWord(int id) {
        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            // 注册JDBC驱动
            Class.forName(JDBC_DRIVER);

            // 打开数据库连接
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 构建删除数据的SQL语句
            String sql = "DELETE FROM words_info WHERE Id = ?";

            // 创建PreparedStatement对象
            stmt = conn.prepareStatement(sql);

            // 设置参数
            stmt.setInt(1, id);

            // 执行SQL语句
            stmt.executeUpdate();

            System.out.println("数据删除成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void updateWord(int id, String engName, String chiVal) {
        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            // 注册JDBC驱动
            Class.forName(JDBC_DRIVER);

            // 打开数据库连接
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 构建更新数据的SQL语句
            String sql = "UPDATE words_info SET eng_name = ?, chi_val = ? WHERE Id = ?";

            // 创建PreparedStatement对象
            stmt = conn.prepareStatement(sql);

            // 设置参数
            stmt.setString(1, engName);
            stmt.setString(2, chiVal);
            stmt.setInt(3, id);

            // 执行SQL语句
            int rowsAffected = stmt.executeUpdate();

            if (rowsAffected > 0) {
                System.out.println("数据更新成功");
            } else {
                System.out.println("未找到对应的数据");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public List<Word> getAllWords() {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Word> words = new ArrayList<>();

        try {
            // 注册JDBC驱动
            Class.forName(JDBC_DRIVER);

            // 打开数据库连接
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 创建Statement对象
            stmt = conn.createStatement();

            // 执行查询语句
            String sql = "SELECT * FROM words_info";
            rs = stmt.executeQuery(sql);

            // 构建Word对象并加入列表
            while (rs.next()) {
                int id = rs.getInt("Id");
                String engName = rs.getString("eng_name");
                String chiVal = rs.getString("chi_val");
                String lastUsedTime = rs.getString("last_used_time");
                int usedTimes = rs.getInt("used_times");
                String createdTime = rs.getString("created_time");
                int priority = rs.getInt("priority");

                Word word = new Word(id, engName, chiVal, lastUsedTime, usedTimes, createdTime, priority);
                words.add(word);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return words;
    }
}

3、创建View层,WordView接口用于定义展示数据的方法:

package com.mvp.model;
import java.util.List;
//视图接口WordView定义展示单词列表的方法.
public interface WordView {
    void displayWords(List<Word> words);
}

4、实现WordView接口,实现具体的显示方法,在控制台输出数据:

package com.mvp.model;
import java.util.List;
// 实现WordView接口,实现具体的显示方法,在控制台输出数据。
class WordViewConsole implements WordView {
	@Override
	public void displayWords(List<Word> words) {
		for (Word word : words) {
			System.out.println(word);
		}
	}
}

5、创建Presenter,WordPresenter类负责协调模型和视图之间的交互:

package com.mvp.model;
import java.util.List;
//WordPresenter类负责协调模型和视图之间的交互,并实现插入、删除、更新和查询数据的方法。
public class WordPresenter {
    private WordModel wordModel;
    private WordView wordView;

    public WordPresenter(WordModel wordModel, WordView wordView) {
        this.wordModel = wordModel;
        this.wordView = wordView;
    }

    public void insertWord(String engName, String chiVal, String lastUsedTime, int usedTimes, String createdTime, int priority) {
        wordModel.insertWord(engName, chiVal, lastUsedTime, usedTimes, createdTime, priority);
    }

    public void deleteWord(int id) {
        wordModel.deleteWord(id);
    }

    public void updateWord(int id, String engName, String chiVal) {
        wordModel.updateWord(id, engName, chiVal);
    }

    public void displayWords() {
        List<Word> words = wordModel.getAllWords();
        wordView.displayWords(words);
    }
}

6、在main类中进行测试:

package com.mvp.model;
import java.text.SimpleDateFormat;
import java.util.Date;
//MVC与MVP模式的主要区别如下:
//职责分配:
//在MVC模式中,Model负责管理应用程序的数据和业务逻辑,View负责呈现数据给用户,Controller负责接受用户的输入并作出响应。
//在MVP模式中,Model同样负责管理数据和业务逻辑,View负责呈现数据给用户,
//Presenter作为中间人负责处理用户的输入,将输入与Model交互,并更新View。
//数据流:
//在MVC模式中,数据流是双向的。用户的输入通过Controller传递给Model进行处理,处理后的数据通过View呈现给用户。
//同时,Model也可以直接更新View。
//在MVP模式中,数据流是单向的。用户的输入通过View传递给Presenter进行处理,Presenter将数据交给Model进行处理,
//处理完成后,Model将结果交给Presenter,再由Presenter更新View。
//单向依赖:
//在MVC模式中,View依赖于Controller和Model,Controller依赖于View和Model,Model独立存在。
//在MVP模式中,View只依赖于Presenter,Presenter依赖于View和Model,Model独立存在。
//可测试性:
//在MVC模式中,由于Controller处理用户的输入和输出,因此可以很容易地对Controller进行单元测试。
//在MVP模式中,由于Presenter处理用户的输入和输出,因此可以很容易地对Presenter进行单元测试。


//在MVP(Model-View-Presenter)模式中,将应用程序分为三个部分:模型(Model),视图(View)和Presenter(Presenter)。
//模型负责处理数据和业务逻辑,视图负责展示数据给用户,Presenter负责协调模型和视图之间的交互。

//在Main类中,创建WordModel、WordView实例,并将它们传递给WordPresenter的构造方法,然后通过调用Presenter的方法来执行操作。
//可以根据需要实现不同的视图类,例如:WordViewConsole用于在控制台展示数据,或WordViewGUI用于在图形界面展示数据。
//本例给出了一个在控制台展示数据的视图类。
//代码示例中的模型和数据库操作部分需要进行具体实现,需要根据自己的实际需求和数据库系统来编写相应的逻辑。

public class Main {
    public static void main(String[] args) {
    	
        WordModel wordModel = new WordModel();
        WordView wordView = new WordViewConsole();
        WordPresenter wordPresenter = new WordPresenter(wordModel, wordView);
    	// 获取当前时间
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		String currentTime = dateFormat.format(new Date());

        // 插入数据示例
        wordPresenter.insertWord("digital", "数据", currentTime, 1, currentTime, 0);

        // 删除数据示例
        wordPresenter.deleteWord(2);

        // 更新数据示例
        wordPresenter.updateWord(110, "updateddigital", "更新后的数据");

        // 查询数据示例
        wordPresenter.displayWords();
    }
}

运行结果如下:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【华为笔试题汇总】2024-04-10-华为春招笔试题-三语言题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f…

uniapp 轮播列表一排展示3个,左右滑动,滑动到中间放大

一、效果展示 二、代码实现 1.html代码&#xff1a; <!-- 轮播 --><view class"heade"><swiper class"swiper" display-multiple-items3 circulartrue previous-margin1rpx next-margin1rpxcurrent0 change"swiperChange">&l…

第 6 章 Gazebo仿真环境搭建(自学二刷笔记)

6.6.4 Gazebo仿真环境搭建 到目前为止&#xff0c;我们已经可以将机器人模型显示在 Gazebo 之中了&#xff0c;但是当前默认情况下&#xff0c;在 Gazebo 中机器人模型是在 empty world 中&#xff0c;并没有类似于房间、家具、道路、树木... 之类的仿真物&#xff0c;如何在 …

SQL注入sqli_labs靶场第三题

?id1and 11 and 11和?id1and 11 and 11进行测试如果11页面显示正常和原页面一样&#xff0c;并且12页面报错或者页面部分数据显示不正常&#xff0c;那么可以确定此处为字符型注入。 根据报错信息判断为单引号带括号注入 联合查询&#xff1a; 猜解列名 ?id1) order by 3-…

微服务项目sc2024第一个子项目

1. 第一个子项目 2.pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

【测试开发学习历程】python迭代、可迭代对象、迭代器、生成器

1 迭代Iteration 迭代Iteration&#xff1a;所谓迭代就是重复运行一段代码语句块的能力&#xff0c;就好比在一个容器中进行一层一层遍历数据&#xff0c;在应用过程中for循环最为突出。迭代就是从某个容器对象中逐个地读取元素&#xff0c;直到容器中没有元素为止。迭代迭代&…

linux服务使用./xxx.sh执行脚本命令

设置脚本文件为全权限 chmod 777 xxx.sh直接使用./xxxx.sh即可

用dbms_shared_pool.purge清除执行计划

1.Oracle 11g如何清除share pool中某条SQL的执行计划 以前在Oracle 10g数据库上,如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法&#xff08;总不能alter system flush shared_pool&#xff09;,只能…

HTML+CSS+JS实现京东首页[web课设代码+模块说明+效果图]

系列文章目录 文章目录 系列文章目录前言一、HTML结构图二、CSS部分代码图三、每部分效果图展示3.1 导航栏、头部搜索栏效果图3.2 中心区域商品展示效果图3.3 秒杀区和特惠区域效果图3.4 页脚&#xff08;底部导航、版权信息、技术支持等内容&#xff09;效果图 总结 前言 用时…

【算法刷题 | 二叉树 06】4.10( 路径总和、路径总和 || )

文章目录 13.路径总和13.1问题13.2解法一&#xff1a;递归13.2.1递归思路&#xff08;1&#xff09;确定递归函数参数以及返回值&#xff08;2&#xff09;确定终止条件&#xff08;3&#xff09;确定递归逻辑 13.2.2代码实现 14.路径总和 ||14.1问题14.2解法一&#xff1a;递归…

CRM集成:解锁业务增长与客户关系管理的关键

预计从2021年至2028年&#xff0c;CRM领域的市场规模将大幅跃升&#xff0c;从约580亿美元增长至1290亿美元。这一显著的增长并非偶然&#xff0c;而是源于CRM平台为企业带来的巨大价值。客户关系管理平台助力销售高效开发潜在客户&#xff0c;客户成功经理有效支持客户&#x…

VRRP+MSTP+BFD

一、组网 二、要求 PC6&#xff08;vlan 10内PC&#xff09;访问1.1.1.1走JR-1——CORE1——MSR到1.1.1.1 PC7&#xff08;vlan 20内PC&#xff09;访问1.1.1.1走JR-2——CORE2——MSR到1.1.1.1 链路故障时切换路线&#xff0c;来回路径一致 三、配置步骤 SR bfd echo-sou…

30.WEB渗透测试-数据传输与加解密(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;29.WEB渗透测试-数据传输与加解密&#xff08;3&#xff09;-CSDN博客 加解密需要用到的源…

磁盘管理与文件管理

文章目录 一、磁盘结构二、MBR与磁盘分区分区的优势与缺点分区的方式文件系统分区工具挂载与解挂载 一、磁盘结构 1.硬盘结构 硬盘分类&#xff1a; 1.机械硬盘&#xff1a;靠磁头转动找数据 慢 便宜 2.固态硬盘&#xff1a;靠芯片去找数据 快 贵 硬盘的数据结构&#xff1a;…

InternVideo2重塑视频理解新标杆,多模态学习引领行业风向

引言&#xff1a;视频理解的新篇章——InternVideo2的介绍 随着视频内容在日常生活中的普及&#xff0c;视频理解技术的重要性日益凸显。视频不仅包含丰富的视觉信息&#xff0c;还蕴含着动态变化和多模态元素&#xff0c;如音频和文本。这些特性使得视频成为一个复杂的数据类型…

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…

Leetcode算法训练日记 | day14

一、二叉树的前序遍历 1.题目 Leetcode&#xff1a;第 144 题 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#…

wps可以打钩的框框

方法一&#xff1a; 输入2611&#xff0c;按下altx 方法二&#xff1a; R 选中后->开始->字体wingdings字体

MATLAB 点云体素滤波 (58)

MATLAB 体素滤波 (58) 一、基本原理二、算法实现1.代码数据的海量性始终是点云处理时需要面临的一个大问题,严重的时间消耗和内存占用影响了点云处理的发展,当然了,点云数量主要应该看项目的实际需求,若是对细节要求较高,那么点云数量不可过少,但是要求过低时,我们就可…

番外篇 | YOLOv8改进之引入YOLOv9的ADown模块 | 替换YOLOv8卷积

前言:Hello大家好,我是小哥谈。YOLOv9是一种目标检测算法,而ADown模块是YOLOv9中的一个重要组成部分。ADown模块主要用于特征提取和下采样操作,以便在后续的检测任务中更好地捕捉目标的特征。具体来说,ADown模块是YOLOv9中的一个卷积块,由一系列卷积层和池化层组成。它的…