【JavaWeb学习Day14】
Tlias智能学习系统
04新增部门
思路分析:
明确了查询部门的需求之后,再来梳理一下实现该功能时,三层架构每一层的职责:
Controller:1.接收请求参数 2.调用service层 3.响应结果
Service:1.补全基础属性。2.调用Mapper接口方法
Mapper:insert into dept (name,create_time,update_time) values (?,?,?);(SQL)
代码实现:
1). Controller层
接收json格式的请求参数:POST /depts {"name":"教研部"}
JSON格式的参数,通常会使用一个实体对象进行接收。
规则:JSON数据的键名与方法形参对象的属性名相同,并需要使用@RequestBody注解标识。
/**
* 新增部门
*/
@PostMapping("/depts")
public Result add(@RequestBody Dept dept){
System.out.println("新增部门:"+dept);
return Result.success();
}
2). Service层
@Override
public void add(Dept dept) {
//1.补全基础属性:createTime,updateTime
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
//2.调用Mapper接口方法插入数据
daotMapper.insert(dept);
}
3). Mapper层
/**
* 新增部门
*/
@Insert("insert into dept (name,create_time,update_time) values (#{name},#{createTime},#{updateTime});")
void insert(Dept dept);
05修改部门
需求分析:
1.查询回显
思路分析:
明确了查询部门的需求之后,再来梳理一下实现该功能时,三层架构每一层的职责:
Controller:1.接收请求参数(路径参数) 2.调用service层 3.响应结果
Service:调用Mapper接口方法
Mapper:select * from dept where id = ?;(SQL)
代码实现:
1). Controller层
接收请求参数(路径参数):GET /dept/1
路径参数:通过URL直接传递参数,使用{...}来识别该路径参数,需要使用@PathVariable获取
/**
* 根据ID查询部门
*/
// @GetMapping("/depts/{id}")
// public Result getInfo(@PathVariable("id") Integer deptId){
// System.out.println("根据ID查询部门:"+deptId);
// return Result.success();
// }
@GetMapping("/depts/{id}")
public Result getInfo(@PathVariable Integer id){
System.out.println("根据ID查询部门:"+ id);
Dept dept = deptService.getById(id);
return Result.success(dept);
}
2). Service层
@Override
public Dept getById(Integer id) {
return daotMapper.getById(id);
}
3). Mapper层
/**
* 根据ID查询部门数据
*/
@Select("select id, name, create_time, update_time from dept where id = #{id};")
Dept getById(Integer id);
2.修改数据
思路分析:
明确了查询部门的需求之后,再来梳理一下实现该功能时,三层架构每一层的职责:
Controller:1.接收请求参数(json参数) 2.调用service层 3.响应结果
Service:1.补全基础属性。2.调用Mapper接口方法。
Mapper:update dept set name = ? ,update_time=? where id =?;(SQL)
代码实现:
1). Controller层
接收json格式的请求参数:POST /depts {"id":8,"name":"财务部"}
JSON格式的参数,通常会使用一个实体对象进行接收。
规则:JSON数据的键名与方法形参对象的属性名相同,并需要使用@RequestBody注解标识。
/**
* 修改部门
*/
@PutMapping("/depts")
public Result update(@RequestBody Dept dept){
System.out.println("修改部门"+dept);
deptService.update(dept);
return Result.success();
}
2). Service层
@Override
public void update(Dept dept) {
//1.补全基础属性:updateTime
dept.setUpdateTime(LocalDateTime.now());
//2.调用Mapper接口方法更新部门
deptMapper.update(dept);
}
3). Mapper层
/**
* 更新部门
* @param dept
*/
@Update("update dept set name = #{name} ,update_time=#{updateTime} where id =#{id};")
void update(Dept dept);
06日志技术
简介:
定义:程序中的日志,是用来记录应用程序的运行信息、状态信息、错误信息等。
作用:数据追踪、新能优化、问题排查、系统监控
技术:
1.JUL(java.util.logging):这是javaSE平台提供的官方日志框架,也被称为JUL。配置相对简单,性能较差。
2.Log4j:一个流行的日志框架,提供了灵活的配置选项,支持多种输出目标。
3.Logback:基础Log4j升级而来,提供了更多的功能和配置选项,性能优于Log4j。
4.Slf4j(Simple Logging Facede for Java):简单日志门面,提供了一套日志操作的标准接口和抽象类,允许应用程序使用不同的底层日志框架。
Logback快速入门:
准备工作:引入logback的依赖(springboot项目中该依赖已经传递)、配置文件logback.xml。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %logger{50}: 最长50个字符(超出.切割) %msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
记录日志:定义日志记录对象Logger,记录日志。
package com.itheima;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDateTime;
public class LogTest {
private static final Logger log = LoggerFactory.getLogger(LogTest.class);
@Test
public void testLog(){
//System.out.println(LocalDateTime.now() + " : 开始计算...");
log.debug("开始计算...");
int sum = 0;
int[] nums = {1, 5, 3, 2, 1, 4, 5, 4, 6, 7, 4, 34, 2, 23};
for (int num : nums) {
sum += num;
}
log.info("计算结果为"+sum);
//System.out.println("计算结果为: "+sum);
//System.out.println(LocalDateTime.now() + "结束计算...");
log.debug("结束计算...");
}
}
private static final Logger log = LoggerFactory.getLogger(LogTest.class);(固定)
Logback配置文件详解:
配置文件名:logback.xml
该配置文件是对logback日志框架输出的日志进行控制的,可以采用配置输出的格式、位置以及日志开关等。
常用的两种输出日志的位置:控制台、系统文件
开启日志(ALL),关闭日志(OFF)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%logger显示日志记录器的名称, %msg表示日志消息,%n表示换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
</encoder>
</appender>
<!-- 系统文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件输出的文件名, %i表示序号 -->
<FileNamePattern>D:/tlias-%d{yyyy-MM-dd}-%i.log</FileNamePattern>
<!-- 最多保留的历史日志文件数量 -->
<MaxHistory>30</MaxHistory>
<!-- 最大文件大小,超过这个大小会触发滚动到新文件,默认为 10MB -->
<maxFileSize>10MB</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d 表示日期,%thread 表示线程名,%-5level表示级别从左显示5个字符宽度,%msg表示日志消息,%n表示换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n</pattern>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="ALL">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
Logback日志级别:
日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(优先级由低到高):
日志级别 | 说明 | 记录方式 |
---|---|---|
trace | 追踪,记录程序运行轨迹 【使用很少】 | log.trace("...") |
debug | 调试,记录程序调试过程中的信息,实际应用中一般将其视为最低级别 【使用较多】 | log.debug("...") |
info | 记录一般信息,描述程序运行的关键事件,如:网络连接、io操作 【使用较多】 | log.info("...") |
warn | 警告信息,记录潜在有害的情况 【使用较多】 | log.warn("...") |
error | 错误信息 【使用较多】 | log.error("...") |
可以在配置文件logback.xml
中,灵活的控制输出那些类型的日志。(大于等于配置的日志级别的日志才会输出)
<!-- 日志输出级别 -->
<root level="info">
<!--输出到控制台-->
<appender-ref ref="STDOUT" />
<!--输出到文件-->
<appender-ref ref="FILE" />
</root>