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();
}
}
运行结果如下: