加载静态资源:
需要加载idea中的静态资源时,需要让一个config类继承WebMvcConfigurationSupport,
使用addResourceHeaders方法,实现addResourceHeadler(“/…/**”).addResourceLocaltion(“classpath:/…/”)
开启驼峰命名:
需要在application.yml文件中设置
mybatis-puls:
configration:
map-underscore-to-camel-case:true
mybatis-plus的mapper类与service类的设计规则(实体类以Employee为例):
EmployeeMapper extend BaseMappper<Employee>
EmployeeService extend IService<Employee>
EmployeeServiceImpl extend ServiceImpl<EmployeeMapper,Employee> implements EmployeeService
对密码password进行md5加密处理:
DigestUtiles.md5DigestAsHex(password.getBytes());
对条件进行封装(以查询Employee的username为例):
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(根据用户名Employee::getUsername , 传入进来的用户名employee.getName());
@WebFilter(filterName = “名称”,urlPatterns = “/*”)筛选器:
需要实现一个Filter接口并重写doFilter类
匹配器: public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
匹配器有一个方法 .match (匹配成功为true 失败为false)
获取异常处理的信息时:
异常包括信息 exception.getMessage().contaions(“包含的信息”);
可以使用数组去接收,String[] split = exception.getMessage().split(“设置信息中的分隔符”);
有关ThreadLocal:
ThreadLocal并不是一个Thread,而是Thread的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
ThreadLocal常用方法: | 说明 |
---|---|
public void set(T value) | 设置当前线程的线程局部变量的值 |
public T get() | 返回当前线程所对应的线程局部变量的值 |
自动字段补充
首先需要在需要自动补充的实体类的字段中加入@TableField(fill = FieldFill.INSERT_UPDATE)或者只有更新。
之后需要编辑一个自动补充的类,继承MetaObjectHandler,重写他的更新插入方法,在方法中使用setValue(“填充字段的名称”,填充字段的数据);的方法对字段进行填充。
如果需要填充的数据需要获取一些可能出错的信息(如项目中long类型的id),就可以使用ThreadLocal对应类中的方法用线程获取信息.
上传文件
在controller层传入数据时,参数类型为MultipartFile file
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
原始文件名file.getOriginalFilename();
//获取原文件名的后缀.jpg的数值
suffix = orginaFilename.substring(原文件名.lastIndexOf("."));
//使用UUID重新生成文件名,防止文件名称重复造成文件覆盖
UUID.randomUUID().toString() + suffix;
//将文件转存到指定位置,此路径可在yml中配置,后续可在此类中用@Value("${...}") 获取信息
file.transferTo(new File(路径+orginalFilename));
//创建一个目录对象;判断当前目录是否存在
File dir = new File(路径);
if(!dir.exists()){
//目录不存在
dir.mkdirs();
}
//将图片转化成一个新文件重新命名并储存
file.transferTo(new File(图片地址+ 图片名称));
文件下载
//创建输入流
FileInputStream fileInputStream = new FileInputStream(new File(pathImg + name));
//输出流,通过输出就可以在浏览器相应图片了
ServletOutputStream outputStream = response.getOutputStream();
//表示这是一个图片
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1024];
//读取图片数据
while ( (len = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
//关闭资源
outputStream.close();
fileInputStream.close();
一个业务同时操作两个数据库
前端传入参数的数据包含了两个数据库表的数据,这时候仅靠一个实体类是获取不到部分信息的,所以需要重新写一个DTO用于封装页面提交的数据。
DTO:全称Data Transfer Object,即数据传输对象,一般用于展示层与服务层之间的数据传输。
如果dish类是主表,dish_Flavor中是附表,其中有dish_id与dish表中的id相对应,那么可以写一个新的dto类用于继承dish类,该类中有DishFlavor的属性:
private List<DishFlavor> flavors = new ArrayList<>();
在Service层中定义方法时,因为涉及到了其他表,所以也要将其他表的Service进行自动注入。
因为在添加菜品这个操作中,dishflavor会丢失dish_id这个数据,所以在此方法中需要重新获取
Long dishId = dishDto.getId();//菜品id
//菜品口味
List<DishFlavor> flavors = dishDto.getFlavors();
//遍历
flavors = flavors.stream().map((item) -> {
item.setDishId(dishId);
return item;
}).collect(Collectors.toList());