ProjectDay01
Lombok简化开发
什么是lombok
它的功能是帮助我们简化数据封装类的编写
简单来说就是之前使用快捷键生成的get\set方法和toString等方法都可以省略了
根据上面图片显示,使用lombok之后代码量明显减少了
使用Lombok
使用Lombok之前要做两个准备工作
1.Idea按照Lombok插件
这个操作只需要配置一次,只要不重写安装Idea就不需要做第二次了
2.添加lombok依赖
这个操作时响应当前项目的,每个需要lombok支持的项目都需要添加依赖
步骤1:
安装插件
打开File>Settings>plugins
安装完插件需要重启idea
新版本的Idea是默认安装好lombok插件的,无需安装
步骤2:
添加lombok的依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
步骤3:
测试lombok的功能
创建一个包vo
包中新建一个类Message
代码如下
@Data
public class Message {private Integer id;private String name;private String content;
}
转到测试类中进行测试
@Test
void contextLoads() {Message msg=new Message();msg.setId(1);msg.setName("小二");msg.setContent("今天星期三?");System.out.println(msg.getContent());System.out.println(msg);}
输出结果为
今天星期三?
Message(id=1, name=小二, content=今天星期三?)
证明咱们的lombok成功的为Message类生成了get\set\toString方法
lombok功能详解
上面的示例中,我们只使用了@Data注解
但是lombok中还有很多其它注解,我们也要了解一下
- @Getter@Setter: 可以写在类上或单个属性上,表示为当前类中所有属性或标记的单个属性生成get\set方法
- @ToString:编写在类上,会自动重写toString方法,方法输出会包含当前类所有的属性和属性值信息
- @EqualsAndHashCode:编写在类上,自动重写Object类中的equals和hashcode方法
- @Data:编写在类上,是@Getter@Setter@ToString@EqualsAndHashCode注解功能的和
- @NoArgsConstructor:编写在类上,会自动生成这个类的无参构造
- @AllArgsConstructor:编写在类上,会自动生成这个类的全部参数的构造
- @Slf4j:编写在类上,会自动在当前类中添加一个能够记录日志的对象log,方便日志的编写
lombok的争议
因为lombok生成的代码不是写的
所以内部对代码生成的细节可能和我们预想的不同,导致违反公司或其它机构的代码规范,造成可能出现bug的隐患,所有有些公司开发中不允许使用lombok
我们在进入公司时需要观察现有的别人写的代码,根据实际情况决定是否使用lombok
knows项目git地址
https://gitee.com/jtzhanghl/knows2111.git
Mybatis Plus
什么是Mybatis Plus
Mybatis框架是我们学习过的框架
Mybatis Plus框架是在Mybatis框架基础上又扩展了一些功能的框架
相当于是Mybatis的加强版
在原有的功能基础上 ,针对实际开发的需求有薪增了很多方便我们操作数据库的功能和便利操作
Mybatis Plus依赖配置
我们现在继承的SpringBoot项目版本是2.3.12.RELEASE
这个版本的SpringBoot中,包含了很多常用框架的版本号
我们可以看到,我们添加的SpringMVC还有测试依赖,以及上面章节学习的lombok依赖都没有指定版本号
而MybatisPlus框架SpringBoot是没有内置版本号的,所以在添加依赖时,我们要定义版本号才能成功添加依赖并运行程序
但是一个父项目中有多个子项目,如果多个子项目都需要这个框架,那么会反复在项目中出现同一个版本号,这个版本号修改时会有维护困难
所以我们在父项目中定义版本号,在子项目中使用的办法类解决
转到父项目的pom.xml文件,修改pom文件如下
<properties><java.version>1.8</java.version><mybatis.plus.version>3.3.1</mybatis.plus.version>
</properties>
<packaging>pom</packaging>
<modules><module>knows-portal</module>
</modules>
<dependencyManagement><dependencies><!-- 下面定义了子项目在添加对应依赖时的版本号 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>${mybatis.plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis.plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis.plus.version}</version></dependency></dependencies>
</dependencyManagement>
子项目pom.xml文件添加依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/knows?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=root
SpringBoot启动类
// SpringBoot项目也是在Spring框架基础上创建的
// 它有Spring容器的概念,也有组件扫描的概念
// 实际上当前SpringBoot启动类就类似于我们创建的XXXConfig类
// 当前SpringBoot启动类会默认扫描当前类所在的包:cn.tedu.knows.portal
@SpringBootApplication
// 下面的注解是Mybatis框架包含的注解,指定一个包,包中的所有接口
// 都会被视为添加了@Mapper注解
@MapperScan("cn.tedu.knows.portal.mapper")
public class KnowsPortalApplication {public static void main(String[] args) {SpringApplication.run(KnowsPortalApplication.class, args);}}
MybatisPlus的使用一
MybatisPlus框架主要在Mybatis框架的基础上添加了两大功能
1.自动生成基本的增删改查操作
2.自动生成数据库表对应的相关代码
下面先来学习如何使用自动生成的基本增删改查方法
先在vo包中创建一个对应数据库的Tag类
这个Tag类对应tag表,代码如下
@Data
public class Tag {private Integer id;private String name;private String createby;private String createtime;
}
创建mapper包,包中创建TagMapper接口
代码如下
public interface TagMapper extends BaseMapper<Tag> {// 当前接口继承的BaseMapper接口// BaseMapper接口中包含了对指定表进行增删改查的方法// 而BaseMapper<Tag>中的<Tag>就是在指定表// 所以TagMapper会拥有父接口中包含的方法,既包含了对tag表的基本增删改查}
下面在测试类中测试
@Autowired(required = false)
TagMapper tagMapper;// 新增一个tag对象到数据库
@Test
public void add(){Tag tag=new Tag();tag.setId(21);tag.setName("微服务");tag.setCreateby("admin");tag.setCreatetime("2022-03-04 11:46:30");// 执行新增// 所有增删改操作都会返回一个int类型的返回值// 返回值的含义是本次sql语句对数据库影响的行数int num=tagMapper.insert(tag);if(num==1){System.out.println("新增成功");}else{System.out.println("新增失败");}
}
每次我们从Spring容器中获得Mapper对象时
都需要编写@Autowired(required = false)来避免编译错误
我们可以在TagMapper接口上添加@Repository注解来代替(required = false)的效果
这样的话我们就不需要每次获得Mapper都编写(required = false)了
接口中
@Repository
public interface TagMapper extends BaseMapper<Tag> {}
测试类中
@Autowired
TagMapper tagMapper;
// 按id查询对象
@Test
public void selectOne(){
Tag tag=tagMapper.selectById(1);
System.out.println(tag);
}
```java
// 查询表中全部信息
@Test
public void selectAll(){// selectList是查询返回多行的方法,返回值是list// 方法参数指定的是查询条件,当前条件为null也就是无条件,既全查List<Tag> tags=tagMapper.selectList(null);for(Tag t: tags){System.out.println(t);}
}
// 按id修改指定对象的属性
@Test
public void updateTag(){// 利用MybatisPlus框架实现按id修改行// 一般是先将要修改的数据按id查出来Tag tag=tagMapper.selectById(21);// 然后修改想修改的属性\列的值(不能修改id)tag.setName("分布式");tag.setCreateby("tom");// 然后执行修改,会将数据库中的行修改为设置好的新属性值int num=tagMapper.updateById(tag);System.out.println(num);}
// 按id删除行
@Test
public void delete(){// deleteById能够按照给定的id删除对应的行// 注意千万不要删除1~20号标签,数据库中需要int num=tagMapper.deleteById(21);System.out.println(num);
}
显示Mybatis运行的sql语句
上面章节中测试成功运行,但是我们并不清楚他们运行了什么样的sql语句
在实际开发中,我们会有需要看到运行的Sql语句的需要
实际上Mybatis框架在运行数据库操作时,已经将sql语句输出到日志中了
我们现在看不到是因为Mybatis输出的日志信息级别比较低,被SpringBoot忽略了
SpringBoot框架的控制台输出日志的级别从不重要到重要分为5个级别
- trace(痕迹):最不重要的
- debug(调试):不重要,程序员编写项目时的打桩输出会使用这个级别
- info(信息):一般,是程序运行的节点输出:例如例如完成了注册业务\新增业务等
- warn(警告):较重要,一般输出可能威胁程序正常运行的信息或隐患信息
- error(错误):最重要,程序运行过程中出现了异常,异常信息会以error级别输出到控制台
SpringBoot框架中,默认将info以及info以上级别的日志信息显示在控制台
而Debug级别以下的信息是不会显示在控制台的
Mybatis框架将sql语句输出到Debug级别SpringBoot控制台看不到
我们可以通过配置,让debug级别的日志信息显示在SpringBoot控制台上
portal项目的application.properties文件添加配置如下
# 修改指定范围内类的日志输出级别
# 这个修改也称之为"修改日志输出门槛"
# 我们希望当前项目的所有debug(以及debug以上)信息都能显示在控制台
logging.level.cn.tedu.knows.portal=debug
MybatisPlus的使用二
MybatisPlus框架添加的比较重要的第二个功能就是"代码生成器"
我们在开发项目时,每一个数据表都要创建其对应的一套java文件(类)
以user表为例
User(实体类)
UserController(控制器)
UserMapper(数据访问)
IUserService(业务接口) UserServiceImpl(业务实现)
一个表就对应5个类,knows14张表要创建70个类
这样的工作工作量大,内容重复,没有技术含量,浪费时间
MybatisPlus给我们提供了直接生成它们的解决方案
下面我们就来完成这个生成的过程
因为生成的过程是一次性的,所以建议大家创建一个新的项目
来完成这个工作
新建聚合子项目knows-generator
不用勾选任何内容直接创建
父子相认
<modules><module>knows-portal</module><module>knows-generator</module>
</modules>
子项目pom.xml文件修改后
<?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.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>cn.tedu</groupId><artifactId>knows</artifactId><version>0.0.1-SNAPSHOT</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.tedu</groupId><artifactId>knows-generator</artifactId><version>0.0.1-SNAPSHOT</version><name>knows-generator</name><description>Demo project for Spring Boot</description><dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies></project>
删除generator项目的test文件夹
删除SpringBoot启动类
在现有的cn.tedu.knows.generator包中创建一个CodeGenerator类
从苍老师网站复制这个代码
需要一些调整,将其中的straw都修改为knows
修改之后配置如下
//数据库连接参数
public static String driver = "com.mysql.cj.jdbc.Driver";
public static String url = "jdbc:mysql://localhost:3306/knows?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
public static String username="root";
public static String password="root";
//父级别包名称
public static String parentPackage = "cn.tedu.knows";
//代码生成的目标路径
public static String generateTo = "/knows-generator/src/main/java";
//mapper.xml的生成路径
public static String mapperXmlPath = "/knows-generator/src/main/resources/mapper";
//控制器的公共基类,用于抽象控制器的公共方法,null值表示没有父类
public static String baseControllerClassName ;// = "cn.tedu.straw.portal.base.BaseController";
//业务层的公共基类,用于抽象公共方法
public static String baseServiceClassName ; // = "cn.tedu.straw.portal.base.BaseServiceImpl";
//作者名
public static String author = "tedu.cn";
//模块名称,用于组成包名
public static String modelName = "portal";
//Mapper接口的模板文件,不用写后缀 .ftl
public static String mapperTempalte = "/ftl/mapper.java";
最后还需要一个模板文件
也在苍老师网站中获得
我们需要在resources文件夹下创建ftl的文件夹
在ftl文件夹在创建一个mapper.java.ftl的文件
内容直接复制苍老师网站
最后开始文件的生成
打开CodeGenerator类,找到并运行类中的main方法
运行后在控制台输入"all",表示生成数据中全部表的信息
然后等待运行完毕
上generator项目中的cn.tedu.knows.portal包中的四个包复制
粘贴到portal项目中cn.tedu.knows.portal包下(事先删除原有的mapper包)
然后回答generator项目删除cn.tedu.knows.portal包即可
当前项目生成的代码已经作用下portal项目中,并且项目不报错
测试生成的代码
下面要测试一下我们生成的代码是否能够正常运行
为了保证我们现在的程序不受前面编写代码的干扰
删除vo包和测试包中默认提供的KnowsPortalApplicationTests
下面进行Mapper的测试
在test文件夹中新建一个测试类TagTest
代码如下
// SpringBoot环境下的测试类运行必须添加这个注解
@SpringBootTest
public class TagTest {@AutowiredTagMapper tagMapper;@Testpublic void getAll(){List<Tag> tags=tagMapper.selectList(null);for(Tag t:tags){System.out.println(t);}}}
然后要测试控制器方法
在UserController类中编写一个方法用于测试
代码如下
@RestController
@RequestMapping("/v1/users")
public class UserController {// @RequestMapping("/v1/users")写在类上// 表示当前控制器中的任何方法都要以/v1/users开头// @GetMapping表示下面的控制器方法接受处理get请求// ("/demo")表示要访问这个控制器方法的路径,当然要/v1/users之后// 最终要访问到这个控制器方法// 必须使用get方式请求/v1/users/demo@GetMapping("/demo")public String demo(){return "Hello Demo!!!";}}
重新启动portal项目
打开浏览器,在浏览器地址栏输入
localhost:8080/v1/users/demo
观察浏览器的显示结果
Spring 安全框架
什么是Spring安全框架
Spring安全:Spring-Security
是Spring框架提供的一个用于安全管理的框架
它能够提供一个安全可靠的登录逻辑,我们实现登录只需要按照它的要求编写一些实现和配置信息就可以开发出企业级安全的登录功能
使新手程序员也能编写出可靠的登录代码
Spring-Security还提供了权限管理功能,能判断某些用户是否可以允许某些功能
例如:学生是不能回答问题的,讲师可以回答问题,Spring-Security会对这个身份\权限进行判断
启动Spring-Security
启动Spring-Security添加依赖即可
portal项目的pom.xml文件中添加依赖如下
<!-- Spring Security -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
一旦添加依赖,在启动当前项目时,Spring-Security的功能也会随之生效
在访问当前项目的任何资源,都需要先登录才能访问
默认登录方式:
在启动服务时,在控制台中会看到一个生成的随机的uuid密码
登录时使用用户名user
密码就是这个uuid
登录页面也是Spring-Security框架提供的
无论访问什么资源,页面或控制器方法,都必须先登录才能访问
但是只要登录成功,当前网站的资源就可以随意访问了
自定义用户名密码
我们可以在application.properties配置中添加自定义登录用户名和密码
一旦设置这个自定义的用户名和密码,Spring-Security就不会在生成随机的uuid密码了(user用户也作废)
# Spring-Security自定义登录用户名和密码的配置
spring.security.user.name=admin
spring.security.user.password=123456
重启项目,就可以使用配置的用户来登录了
但是这样保存密码太不安全了
因为任何可以看到配置文件的人都可以知道密码来登录系统
怎么实现即使让别人看到密码也不知道真正的密码呢?
使用密码加密
密码加密
加密算法就是将原数据经过一系列计算而得到的另一个新数据的过程
我们常见的加密算法bcrypt,md5,sha
我们课程中使用现在比较流行的bcrypt
随笔
VO:(View Object\视图对象)
一般用于非对应数据库时使用的数据封装对象
企业中实体类包名可能有很多种
entity,model,bean,pojo,domain
50*123
6150
50
ACBDC
BDCAD
英文
required:必要的
generator:生成器
Security:安全 ☆☆☆☆☆☆
ProjectDay01相关推荐
最新文章
- Dos批处理常用命令大全入门
- TeamLab安装及使用
- 【LeetCode】376. 摆动序列(图解)
- sql 注入 相关函数
- sklearn、theano、TensorFlow 以及 theras 的理解
- hashcode是什么意思_面试官:说一下HashMap原理,为什么会产生死循环
- tiny core linux 7.1,极度简约 最小 Linux 发行版 Tiny Core Linux 7.1 发布
- vj p1038题解
- 数据结构--最小生成树详解
- selenium自动化中停止页面加载
- Android作业分组与选题
- 提高生活、学习、工作效率的方法——时间管理Vs个人管理
- ftt传感器_锥形量热仪FTT和CONE型号差异分析
- 鸿蒙跨屏协作实现原理,跨屏协作满足效率党 高效工作这几款手机必备
- C语言程序设计-现代方法 第二版 第6.1小节 显示平方表
- MySQL-日期处理
- Stduino学习(二十四)敲击传感器模块
- Airtest入门案例-操作网易云音乐
- 阿龙的学习笔记---C++后端开发学习路线梳理、阶段性总结
- python进阶(十)_mysql数据查询