映射

news/2025/10/28 23:56:11/文章来源:https://www.cnblogs.com/Rich-S/p/19172974

通过ide伪造数据库

映射 Map

首先我们来了解一下什么是映射
先直到 key,value 它们往往是一对
一个键只能对应一个值,但一个值可以对应多个键
例如
苹果 -> 水果
菠萝 -> 水果
人名 -> 电话号码
学号 ->学生信息
映射就像是一个配对系统或对应关系表,它建立了键(Key)和值(Value)之间的一一对应关系

创建一个pojo的类 -- 简单的java对象

一个普通的、不受任何特殊限制和约束的类
1. 不继承特定的类
2. 不实现特定的接口
3. 不包含特点的注解
4. 可以有任何字段和其对应的Getter/Setter:用于常见的形态,用于封装数据
5. 可以在java任何环境中使用
demo1/pojo.Employee.java

package com.example.demo1.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;//员工表
@Data
@NoArgsConstructor
public class Employee {private String lastName;private Integer id;private String Email;private Integer gender; // 0 女 1 男private Department department;private Date brith;public Employee(String lastName, Integer id, String email, Integer gender, Department department) {this.lastName = lastName;this.id = id;this.Email = email;this.gender = gender;this.department = department;//默认的日期//上面就不用传形参了this.brith = new Date();}public Employee(String aa, int i, String mail, int i1, Department department1) {}
}

@Date
可以替代一整个类的 Getter、Setter、toString()、equals() 和 hashCode() 方法的编写。
当你在一个类上使用 @Data 注解时,Lombok 会在编译时自动为这个类生成以下内容:
1. 所有字段的 Getter 方法: 为所有非静态字段生成 getXxx() 方法。
2. 所有非 final 字段的 Setter 方法: 为所有非静态且非 final 的字段生成 setXxx() 方法。
3. toString() 方法: 生成一个包含所有类字段及其值的 toString() 方法。
4. equals() 和 hashCode() 方法: 生成基于所有非静态、非 transient 字段的 equals() 和 hashCode() 方法。这是实现对象逻辑相等和用于基于散列的集合(如 HashMap, HashSet)的关键。
5. 一个必需的ArgsConstructor: 它会生成一个包含所有final字段和标记了@NonNull且未初始化的字段的构造方法。注意:从Lombok v1.18.4以后,如果你没有写任何构造方法,它还会生成一个无参构造器

pojo.Department.java

package com.example.demo1.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//部门表-伪造的
@Data
@AllArgsConstructor //有参构造
@NoArgsConstructor  //无参构造
public class Department {private Integer id;private String departmentName;
}

创建一个Dao类 -- Data Access Object(数据访问对象)

专门负责与数据打交道的工具对象
DAO 的主要作用是在业务逻辑和数据存储之间建立一个隔离层
业务逻辑层 (Service) → DAO层 → 数据库/数据源
具体职责
数据的增删改查(CRUD操作)
封装数据访问细节
提供统一的数据操作接口
通常 DAO 的方法名会体现其操作:
findAll() - 查找所有
findById() - 根据ID查找
save() - 保存
update() - 更新
delete() - 删除
作用:
解耦合
业务代码不需要知道数据具体存储在哪里(数据库、文件、内存等)
代码复用
相同的数据操作逻辑可以在多处复用
避免在业务代码中重复编写数据访问逻辑
维护性
数据访问逻辑集中在一处,便于维护和优化

DepartmentDao

package com.example.demo1.dao;import com.example.demo1.pojo.Department;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;@Repository
//部门dao
public class DepartmentDao {//模拟数据库数据private static Map<Integer, Department> departments = null;static {departments = new HashMap<Integer, Department>(); //创建一个部门表departments.put(101, new Department(101,"教学部"));departments.put(102, new Department(102,"市场部"));departments.put(103, new Department(103,"教研部"));departments.put(104, new Department(104,"运营部"));departments.put(105, new Department(105,"后勤部"));}//获得所有部门信息public Collection<Department> getDepartments(){return departments.values();}//通过id得到部门 把id传进去public Department getDepartmentById(int id){return departments.get(id); //类}
}

补充:
private static Map<Integer, Department> departments = null;
"私有的静态的 整数到部门的映射 部门集合 等于 空值"

Employee

public class EmployeeDao {//模拟数据库中的数据private static Map<Integer, Employee > employees = null;//员工所属部门@Autowiredprivate DepartmentDao departmentDao;static {employees = new HashMap<Integer, Employee>();employees.put(101,new Employee("AA",1001,"1597534682@qq.com",0,new Department(101,"后勤部")) );employees.put(102,new Employee("BB",1002,"1592534682@qq.com",0,new Department(102,"教研部")) );employees.put(103,new Employee("CC",1003,"1591534682@qq.com",0,new Department(103,"市场部")) );employees.put(104,new Employee("DD",1004,"1596534682@qq.com",0,new Department(104,"运营部")) );employees.put(105,new Employee("EE",1005,"1594534682@qq.com",0,new Department(105,"后勤部")) );}//主键自增 增加一个员工private static Integer initId = 1006; //init-初始化public void save(Employee employee){if(employee.getId()==null){employee.setId(initId++);}employee.setDepartment((departmentDao.getDepartmentById(employee.getDepartment().getId())));employees.put(employee.getId(),employee);}//查询全部员工信息public Collection<Employee> getAll(){return employees.values();};//通过id查询员工public Employee get(Integer id){return employees.get(id);}//通过id删除员工public void delete(Integer id){employees.remove(id);}
}

首页实现

首先在config目录下面的myMVCConfig类
添加一个重写方法,引入ViewControllerRegistry registry形参
然后引用addViewController方法

    @Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");registry.addViewController("/index.html").setViewName("index");}

定制跳转首页的路径,可以用多次
然后我们再去index.html修改报错代码
所有页面的静态资源都要使用thymeleaf接管 - @{}
会生成相对于上下文根的绝对路径(例如:/your-app-context/css/style.css
因为我们用的是thymeleaf依赖,所以我们要再导入命名空间
很重要哈
<html lang="en" xmlns:th="http://www.thymeleaf.org">
href、src后面要加th:
在双引号里面加@{....}
assets删掉

首页跳转报错

488行的问题
An error happened during template parsing (template: "class path resource [templates/index.html]" - line 488, col 21)

解决方法

这里原本有两个data-wow-delay,然后我删掉了一个就可以了
但是图片什么的都解析不出来

解决方法 - 因为用了thymeleaf依赖所以:
<link rel="shortcut icon" type="image/x-icon" th:href="assets/images/favicon.png">
href 后面加了th:

首页国际化

确认文件编码都是UTF-8
在resource目录下面创建一个i18n目录 //i18n-国际化
然后建立三个login配置文件
login.properties
login_zh_CN.properties
login_zh_CN.properties
会自动给你把这三个配置文件合并成一个资源包
我们可以直接右键点击资源包,选择新建.将属性文件添加到资源包
再点击右边的+号
如果要加英文资源包就直接填入en_US就行了
现在我们可以在配置文件添加不同的语言配置了
默认配置就在login.properties里填写键值对
看看首页有什么文字 比如password之类的,我们可以这样写

login.tip = 请登录
login.password = 密码

那么中文的配置文件也这样写就好了
接着英文的就是

login.tip = Please sign in
login.password = password

当然,键名随便起也没事
下一步,我们可以跳转到MessageAutoConfigration源码查看如何使用这些配置文件
String basename = context.getEnvironment().getProperty("spring.messages.basename", "messages");

        public void registerHints(RuntimeHints hints, ClassLoader classLoader) {hints.resources().registerPattern("messages.properties").registerPattern("messages_*.properties");}}```

我们在测试配置文件application.properties里配置上面的login.properties
spring.messages.basename=i18n.login
最后我们再在index.html文件里面找到对应的文字,所以键值名还是最好取一样的不然不好找
国际化消息表达式 :#{...}
我们在"按键/或者别的什么其他"后面 空格 th:text="#{login.tip}">(这里就是要被引用配置的字段)</...>
button就把text改成value
如果还是不行就直接把字段改成
[[#{login.tip}]] //.自己设定的键值 两个中括号如何里面写表达式#{...}
这些字段都是黑色的,看到就能认出来了

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

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

相关文章

文件夹显示绿色成功图标方法

链接:https://blog.csdn.net/jiminkoo/article/details/131840356本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/19172967

【RabbitMQ】与ASP.NET Core集成

本章目标掌握在ASP.NET Core中配置和依赖注入RabbitMQ服务。学习使用IHostedService/BackgroundService实现常驻消费者服务。实现基于RabbitMQ的请求-响应模式。构建完整的微服务间异步通信解决方案。学习配置管理和健…

IMO2025 Problem 1

考虑 \(n = 3\) 时的下三角,显然有三个容易构造的解,\(k = \{0, \, 1, \, 3\}\),构造如下:那么 \(n > 3\) 呢?由于下三角的点数恰好为 \(1 + 2 + \cdots + n\) 个点,对于第一条直线,有且仅有 \(3\) 中方式覆…

Day6综合案例2-注册信息

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

2014吉林省赛题解 | CCUT应用OJ——Sign in

题目简介题源:1035-Sign in | CCUT OJ,2014 吉林省赛 C 题 题意:给定长为 \(n\) 的序列 \(A\) 与长为 \(n-1\) 的序列 \(B\),其中 \(B\subset A\),求 \(A-B\)。即:\(B\) 中恰好只有一个元素在 \(A\) 中没出现,求…

访答知识库-可以本地使用的知识库

访答知识库-可以本地使用的知识库访答知识库,一键安装,0代码使用。 支持图片、视频、语音搜索与问答 支持多模态问答

代码大全2 第三四章

读《代码大全 2》第三、四章,感觉像听老程序员唠实用嗑,没半点虚头巴脑的理论。第三章讲代码可读性,真是说到心坎里了。以前总觉得代码能跑就行,变量随便叫个 a、b、c,注释能省就省。结果过半个月回头看,自己写的…

https代理服务器(六)再次java动态签发【成功】

https代理服务器(六)再次java动态签发【成功】1X500Name canamem = new X500Name(caCertificate.getSubjectX500Principal().getName());改为X500Name issuerName = new JcaX509CertificateHolder(caCertificate).ge…

[AGC032D] Rotation Sort 题解

QwQ[AGC032D] Rotation Sort 题解 把循环移位看作是将某个数向左或右插入到任意位置,显然一个数最多被移动一次。 那么该序列中一共有三种数:向左移动 向右移动 不动假设已知每个数属于哪一种,考虑如何判定该方案是…

[AGC024E] Sequence Growing Hard 题解

QwQ[AGC024E] Sequence Growing Hard 题解 首先手玩一下样例,考虑在哪些位置插入是合法,假设在 \(pos\) 位置前插入 \(x\),则如果 \(x > a_{pos}\),则显然字典序会变大,否则如果 \(a_{pos} = x\) 需要找到 \(p…

新学期每日总结(第15天)

今日 相较昨日 学习下载数据库

实验2 现代C++编程初体验

任务1 源代码 T.h#pragma once#include <string>// 类T: 声明 class T { // 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T &t); // 复制构造函数T(T &&t); /…

P7154 [USACO20DEC] Sleeping Cows P 题解

QwQP7154 [USACO20DEC] Sleeping Cows P 题解 把 \(s, t\) 升序排序。 容易发现每一个 \(t_i\) 可匹配的 \(s_j\) 对应了一个前缀。 考虑刻画极大匹配,一个匹配是极大的当且仅当最大的没有被匹配的 \(t\) 小于最小的没…

Java流程控制——switch多选择结构

Java流程控制——switch多选择结构swtich多选择语句 多选择结构的另一实现方式为switch-case语句 switch-case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支 基本结构示例 switch(expression){case…

P3607 [USACO17JAN] Subsequence Reversal P 题解

好题P3607 [USACO17JAN] Subsequence Reversal P 题解 如果我们顺序对翻转的子序列做 DP,那么在末尾新增一个数会影响前面所有数的交换对应关系。 思考这个翻转的结构,前后对应的数交换,如果我们同时加入前后两个对…

示性函数2

Problem 设有一个大小为 $ n $ 的集合,进行 $ n $ 次操作,每次从集合中随机选取一个元素并记录之,求所有操作结束后,所记录的元素中互不相同的元素的个数的期望 $ E(X) $。分析 通常示性函数在应用与解决此类问题时…

随笔/杂记

随便写写记记 罗素茶壶:一个主张的不可证伪性,并不能成为相信它的理由。

k3s 基础 —— 将 traefik 替换为 ingress-nginx

k3s 基础 —— 将 traefik 替换为 ingress-nginx部署 创建 ingress-nginx.yaml apiVersion: helm.cattle.io/v1 kind: HelmChart metadata:name: ingress-nginxnamespace: kube-system spec:chart: https://<yourcd…