1、创建Model(模型),数据库表单对应的实体类。
package com.mvc.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、创建View类,将数据输出到控制台:
package com.mvc.model;
//创建一个View类,将数据输出到控制台。
import java.util.List;
public class WordView {
public void displayWords(List<Word> words) {
for (Word word : words) {
System.out.println(word);
}
}
}
3、创建wordDAO类,具体的数据库操作逻辑:
package com.mvc.model;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
//DAO(数据访问对象)
public class WordDAO {
// 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;
}
}
4、创建一个wordController类处理用户交互:
package com.mvc.model;
import java.util.List;
//Controller(控制器)处理用户交互,并调用WordDAO和WordView进行数据操作和展示。
public class WordController {
private WordDAO wordDAO;
private WordView wordView;
public WordController() {
wordDAO = new WordDAO();
wordView = new WordView();
}
public void insertWord(String engName, String chiVal, String lastUsedTime, int usedTimes, String createdTime, int priority) {
wordDAO.insertWord(engName, chiVal, lastUsedTime, usedTimes, createdTime, priority);
}
public void deleteWord(int id) {
wordDAO.deleteWord(id);
}
public void updateWord(int id, String engName, String chiVal) {
wordDAO.updateWord(id, engName, chiVal);
}
public void displayWords() {
List<Word> words = wordDAO.getAllWords();
wordView.displayWords(words);
}
}
5、在主程序中测试执行。
package com.mvc.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进行单元测试。
//在MVC模式中,将应用程序分为三个部分:模型(Model),视图(View)和控制器(Controller)。
//模型负责处理数据和业务逻辑,视图负责展示数据给用户,控制器负责协调模型和视图之间的交互。
//模型类Word表示单词对象,视图类WordView负责展示单词列表,
//控制器类WordController负责与模型和视图进行交互,并实现插入、删除、更新和查询数据的方法。
//WordDAO类负责与数据库进行交互,实现具体的增删改查操作。主程序类Main用于测试执行。
public class Main {
public static void main(String[] args) {
// 获取当前时间
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentTime = dateFormat.format(new Date());
WordController wordController = new WordController();
// 插入数据示例
wordController.insertWord("newword", "新词", currentTime, 1, currentTime, 0);
// 删除数据示例
wordController.deleteWord(2);
// 更新数据示例
wordController.updateWord(1, "updated_word", "更新后的词");
// 查询数据示例
wordController.displayWords();
}
}
运行结果如下: