java开发菜鸟学习和总结

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;
	}

}

 

你可能感兴趣的:(java开发菜鸟学习和总结)