1.springMvc使用与注意事项
①前台未传入参数,可以通过@RequestParam进行默认
//SpringMvc中control层接受参数的时候可以直接使用@RequestParam()对其设定默认值。
//假如前台未传入分页的参数,那么我们可以默认
@RequestMapping("/findByCondition")
public Status findByCondition(@RequestParam(defaultValue = "10") Integer pageSize,@RequestParam(defaultValue = "1") Integer pageNo) {
return null;
}
②接收json字符串的时候需要@RequestBody进行接收
//如果前台传过来的数据是json格式的字符串,那么使用@RequestBody进行接收,否则无法接收到参数
@RequestMapping("/update")
public Status updateArcTypeInfo(@RequestBody PageDto page) {
arcTypeInfoService.updateArcTypeInfo(page.getEntity());
return new Status();
}
③接口中所有接口方法都返回json格式,@RestController
//在接口层,如果所有的方法都返回json格式的数据,那么就可以用 @RestController使所有的方法都返回位json格式
//如果只是个别的话,也可以使用 @ResponseBody
//需要注意的是:@RestController是打在类上的标签,而@RequestMapping是打在方法上面的
@RestController
@RequestMapping("/system/arcType")
public class ArcTypeContorller {
}
2.mybatis的使用与注意事项
①mapper层设置参数名称
//Mabatise的mapper层,如果需要传入多个参数,而不是一个对象,那么久必须使用@Param对其进行命名,因为在xml中使用的只是一个占位符
public List findAll(@Param(value = "checkImageDataID") Long CheckImageDataID,@Param(value = "imageIndex") Long ImageIndex, @Param(value = "ids") List ids);
②xml中的调用
③大于小于等符号的使用
and r.CheckTime =]]>#{beginDateTime}
and r.CheckTime #{endDateTime}
<,<=,>,>=,&,',"
依次对应的是:< <= > >= & ' "
④mybatis返回主键:
方式一:
insert into
LocoMileage(groupid,locomileage,recordtime,remark) values
(#{groupid},#{locomileage},#{recordtime},#{remark})
方式二:
//insert语句本身是无返回的,加上selectKey标签之后,可以使其在插入之后返回主键
select LAST_INSERT_ID()
insert into
LocoMileage(groupid,locomileage,recordtime,remark) values
(#{groupid},#{locomileage},#{recordtime},#{remark})
注意:
要获取id,在插入过后,通过对象的方法获得eg:
// 成功的条数
Integer insertOne = service.insertOne(locoMileage);
// 这里才是返回的主键id
Long id= locoMileage.getId();
3.日期格式化的使用与注意事项
//当时还遇到一个问题,就是前台传入的时间格式是 eg:2017-12-04T18:07:57000Z,需要在前台格式化,我们是用的vue加element,有一个format属性可以设置时间的格式
//取出来的时候,需要设置时区,否则会少8个小时
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
public Date getCheckTime() {
return checkTime;
}
//设置的时候不需要设置时区
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public void setCheckTime(Date checkTime) {
this.checkTime = checkTime;
}
4.springBoot中使用aop
注意:
1.在切到service层的时候,可能会出现一个无限调用的情况,导致堆栈溢出,这个时候一定要注意把你保存日志的service排除掉。
2.在切点里面,所有的方法,都必须是protect或者是public修饰的,否则会报错
/** * @Aspect标识位切面 * @Component交给spring管理,注入成一个bean * */ @Aspect @Component public class WebLogAspect { private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); //配置切点,一般来说会配置到service层 两个..代表所有子目录,最后括号里的两个..代表所有参数 @Pointcut("execution( * com.dh.web.*.*(..))") public void logPointCut() { } @Before("logPointCut()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 logger.info("请求地址 : " + request.getRequestURL().toString()); logger.info("HTTP METHOD : " + request.getMethod()); // 获取真实的ip地址 // logger.info("IP : " + IPAddressUtil.getClientIpAddress(request)); logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); logger.info("参数 : " + Arrays.toString(joinPoint.getArgs())); // loggger.info("参数 : " + joinPoint.getArgs()); } @AfterReturning(returning = "ret", pointcut = "logPointCut()") // returning的值和doAfterReturning的参数名一致 public void doAfterReturning(Object ret) throws Throwable { // 处理完请求,返回内容(返回值太复杂时,打印的是物理存储空间的地址) logger.debug("返回值 : " + ret); } @Around("logPointCut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { long startTime = System.currentTimeMillis(); Object ob = pjp.proceed();// ob 为方法的返回值 logger.info("耗时 : " + (System.currentTimeMillis() - startTime)); return ob; } }
5.位运算在项目中的应用
①先讲一个简单的例子:
Eg:足球 羽毛球 乒乓球 篮球 游泳
如果按照整数的形式去定义,那就有无数多种情况,毕竟可以两两组合嘛。
但是如果用位运算去做的话,那么就可以直接表示为:
假如喜欢足球的话,那么在足球定义的那一位上就标记成1,否则位0
那么 0 0 1 1 1则表示不喜欢足球和羽毛球,喜欢乒乓球和篮球还有游泳的。
②判断是否存在该状态:
//使用与运算去判断是否存在该状态
public Boolean isStatu(Integer status){
return (this.status & status)>0;
}
eg:
喜欢足球的状态是:1 0 0 0 0
小明的喜好: 0 1 0 1 0
与计算的结果为0 0 0 0 0,返回位false,所以小明不存在喜好足球的状态
③添加某种状态:
//在原来的基础上添加某种状态
public void addStatu(Integer status){
this.status=this.status | status;
}
eg:
喜欢足球: 1 0 0 0 0
小明的喜好: 0 1 0 1 0
或运算之后: 1 1 0 1 0
④移除某种状态:
//移除某种状态
public void remove(Integer status){
this.status=this.status & ~status;
}
eg:
(传入)喜好足球 : 1 0 0 0 0
小明的喜好: 1 0 1 0 1
足球取~ : 0 1 1 1 1
与运算: 0 0 1 0 1
⑤注意事项:
在位运算中,一位代表的数位2的n-1次方。
6.使用spring时的注意事项
在之前对接京东物流的时候,遇到了一个问题,他们提供sdk给我们可以直接使用,我只想用这个sdk创建一次客户端,之后可以重复使用。需要一些属性,放在properties中,然后使用@value进行注入。
最开始的版本导致了一个问题:我的属性还没有注入进来的时候,客户端已经new出来了,所以说创建所需要的字段全是null的。
这是因为spring中bean的生命周期是先创建在注入。
//最开始的版本是这样的
private JdClient client = new DefaultJdClient(SERVER_URL, accessToken, appKey, appSecret);
public JdClient getJdClient() {
return this.client;
}
@Component
public class JDUtils {
private static final Logger logger = LoggerFactory.getLogger(JDUtils.class);
private static String SERVER_URL;
private static String appKey;
private static String appSecret;
private static String accessToken;
private static JdClient client = null;
//提供静态方法去创建一个jd的客户端
public static JdClient getJdClient() {
if (Objects.isNull(client)) {
client = new DefaultJdClient(SERVER_URL, accessToken, appKey, appSecret);
}
return client;
}
@Value("${jd.url}")
public void setSERVER_URL(String sERVER_URL) {
SERVER_URL = sERVER_URL;
}
@Value("${jd.appkey}")
public void setAppKey(String appKey) {
this.appKey = appKey;
}
@Value("${jd.appSecret}")
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
@Value("${jd.accessToken}")
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
}