部门目前做的一个项目是开发一个供内部测试人员使用的平台。使用的前端技术栈是react,后端技术栈是spring boot和spring cloud,并使用nginx做前后端的分离。
1. Bean的规范
service层的Bean和dao层的Bean经常不一样,为了规范:前者放在entity包下,后者放在dataObject包下。
2. timestamp比date字段好用
数据库时间字段timestamp非常好用,可以自动设置创建时间和更新时间。mysql数据库timestamp可以对应Java中属性的long类型。可以设置默认值CURRENT_TIMESTAMP,意思是插入时间是null时,自动设置时间为当前时间。
下面第一个图是设置字段gmt_create,类型是timestamp,长度是0,默认值是CURRENT_TIMESTAMP,On Update Current_Timestamp这里不勾选,表示时间只会在创建时设置,记录更新时不改变值。所以至始至终这个字段都表示创建时的时间,适合用来表示某条记录的创建时间。
下面第二个图是设置字段gmt_modify,类型也是timestamp,表示的是记录的更新时间,和前一个图不同的地方是需要勾选On Update Current_TimeStamp。作用是创建和每次更新记录都会更新时间。
timestamp和long类型转换
create_time是timestamp类型,需要映射为mybatis的long类型:
select unix_timestamp(create_time) as create_time from table
3. 善用BeanUtils.copyProperties(sourceBean,targetBean)
service层的Bean和dao层的Bean经常需要相互转换,这就需要属性值之间的复制,使用BeanUtils.copyProperties(sourceBean,targetBean)可以使代码看起来更加简洁。当然还有要注意的是,不同类型的属性之间不能转换,即使属性名相同也不行。
4. 善于Json和List之间的转换
List 转 Json(String):
import com.alibaba.fastjson.JSON;
String str = JSON.toJSONString(List<xxx>)
Json(String) 转 List :
import com.alibaba.fastjson.JSONObjcet;
List<xxx> list = (List<EnvGroupConf>)JSONObject.parseArray(String,xxx.class)
为什么要Json和List之间的转换?
答:我们知道数据库一个字段可以存各种类型的数据,但是有一种不能存,那就是对象。如果我们想在一个字段存对象集合(对象还更简单),可以将对象集合转化为json字符串再存储,取数据的时候再将Json字符串转化为对象集合。当然如果不那么做也可以,如为该对象新建一张表,但是有点麻烦的是可能要设置外键进行联表查询。使用Json字符串就没这个问题了。
5. 善用swagger2
好处
- 前后端分离开发;
- API文档非常明确;
- 测试的时候不需要再使用URL输入浏览器的方式来访问Controller;
- 传统的输入URL的测试方式对于post请求的传参比较麻烦(当然,可以使用postman这样的浏览器插件);
- spring-boot与swagger的集成简单;
6. mysql插入数据并返回自增的id
//插入数据后返回自增id
@Insert("insert into env (product_id, env_conf_id,name, stage, creatorCN,creatorPY) values (#{productId}, "+
"#{envConfId},#{name},#{stage}, #{creatorCN},#{creatorPY})")
@SelectKey(statement = "select last_insert_id()", keyProperty = "id", before =false, resultType = int.class)
int insert(EnvBean envBean);