在创建mapper层时,mybatis plus需要让接口继承BaseMapper< T>接口,其核心功能都封装在BaseMapper< T>接口中,T为表的实体类,并且不是需要xml文件。
为何Mybatis Plus的dao层没有使用.xml文件https://developer.aliyun.com/article/786177Mybatis Plus的自动填充
需求描述:
项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作。
在User表中添加datetime类型的新的字段 create_time、update_time
//实体上增加字段并添加自动填充注解
@TableField(fill = FieldFill.INSERT)
private Date createTime; //create_time,与Java中的驼峰命名法对应
//注意:如果createTime updateTime与数据库中的字段名对不上则会报错
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time
//注意:不要忘记添加 @Component 注解
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//mp执行添加操作,这个方法执行
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//mp执行修改操作,这个方法执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
Mybatis Plus逻辑删除实现
创建一个HospitalSetServiceImpl类去实现接口HospitalSetService(HospitalSetService接口继承的IService接口中有CRUD以及分页查询等方法)
package com.bupthyg.yygh.hosp.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bupthyg.yygh.hosp.mapper.HospitalSetMapper; import com.bupthyg.yygh.hosp.service.HospitalSetService; import com.bupthyg.yygh.model.hosp.HospitalSet; import org.springframework.stereotype.Service; @Service public class HospitalSetServiceImpl extends ServiceImplimplements HospitalSetService { }
@TableLogic注解表示逻辑删除:https://blog.csdn.net/qq_38080370/article/details/102613865
@TableLogic注解表示逻辑删除
效果:在字段上加上这个注解再执行BaseMapper的删除方法时,删除会变成修改。
结合项目,首先在表的实体类中,在要表示逻辑删除的字段上标注@TableLogic注解。
浏览器发出删除的请求传递给controller层
package com.bupthyg.yygh.hosp.controller;
import com.bupthyg.yygh.hosp.service.HospitalSetService;
import com.bupthyg.yygh.model.hosp.HospitalSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/admin/hosp/hospitalSet")
public class HospitalSetController {
//注入service
@Autowired
private HospitalSetService hospitalSetService;
//逻辑删除医院设置
@DeleteMapping("{id}")
public boolean removeHospSet(@PathVariable Long id){
boolean flag = hospitalSetService.removeById(id);
return flag;
}
}
controll调用service层,hospitalSetService实现的IService接口中含有removeById(id)方法,this.getBaseMapper().deleteById(id) 会调用BaseMapper接口中的删除方法
由于实体类逻辑删除字段加有@TableLogic注解,故不会执行删除sql
有注解走Update方法
SQL:Update table set isDelete = 1 where id = xxxx
@TableLogic注解参数
value = “” 未删除的值,默认值为0
delval = “” 删除后的值,默认值为1
@TableLogic(value=“原值”,delval=“改值”)
@TableLogicde 源码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface TableLogic {
String value() default "";
String delval() default "";
}
至此实现逻辑删除,实际就是update操作
项目结构扩展:BaseMapper接口
Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能https://blog.csdn.net/weixin_56770418/article/details/121681505
- 1.公共的方法进行抽取,抽取到BaseMapper接口中,将用户操作的方法对象,转化为数据库能够识别的SQL语句
- 2.通过userMapper查找父级接口BaseMapper
- 3.根据BaseMapper查找泛型对象User对象
- 4.根据user对象查找指定的注解@TableName,获取表明
- 5.根据user对象的属性,动态获取表中的字段
- 6.在获取字段的同事,获取属性的值,最后进行SQL的拼接
- 7.MP将拼接好的SQL交给Mybatis框架处理执行
所谓父子项目(工程),就是建立一个文件夹(父文件夹),其他项目(每个项目都是一个独立的文件夹)都在这个文件夹下,这些放在父文件夹下的文件成为子项目。为什么要建立父子项目,主要原因是,项目越建越多,为了便于文件的管理,减少相同代码的冗余。也便于maven架包的管理,当多个项目需要引入同一个架包时,只需要在父项目的pom文件中引入即可,其他子项目继承了父项目,也就不需要再引入了。
(https://blog.csdn.net/qq_43655835/article/details/103783600)
批量删除前后端实现:领域模型中的实体类分为四种类型:VO、DTO、DO、PO
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
前端:
适合做缓存的数据:不经常修改数据,固定数据,经常查询的数据
用户认证与网关整合 部分再详细梳理医院模拟端发送数据(Api文档中定义了要传送过来的数据),controller层接收到
BUG集中地 1.在子项目的service中的pom文件中spring-boot-maven-plugin插件爆红1.在model的service的pom文件中spring-boot-maven-plugin插件爆红,报错原因:Cannot resolve plugin org.springframework.boot:spring-boot-maven-plugin:解决办法,加入版本号(原本的默认模板没有添加版本号),版本号需要和你的springboot版本一致,父项目的pom文件中有版本信息。如何查询springboot版本:
在项目中打印一下就能看到了。
(https://blog.csdn.net/weixin_43923436/article/details/121394457)
String version = SpringBootVersion.getVersion();
修改为:
2. 在springboot启动之后,再停止,这时候如果修改了pom文件,就需要刷新maven,否则修改的不起作用 3.mysql5.5以下不能同时创建两个timestamp属性字段,create_time update_time 只能设置一个timestamp。org.springframework.boot spring-boot-maven-plugin 2.2.1.RELEASE
将update_time设置为timestamp属性字段(两个都设置datetime属性也行),create_time设置为datetime属性字段。之后对create_time字段进行如下操作:
mysql自动填充时间的两种实现方式
(使用mybatis_plus自动填充策略实现)在表实体类的create_time 字段上添加注解@TableField(fill = FieldFill.INSERT),之后编写处理器来处理这个注解即可,即配置填充策略。编写处理器类。
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "create_time",fill = FieldFill.INSERT)
private Date createTime;
编写处理器类:
跨域(CORS)产生原因分析与解决方案,这一次彻底搞懂它
什么是跨域?跨域产生原因与解决方法
注解@CrossOrigin详解
客户端的端口号为9528,当前页面的url是http://localhost:9528/#/hospSet/list,当他提交申请,访问被请求页面的的url时,由于提交的申请访问页面的端口号为8201,所以会产生跨域问题,访问不了。此时需要在controller层添加注解@CrossOrigin
linux下通过iptables只允许指定ip地址访问指定端口的设置方法
关于redis启动时linux的防火墙关闭问题解决
在已经注释掉bind 关闭防火墙的情况下外网仍然无法连接,排查发现未开放端口
如果iptables 没有开启6379端口,用这个方法开启端口
命令:/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
保存防火墙修改命令:/etc/rc.d/init.d/iptables save
连接以后,出现redis中java.io.IOException: 远程主机强迫关闭了一个现有的连接 错误解决办法:
这个错误,在redis的conf文件里大概在第130行的位置,这是改后的,之前是300,有的人是0,改成小一点的就好了
1、@Mapper注解:
作用:在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类
添加位置:接口类上面
@Mapper
public interface UserDAO {
//代码
}
2、@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
添加位置:是在Springboot启动类上面添加,
@SpringBootApplication
@MapperScan("com.winter.dao")
public class SpringbootMybatisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisDemoApplication.class, args);
}
}
添加@MapperScan(“com.winter.dao”)注解以后,com.winter.dao包下面的接口类,在编译之后都会生成相应的实现类
@GetMapping注解的理解
https://blog.csdn.net/qq_37924905/article/details/109137866
Spring的复杂性不是来自于它处理的对象,而是来自于自身,不断演进发展的Spring会带来时间维度上复杂性,比如SpringMVC以前版本的*@RequestMapping*,到了新版本被下面新注释替代,相当于增加的选项:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即*@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST*类型等。
如果我们想使用传统的*@RequestMapping*注释实现URL处理程序,那么它应该是这样的:
@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)
新方法可以简化为:
@GetMapping("/get/{id}")
@TableLogic注解表示逻辑删除
@TableField@TableLogic注解表示逻辑删除
@ApiModel和@ApiModelProperty使用详解@TableField
@TableField(exist = false) 注解
@TableField(exist = false) 注解加在bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样在新增等使用bean的时候,mybatis-plus就会忽略这个,不会报错。
否则会报一个如下的异常。
@ApiOperation注解说明@ApiModel和@ApiModelProperty使用详解
@ApiModel
使用场景:在实体类上边使用,标记类时swagger的解析类
@ApiModelProperty
使用场景:使用在被 @ApiModel 注解的模型类的属性上
@ResponseBody和@RequestBody@ApiOperation注解说明
Spring Boot中使用Swagger2构建强大的RESTful API文档
首先@ApiOperation注解不是Spring自带的,它是是swagger里的
注解@ApiOperation是用来构建Api文档的
@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response =
“接口返回参数类型”, notes = “接口发布说明”;其他参数可参考源码;
全局异常处理模块使用注解@ControllerAdvice @ExceptionHandler(Exception.class)@ResponseBody是什么,有什么作用
RequestBody和ResponseBody踩坑
全局异常处理
有时候不可避免服务器报错的情况,如果不配置异常处理机制,就会默认返回tomcat或者nginx的5XX页面,对普通用户来说,不太友好,用户也不懂什么情况。这时候需要我们程序员设计返回一个友好简单的格式给前端。处理办法如下:通过使用@ControllerAdvice来进行统一异常处理,@ExceptionHandler(value = RuntimeException.class)来指定捕获的Exception各个类型异常 ,这个异常的处理,是全局的,所有类似的异常,都会跑到这个地方处理。
@ControllerAdvice @ExceptionHandler(Exception.class)
@EnableCaching:启动缓存功能缓存@Cacheable@EnableCaching:启动缓存功能
@EnableCaching:标记注解 @EnableCaching,开启缓存,并配置Redis缓存管理器。@EnableCaching 注释触发后置处理器, 检查每一个Spring bean 的 public 方法是否存在缓存注解。如果找到这样的一个注释, 自动创建一个代理拦截方法调用和处理相应的缓存行为。
@Value 可以读取配置文件中的值根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
查看源码,属性值如下:
属性/方法名 解释
value 缓存名,必填,它指定了你的缓存存放在哪块命名空间
cacheNames 与 value 差不多,二选一即可
key 可选属性,可以使用 SpEL 标签自定义缓存的key
在msm短信服务中,由于类中要使用到application配置文件中的值,需要想办法读取到,此时在方法上使用@value注解
@controller 和@restcontroller 小知识点 1.springboot项目中有多个模块,一个模块下包含启动类,启动后,其余模块内同结构下内容也被扫描。springboot如何使用@Value获取配置文件的值
2.Spring Cache – KeyGenerator自定义rediskeypringboot项目中有多个模块,一个模块下包含启动类,启动后,其余模块内同结构下内容也被扫描?
举个例子,启动类所在包的相对路径是com.example.demo,其他模块下也有这个结构的包,那这些包下面的被注解的内容也会被扫描装进容器?我自己尝试了一下会被扫描,但不清楚原理,希望大佬解惑
springboot项目中有多个模块,一个模块下包含启动类,启动后,其余模块内同结构下内容也被扫描
3.修改Linux中docker容器中的MongoDB的端口号,以及映射到宿主机的端口号redis 学习
Spring Cache – KeyGenerator自定义rediskey
KeyGenerator 负责为缓存中的每个数据项生成每个键,这些键将用于在检索时查找数据项。
此处的默认实现是SimpleKeyGenerator–它使用提供的方法参数来生成密钥。这意味着,如果我们有两个使用相同的缓存名称和参数类型集的方法,则很有可能会导致冲突。
4.JWT和token的区别及优缺点修改Docker容器端口
JWT和token的区别及优缺点
token和jwt
nginx -> 网关
在Nginx切换gateway网关时,在配置好gateway配置文件后,启动启动类,发现80端口被占用,需要看看805端口被谁占用,并结束相应的进程,发现是nginx,需要结束ngnix进程。
Windows下如何查看某个端口被谁占用
大科室树形展示p92
一般项目环境搭建 p113



