【Reggie】

加载静态资源:

需要加载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());
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值