总结用到的Git基本命令如下:
命令 |
说明 |
git clone [仓库地址] |
克隆远程仓库到本地 |
git branch -a |
查看所有分支 |
git checkout -b [本地分支] origin/[远程分支] |
取远程分支放到本地新建分支上 |
git config --global user.name [名字] git config --global user.email [邮箱] |
全局配置用户信息 |
git branch --set-upstream [本地分支] origin/[远程分支] |
本地分支与远程分支建立关联 |
git add |
本地文件系统的修改记录到git |
git commit -m [提交说明] |
提交修改到本地仓库 |
git pull [远程主机名] [远程分支名]:[本地分支名] |
将远程分支同步到本地并与本地分支合并 |
git push [远程主机名] [本地分支名]:[远程分支名] |
本地分支提交到远程仓库 |
git stash |
暂存当前正在进行的工作到栈中 |
git stash list |
列出栈中内容 |
git stash pop |
从栈中恢复工作,并与当前分支合并 |
Git的基本命令请参考http://www.ruanyifeng.com/blog/2014/06/git_remote.html。
Git的规范流程如下,参考http://www.ruanyifeng.com/blog/2015/08/git-use-process.html。
Git rebase与Git merge都是合并分支,其区别在于。
Git merge是将两个分支直接合并。
Git rebase会将把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。
Git与SVN的区别参考http://blog.jobbole.com/31444/。主要有以下几点:
1. GIT是分布式的,SVN不是。
2. GIT把内容按元数据方式存储,而SVN是按文件。
3. GIT分支和SVN的分支不同。
4. GIT没有一个全局的版本号,而SVN有。
5. GIT的内容完整性要优于SVN。
参考https://stackoverflow.com/questions/409286/should-i-use-field-datetime-or-timestamp。
TIMESTAMP:
l 4个字节储存(Time stamp value is stored in 4 bytes),TIMESTAMP值不能早于1970或晚于2037年。
l 值以UTC格式保存( it stores the number of milliseconds ,存储时对当前的时区进行转换,检索时再转换回当前的时区。
l TIMESTAMP类型在默认情况下,insert、update 数据时,TIMESTAMP列会自动以当前时间(CURRENT_TIMESTAMP)填充/更新。
datetime:
l 8个字节储存(8 bytes storage),支持的范围为''1000-01-01 00:00:00''到''9999-12-31 23:59:59''
l 实际格式储存(Just stores what you have stored and retrieves the same thing which you have stored.)
l 与时区无关(It has nothing to deal with the TIMEZONE and Conversion.)
基本思路是,在Service层定义异常,判断异常并往上层抛出;Manager层继续向上层抛出,Controller层捕获异常进行相应处理。
例如,根据省份code查询城市时,如果省份code不存在时,查出的城市列表为空列表。此时需要定义异常。
在misc的exception包中MiscErrorCode增加一条错误Code。
在Service层进行异常判断,抛出异常。
@Override
public List<DTO> queryMetaByCode (Long code) throws MiscServiceException {
if(code == null) throw new MiscServiceException("code参数为空", MiscErrorCode.MISS_PARAM);
List<Meta> metaList = cityDao. listByCode (code);
if(metaList == null || metaList.isEmpty()) throw new MiscServiceException(("查询结果为空"), MiscErrorCode.CITY_NOT_FOUND);
return ConvertUtils.convertList(metaList, DTO.class);
}
}
在Manager层继续向上抛出异常。
try {
return ResponseView.success(AreaConvertUtils.convertCityBOVO(manager. queryMetaByCode (code)));
} catch (MiscServiceException e) {
log.error(e.getErrorLog());
return ResponseView.fail(e.getErrorCode(), e.getErrorMessage());
}
此处的解释不止适用于VO/BO,同样适用于其他Object之间的转换。
分为两种情况:
1. VO只包含BO中部分同名属性。
例如VO中的属性为A,B,C;BO中的属性为A,B,C,D。此时可以直接使用Spring提供的BeanUtils:
BeanUtils.copyProperties(t, v);
即将t中的对应属性拷贝到v中,忽略t中存在而v中没有定义的属性。
2. VO中的属性没有被BO中的属性完全覆盖。
例如VO中的属性为AA,BB,CC;BO中的属性为A,B,C。名字不一样。
此时,你就需要手写转换类了。
VO convert(BO bo, VO vo) {
vo.setProperties(bo.getProperties());
return vo;
});
也可以写一个泛型类用于通用的类型转换:
public static <V, T> V convert(T t, V v, IConvert<T,V> convert) {
BeanUtils.copyProperties(t, v);
if (null == convert) {
return v;
}
return convert.convert(t, v);
}
其中IConvert是一个接口,该接口定义如下:
public interface IConvert <T,V> {
V convert(T t, V v);
}
调用convert方法时,可以实现自己的转换类。
例如:
public static VO convert(BO bo, VO vo) {
return ConvertUtils.convert(bo, vo, new ConvertUtils.IConvert<BO, VO>() {
@Override
public VO convert(BO bo, VO vo) {
vo.setProperties(bo.getProperties());
return vo;
}
});
}
上一节的转换类,可以使用java8 lambda表达式形式来写:
public static VO convert(BO bo, VO vo) {
return ConvertUtils.convert(bo, vo, (bo, vo) -> {
vo.setProerties(bo.getProerties());
return vo;
});
}
lambda表达式还有很多用法,比如用在ForEach循环中,有待积累。
快捷键 |
作用 |
Ctrl+鼠标左键 |
溯源 |
Alt+Insert |
自动生成 |
Alt+Enter |
导入包,自动更正 |
Alt+/ |
自动补全(Eclipse风格,Intellij风格为Ctrl+空格) |
Ctrl+Alt+左箭头 |
后退 |
Ctrl+Alt+右箭头 |
前进 |
Ctrl+Alt+H |
查找引用树 |
Ctrl+Alt+O |
格式化import列表 |
Ctrl+Alt+L |
格式化代码 |
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者葛志诚授权发布。