1.UUID
UUID
UUID,即通用唯一标识符(Universally Unique Identifier),是一个用于标识信息的128位数值。 它具有全球唯一性,可以用于生成不重复的标识符,常用于分布式系统中实现唯一标识。
特点:
- 唯一性:UUID具有极高的唯一性,几乎可以保证在分布式系统中不重复。
- 无序性:UUID生成的顺序是无序的,不会暴露数据的创建时间等敏感信息。
- 广泛应用:UUID广泛应用于数据库、分布式系统、唯一标识等场景,是处理唯一标识需求的重要技术。
应用场景:
- 数据库主键:UUID可用作数据库表的主键,避免了传统自增主键的局限性和冲突问题。
- 分布式系统:在分布式系统中,UUID可用于唯一标识节点、任务、消息等,方便进行数据同步和区分。
- 会话管理:UUID可用于生成会话ID,确保每个用户的会话标识唯一性。
- 随机文件名:UUID可以作为文件名的一部分,确保文件名的唯一性。
入门操作
入门案例编写: 让我们以Java语言为例,编写一个简单的入门案例来生成UUID。
import java.util.UUID;
public class UUIDDemo {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println("生成的UUID:" + uuid);
}
}
练习题
- 编写一个方法,生成5个UUID并将它们存储在一个数组中。
- 将练习题1中生成的UUID按照字典序排序,并输出排序后的结果。
小结
- UUID是一种用于唯一标识信息元素的标识符。
- 学习UUID可以帮助我们解决分布式系统中的唯一标识需求。
- UUID具有高度的唯一性和无序性,广泛应用于数据库、分布式系统等领域。
- 在Java中,可以使用UUID类来生成和操作UUID。
- 练习题可以帮助巩固对UUID的理解和应用。
2.MD5加密
MD5加密
MD5(Message Digest Algorithm 5)是一种常用的消息摘要算法,用于将任意长度的数据生成固定长度的散列值(128位)。
- MD5 由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,由MD2、MD3、MD4发展而来。
它是不可逆的,即无法从散列值还原出原始数据。
为什么要学习MD5加密:
- 数据安全性:学习MD5加密可以帮助保护数据的安全性,尤其在存储密码等敏感信息时起到重要作用。
- 校验完整性:MD5可以用于校验数据的完整性,通过比较散列值来验证数据是否被篡改。
- 广泛应用:MD5被广泛应用于密码存储、数字签名、数据校验等领域,是一项重要的加密技术。
应用场景:
- 密码存储:MD5常用于存储用户密码的散列值,确保用户密码的安全性。
- 文件校验:通过计算文件的MD5值,可以验证文件在传输过程中是否被篡改或损坏。
- 数字签名:MD5可以用于生成数字签名,验证数据的真实性和完整性。
- 数据校验:在数据传输过程中,通过比较MD5散列值可以验证数据的一致性。
代码操作
编写一个Java方法,对给定的字符串进行MD5加密,并返回加密后的散列值。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Example {
public static String encryptMD5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] messageDigest = md.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : messageDigest) {
hexString.append(String.format("%02x", b));
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String plaintext = "Hello, MD5!";
String encryptedText = encryptMD5(plaintext);
System.out.println("Original: " + plaintext);
System.out.println("MD5: " + encryptedText);
}
}
/**
* MD5加密工具类
*
*/
public class MyMD5Util {
//盐,用于混交md5
private static final String slat = "this is my salt";
/**
* 1.java原生用法
*
* @param dataStr
* @return
*/
public static String encrypt(String dataStr) {
try {
dataStr = dataStr + slat;
MessageDigest m = MessageDigest.getInstance("MD5");
m.update(dataStr.getBytes(StandardCharsets.UTF_8));
byte[] s = m.digest();
StringBuilder result = new StringBuilder();
for (byte b : s) {
result.append(Integer.toHexString((0x000000FF & b) | 0xFFFFFF00).substring(6));
}
return result.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* 2.spring提供的工具类用法
* 生成md5
*
* @return
*/
public static String getMD5(String str) {
String base = str + slat;
String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
return md5;
}
}
练习题
- 使用上述的工具类,接受用户输入的密码,并将其加密为MD5值。然后与预先存储的MD5值进行比较,判断密码是否正确。
- 观察同样的密码,md5的值是否一样? 这样似乎不安全! 思考一下解决方案?
小结
- MD5是一种常用的消息摘要算法,用于生成
固定长度的散列值
。 - 学习MD5加密可以提高数据的安全性和完整性,广泛应用于
密码存储、文件校验、数字签名
等领域。 - 在Java中,可以使用
MessageDigest类
来实现MD5加密。 - 练习题有助于加深对MD5加密的理解和应用。
通过学习MD5加密,我们可以更好地保护数据的安全性和完整性,提高系统的安全性。了解MD5加密的应用场景和实践,可以为开发安全可靠的应用程序打下基础。
3. 在SpringBoot下集成MybatisPlus框架
MybatisPlus框架

为什么要学习MybatisPlus框架:
- 提高开发效率:MybatisPlus框架提供了丰富的功能和工具,能够简化开发过程,减少样板代码的编写,从而提高开发效率。less code and less bug
- 优化数据库操作:MybatisPlus框架提供了一系列的优化策略和技巧能说出若干吗?,可以优化数据库操作性能,提升系统的响应速度和吞吐量。
- 社区支持和生态系统中国人写的,中文文档杠杠的!:MybatisPlus框架拥有庞大的用户社区和活跃的开发者群体,提供了大量的学习资源和技术支持。
应用场景:
- 数据库访问层:MybatisPlus框架主要用于简化数据库访问层的开发,提供了灵活的SQL映射配置和便捷的CRUD操作。 代码生成器:MybatisPlus框架内置了强大的代码生成器,能够根据数据库表结构自动生成实体类、Mapper接口和XML映射文件,极大地提升了开发效率。
分页查询分页助手:MybatisPlus框架提供了方便的分页查询支持,可以轻松处理大量数据的分页查询需求。
逻辑删除假删除:MybatisPlus框架支持逻辑删除功能,可以方便地标记和查询已删除的数据,避免物理删除导致的数据丢失。
接下来,我们将在SpringBoot下集成Mybatis的使用完成需求1、需求2、需求3 👇 👇
代码操作
- SpringBoot项目工程创建完成后,在pom.xml文件中的dependencies标签内,导入Mybatis的起步依赖和MySQL驱动依赖
springboot parent版本:2.5+ 版本
<!-- lombok的依赖,能免除get和set方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
<!-- mybatis的起步依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- mysql驱动包依赖 版本根据mysql安装版本:常见的5.1.47 和8.0.23 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
- 创建mybatis数据库,设置编码为utf-8mb4,创建user表,并导入一下假数据
-- 删除原有数据库
DROP TABLE IF EXISTS `user`;
-- 创建user表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL UNIQUE,
`password` varchar(32) NOT NULL DEFAULT '12345678',
`age` int(10) NOT NULL,
`hobby` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`department` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('8', '赵灵儿', '12345678', '20', '阵法、法术修炼', '纯真善良的女子,拥有强大的阴阳之力', '阴阳家');
INSERT INTO `user` VALUES ('9', '楚留香', '12345678', '32', '剑术、侠义行侠', '风流倜傥的豪客,以智慧和剑术征服江湖', '江湖人士');
INSERT INTO `user` VALUES ('10', '白浅', '12345678', '26', '宫廷舞蹈、仙法修炼', '美丽高贵的仙子,守护爱与正义的力量', '青丘派');
INSERT INTO `user` VALUES ('11', '苏明玉', '12345678', '29', '医术、家族事务', '聪明伶俐的女医生,心系家族兴衰', '苏家');
INSERT INTO `user` VALUES ('13', '李逍遥', '12345678', '28', '剑术、侠义行侠', '潇洒自如的剑客,为爱与正义奋斗', '天墉城');
INSERT INTO `user` VALUES ('14', '陆展元', '12345678', '31', '龙族法术、海洋探险', '勇敢善良的龙族王子,探索海洋奥秘', '东海龙宫');
INSERT INTO `user` VALUES ('18', '萧炎', '12345678', '25', '功夫、修炼', '机缘巧合下拥有强大火焰之力的少年', '草庙村');
INSERT INTO `user` VALUES ('19', '陆九淳', '12345678', '29', '家族事务、剑术修炼', '家族责任重于一切的江湖少年', '陆家');
INSERT INTO `user` VALUES ('20', '韩立', '12345678', '22', '灵力修炼、阵法研究', '机智聪明的年轻修士,掌握神奇的法术', '韩家');
INSERT INTO `user` VALUES ('21', '顾惜朝', '12345678', '28', '法术修炼、守护门派', '心地善良的女子,为守护门派而战', '古玄门');
INSERT INTO `user` VALUES ('22', '九霄真人', '12345678', '35', '仙法修炼、教导弟子', '威严正直的仙人,指导后辈修仙道路', '蓝霞宫');
INSERT INTO `user` VALUES ('23', '姬昌', '12345678', '33', '阴阳术、仙法修炼', '智勇双全的江湖人物,掌握阴阳之力', '太阴派');
INSERT INTO `user` VALUES ('24', '西门吹雪', '12345678', '30', '剑术、侠义行侠', '风流倜傥的剑客,执着追求剑道境界', '独孤家');
INSERT INTO `user` VALUES ('25', '夏冰', '12345678', '26', '魔法修炼、冰雪之力', '美丽神秘的女子,掌握冰雪之力', '幻冥宗');
INSERT INTO `user` VALUES ('26', '杨影枫', '12345678', '27', '暗器、侠义行侠', '冷酷无情的刺客,为正义而战', '影家');
INSERT INTO `user` VALUES ('27', '白素素', '12345678', '24', '文学创作、人界事务', '善良纯真的女子,用文字记录人间百态', '人界');
INSERT INTO `user` VALUES ('28', '独孤剑', '12345678', '32', '剑术、侠义行侠', '心系家族的剑客,剑法高超', '独孤家');
INSERT INTO `user` VALUES ('29', '楚九霄', '12345678', '28', '阵法、家族事务', '机智聪明的年轻人,心系家族荣耀', '楚家');
INSERT INTO `user` VALUES ('30', '谢晓峰', '12345678', '31', '拳脚功夫、江湖恩怨', '正直勇敢的江湖豪杰,忠于兄弟情义', '铁血帮');
INSERT INTO `user` VALUES ('31', '叶孤城', '12345678', '29', '剑术、侠义行侠', '冷酷无情的剑客,追求剑道极致', '武境城');
INSERT INTO `user` VALUES ('32', '李逸风', '12345678', '25', '修炼、探险', '热血青年,勇往直前探索未知世界', '蓝枫大陆');
INSERT INTO `user` VALUES ('33', '萧霜', '12345678', '27', '冰雪法术、守护宗门', '冷艳高傲的女子,守护冰霜宗的利益', '冰霜宗');
INSERT INTO `user` VALUES ('34', '楚玉峰', '12345678', '30', '家族事务、阵法修炼', '机智聪明的年轻人,家族责任重于一切', '楚家');
INSERT INTO `user` VALUES ('35', '陆雪琪', '12345678', '24', '法术、修行', '美丽冷傲的仙子,修炼法术追求修行境界', '青云门');
INSERT INTO `user` VALUES ('36', '明月心', '12345678', '26', '琴音、舞蹈', '温柔善良的女子,以音乐传递爱与希望', '云裳派');
INSERT INTO `user` VALUES ('37', '程灵素', '12345678', '27', '仙法修炼、仙岛事务', '温柔善良的仙子,守护仙岛和平', '蓬莱仙岛');
INSERT INTO `user` VALUES ('38', '韩非', '12345678', '23', '学术研究、阵法修炼', '聪明睿智的年轻人,研究阵法和学术', '韩家');
INSERT INTO `user` VALUES ('40', '戚芳', '12345678', '23', '武功、家族事务', '机智勇敢的女子,为家族荣誉而战', '戚家');
INSERT INTO `user` VALUES ('41', '楚轩辕', '12345678', '28', '家族事务、剑术修炼', '家族责任重于一切的剑客', '楚家');
INSERT INTO `user` VALUES ('42', '秦王', '12345678', '35', '政务、战争', '智勇双全的帝王,统一六国的志向', '秦国');
INSERT INTO `user` VALUES ('43', '李寻欢', '12345678', '30', '剑术、侠义行侠', '聪明机智的江湖人物,正义心十足', '大宛城');
INSERT INTO `user` VALUES ('44', '唐三藏', '12345678', '45', '佛法修行、西行取经', '慈悲心肠的高僧,带领徒弟西天取经', '大唐');
INSERT INTO `user` VALUES ('45', '吴青烟', '12345678', '26', '法术修行、江湖事务', '冷艳高傲的女子,修炼法术追求江湖大业', '青云门');
- 在application.yml配置文件下,配置数据库信息(驱动、链接、用户名、密码)
spring:
#数据库连接信息
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 1234
#MybatisPlus配置 日志,驼峰,id策略
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
- 将UserMapper类 将其中的方法改成抽象方法,并且将类改成接口
需求1:查询所有用户,输出在控制台可以先自己分析
需求2:查询名字叫 陆雪琪的用户,输出在控制台
4. 在SpringBoot下集成th模板
Thymeleaf
Thymeleaf,是一个XML/XHTML/HTML模板引擎,开源的java库,可以用于SpingMVC项目中,用于代替JSP、FreeMarker或者其他的模板引擎;页面与数据分离,提高了开发效率,让代码重用更容易。
JDK1.8+
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>ognl</groupId>
<artifactId>ognl</artifactId>
<version>3.1.26</version>
</dependency>
配置文件:
spring.thymeleaf.cache=false
spring.thymeleaf.suffix=.html
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.encoding=utf-8
spring.messages.basename=i18n/messages
thymeleaf内置了5种标准表达式,如下:
${...}:变量表达式,取出上下文环境中变量的值;
*{...}:选择变量表达式,取选择的对象的属性值;
#{...}:消息表达式,使用文字消息的国际化;
@{...}:链接表达式,用于表示各种超链接地址;
~{...}:片段表达式,引用一段公共的代码片段;如下:“example”表示另外一个模板名字,里面是一些通用代码片段,可以使用这种方式引入到当前模板中;
遍历:
<p data-th-each="student:${students}" data-th-text="${student.name}"></p>
集成示例
定义一个ExampleController类,注意,这里使用
@Controller
注解标记ExampleController,不要使用@RestController
;controller层具体处理请求的方法内,增加一个形参org.springframework.ui.Model,用于携带后台的处理数据;
返回值的“index”,表示classpath下templates中,模板名称是index,后缀是.html的模板;
contoller层处理完后,携带后台处理数据,到达视图层进行数据的渲染。
@Controller
@RequestMapping("/example")
public class ExampleController {
@GetMapping("/index")
public String index(Model model) {
model.addAttribute("userName", "fanfu");
model.addAttribute("msg", "thymeleaf模板内容");
return "index";
}
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<div>你好!<span data-th-text="${userName}"></span>!</div>
<div>这是一个<span data-th-text="${msg}"></span> 。</div>
</body>
</html>
Thymeleaf应用场景 Thymeleaf可以替代JSP来进行动态网页的开发,但是在前后端分离、前端组件更加丰富多元化的今天,依然采用JSP的模式,用Thymeleaf来替代JSP进行动态网页的开发,未免有些落后了,因此Thymeleaf就没有用武之地吗?当然不。Thymeleaf是模板引擎,不仅可以处理html模板,还可以处理xml、CSS等其他一些格式的模板文件。例如:输出一些有样式的制式文本,如通知公告、申请书、建议书等。
下面是一个具体的示例,student.html是一个学生成绩展示的模板,但是学生会有很多,成绩也不一样,但是如果需要用一个制式的格式来展示这些数据,可以这么做:
1、先拿到学生的成绩数据;
2、然后用编程式的方法,使用thymeleaf模板引擎,根据模板生成静态的带有样式且加载好数据的html网页代码;
3、通常成绩、通知这类信息,一旦形成,基本上是不会改了,因此拿到已经加载数据的html网页内容就可以直接渲染显示了;
@Test
public void test() throws IOException {
//测试数据
List<Student> students = this.students();
String staticDir = ResourceUtils.getFile("classpath:static\\").getPath() + File.separator;
String targetFilePath=staticDir+"/student-data.html";
//thymeleaf引擎上下文环境
Context context=new Context();
//在thymeleaf引擎上下文环境中装载模板上要渲染的数据
context.setVariable("students",students);
File file = new File(targetFilePath);
if (!file.exists()) {
file.delete();
}
//定义thymeleaf模板打印输出流
PrintWriter printWriter=new PrintWriter(file);
//定义thymeleaf模板解析器
FileTemplateResolver fileTemplateResolver = new FileTemplateResolver();
//thymeleaf模板解析器解析内容的后缀
fileTemplateResolver.setSuffix(".html");
//thymeleaf模板解析器解析内容的前缀
String tempDir = ResourceUtils.getFile("classpath:templates\\").getPath()+File.separator;
fileTemplateResolver.setPrefix(tempDir);
//定义//thymeleaf模板引擎
TemplateEngine templateEngine = new TemplateEngine();
//装载thymeleaf模板解析器
templateEngine.setTemplateResolver(fileTemplateResolver);
//执行thymeleaf模板引擎的模板解析能力,有三个参数,分别是模板名字(不包括后缀和前缀)、上下文环境、打印输出流
templateEngine.process("student",context,printWriter);
}
public List<Student> students() {
List<Student> students = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Student student = new Student();
student.setName("张三" + i);
student.setScore(98);
students.add(student);
}
return students;
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>学生信息</title>
</head>
<body>
<div>
<p>
<span data-th-text="姓名"></span>-----
<span data-th-text="成绩"></span>
</p>
<p data-th-each="student:${students}">
<span data-th-text="${student.name}"></span>-----
<span data-th-text="${student.score}"></span>
</p>
</div>
</body>
</html>