分类 技术类 下的文章

Spring Data JPA 简单查询--方法定义规则(详解)

一、常用规则速查

关键词 意思
And 并且
Or
Is,Equals 等于
Between 两者之间
LessThan 小于
LessThanEqual 小于等于
GreaterThan 大于
GreaterThanEqual 大于等于
After 之后(时间) >
Before 之前(时间) <
IsNull 等于Null
IsNotNull,NotNull 不等于Null
Like 模糊查询。查询件中需要自己加 %
NotLike 不在模糊范围内。查询件中需要自己加 %
StartingWith 以某开头
EndingWith 以某结束
Containing 包含某
OrderBy 排序
Not 不等于
In 某范围内
NotIn 某范围外
True
False
IgnoreCase 忽略大小写

二、Spring Data 解析方法名--规则说明

1、规则描述

按照Spring data 定义的规则,查询方法以find|read|get开头(比如 findfindByreadreadBygetgetBy),涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性首字母需大写。框架在进行方法名解析时,会先把方法名多余的前缀截取掉,然后对剩下部分进行解析。

如果方法的最后一个参数是 Sort 或者 Pageable 类型,也会提取相关的信息,以便按规则进行排序或者分页查询。

2、举例说明

比如 findByUserAddressZip()。框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,详细规则如下(此处假设该方法针对的域对象为 AccountInfo 类型):

先判断 userAddressZip (根据 POJO 规范,首字母变为小写,下同)是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

从右往左截取第一个大写字母开头的字符串(此处为 Zip),然后检查剩下的字符串是否为 AccountInfo 的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 userAccountInfo 的一个属性;

接着处理剩下部分(AddressZip),先判断 user 所对应的类型是否有 addressZip 属性,如果有,则表示该方法最终是根据 "AccountInfo.user.addressZip" 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 "AccountInfo.user.address.zip" 的值进行查询。

可能会存在一种特殊情况,比如 AccountInfo 包含一个 user 的属性,也有一个 userAddress 属性,此时会存在混淆。读者可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_AddressZip()" 或者 "findByUserAddress_Zip()"。(强烈建议:无论是否存在混淆,都要在不同类层级之间加上"_" ,增加代码可读性)

三、一些情况

1、当查询条件为null时。

举例说明如下:

实体定义:

对于一个客户实体Cus,包含有name和sex,均是String类型。

查询方法定义:

List<Cus> findByNameAndSex(String name,String sex);

使用时:

dao.findByNameAndSex(null, "男");

后台生成sql片断:

where (cus0_.name is null) and cus0_.sex=?

结论:当查询时传值是null时,数据库中只有该字段是null的记录才符合条件,并不是说忽略这个条件。也就是说,这种查询方式,只适合于明确查询条件必须传的业务,对于动态查询(条件多少是动态的,例如一般的查询列表,由最终用户使用时决定输入那些查询条件),这种简单查询是不能满足要求的。

2、排序

List<Cus> findBySexOrderByName(String sex); //名称正序(正序时,推荐此方式,简单)
List<Cus> findBySexOrderByNameAsc(String sex); //名称正序(效果同上)
List<Cus> findBySexOrderByNameDesc(String sex); //名称倒序

MAC JDK版本切换

通过命令'jdk7', 'jdk8'轻松切换到对应的Java版本:

  • 1.首先安装所有的JDk



    • Mac自带了的JDK6,安装在目录:/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/下。
    • JDK7,JDK8,JDK9则需要自己到Oracle官网下载安装对应的版本。自己安装的JDK默认路径为:/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk
  • 2.配置
    编辑~/.zshrc文件(我是zsh的shell,所有配置该文件,如果是bash,则配置.bash_profile)

在最下面加入下面的代码

#设置jdk版本
export JAVA_7_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home


#alias命令动态切换JAVA_HOME的配置
alias jdk7='export JAVA_HOME=$JAVA_7_HOME'
alias jdk8='export JAVA_HOME=$JAVA_8_HOME'


export JAVA_HOME=$JAVA_7_HOME

输入完成后保存,然后执行下面命令

source ~/.zshrc
  • 3.验证

使用:jdk7、jdk8即可切换jdk版本

java反编译

jad.exe文件,将它设置到环境变量path,(复制到 %JAVA_HOME%\BIN的目录下)
或者拷到其他已经了环境变量path的地方,或者在cmd中转到此文件目录下。

简单的方法是

jad -o -r -d F:\src -s java F:\classes\**\*.class 

-o - overwrite output files without confirmation (default: no) 无需确定覆写文件

-r - restore package directory structrure 恢复包目录结构

-s - output file extension (by default '.jad') 如果不设置为-s java,则默认扩展名为.jad

其他的,F:\classes***.class 中的两颗接连的星,表示任意层次的子目录

phpstorm 配置

<p>一些技巧<br/>
http://phpstorm.tips/tips</p>

<h2 id="toc_0">修改 editor 主题</h2>

<p>默认的主题不太多,可以自己添加自定义的主题。</p>

<p>网站 Daylerees 有许多主题的预览,选择自己喜欢的主题;</p>

<p>所有的主题可以在 Github 上找到,选择 jetbrains 文件夹,查看自己喜欢的主题;</p>

<p>查看该主题的 raw,复制浏览器中的地址,比如:https://raw.githubusercontent.com/daylerees/colour-schemes/master/jetbrains/peacock.icls;</p>

<p>在 mac 中,打开 ~/Library/Preferences/PhpStorm2016.3/colors 文件夹,使用 wget 下载该主题;</p>

<p>Windows 中的目录好像是 Users/用户名/PhpStorm2016.3/config/colors;</p>

<p>重启 PhpStrom,在 Preferences>Editor>Color&Fonts 中选择指定的主题;</p>

<h2 id="toc_1">修改 Project 栏的颜色</h2>

<p>在修改了 editor 的主题之后,左边的 Project 栏的颜色跟 editor 不一致,可以使用 color 插件来实现一致的主题。</p>

<p>打开 Preferences,选择 Plugin,打开 Browse repositories;</p>

<p>搜索 Color ide 插件,安装;</p>

<p>重启 PhpStorm,这样 Project 栏和 Editor 的主题颜色已经一致;</p>

<h2 id="toc_2">修改 Phpstorm 默认的文件类型图标</h2>

<p>打开 Preferences>Plugin,点击 Browse repositories 然后搜索 Material Theme UI;</p>

<p>配置清单:</p>

<p>主题-material default 【默认自带】</p>

<p>字号:12</p>

<h1 id="toc_3">phpstorm 配置</h1>

<p>一些技巧<br/>
http://phpstorm.tips/tips</p>

<h2 id="toc_4">修改 editor 主题</h2>

<p>默认的主题不太多,可以自己添加自定义的主题。</p>

<p>网站 Daylerees 有许多主题的预览,选择自己喜欢的主题;</p>

<p>所有的主题可以在 Github 上找到,选择 jetbrains 文件夹,查看自己喜欢的主题;</p>

<p>查看该主题的 raw,复制浏览器中的地址,比如:https://raw.githubusercontent.com/daylerees/colour-schemes/master/jetbrains/peacock.icls;</p>

<p>在 mac 中,打开 ~/Library/Preferences/PhpStorm2016.3/colors 文件夹,使用 wget 下载该主题;</p>

<p>Windows 中的目录好像是 Users/用户名/PhpStorm2016.3/config/colors;</p>

<p>重启 PhpStrom,在 Preferences>Editor>Color&Fonts 中选择指定的主题;</p>

<h2 id="toc_5">修改 Project 栏的颜色</h2>

<p>在修改了 editor 的主题之后,左边的 Project 栏的颜色跟 editor 不一致,可以使用 color 插件来实现一致的主题。</p>

<p>打开 Preferences,选择 Plugin,打开 Browse repositories;</p>

<p>搜索 Color ide 插件,安装;</p>

<p>重启 PhpStorm,这样 Project 栏和 Editor 的主题颜色已经一致;</p>

<h2 id="toc_6">修改 Phpstorm 默认的文件类型图标</h2>

<p>打开 Preferences>Plugin,点击 Browse repositories 然后搜索 Material Theme UI;</p>

<p>配置清单:</p>

<p>主题-material default 【默认自带】</p>

<p>字号:12</p>

<p>View菜单<br/>
<br/>
</p>

<p>window菜单<br/>
</p>

<p>运行配置<br/>
</p>

phpstorm配置.zip

DockerFile 编写小记

## DockerFile命令指南

### 格式
Dockerfile 中所有的命令都是以下格式:

```
INSTRUCTION argument
```
指令(INSTRUCTION)不分大小写,但是推荐大写。
### FROM 命令
`FROM `,例如

```
FROM ubuntu
```

所有的 Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像;可以在同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。

### MAINTAINER 命令
`MAINTAINER `用于指定镜像创建者和联系方式。
例如

```
MAINTAINER Victor Coisne victor.coisne@dotcloud.com
```
### RUN 命令

```
RUN
```
用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。
### ADD 命令

```
ADD
```

用于从将` `文件复制到` ` 文件:`` 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件 url,` `是容器中的绝对路径。

### CMD 命令
CMD 命令有三种格式:

- CMD ["executable","param1","param2"]:推荐使用的 exec 形式。
- CMD ["param1","param2"]:无可执行程序形式
- CMD command param1 param2:shell 形式。

CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件:不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。

> 一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。

> CMD 的 shell 形式默认调用 /bin/sh -c 执行命令。

> CMD命令会被 Docker 命令行传入的参数覆盖:

> ```
> docker run busybox /bin/echo Hello Docker
> ```
> 会把 CMD 里的命令覆盖。

### ENTRYPOINT 命令
ENTRYPOINT 命令的字面意思是进入点,而功能也恰如其意:他可以让你的容器表现得像一个可执行程序一样。

ENTRYPOINT 命令也有两种格式:

- ENTRYPOINT ["executable", "param1", "param2"] :推荐使用的 exec 形式
- ENTRYPOINT command param1 param2 :shell 形式

> 一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

关于 CMD 和 ENTRYPOINT 的联系请看下面的例子
仅仅使用 ENTRYPOINT:

```
FROM ubuntu
ENTRYPOINT ls -l
```
执行 `docker run 306cd7e8408b /etc/fstab `和 `docker run 306cd7e8408b` 结果并不会有什么差别:

```
命令 # docker run 306cd7e8408b /etc/fstab
total 64
drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot
drwxr-xr-x 5 root root 360 Apr 24 02:52 dev
drwxr-xr-x 64 root root 4096 Apr 24 02:52 etc
drwxr-xr-x 2 root root 4096 Apr 10 2014 home
……
```
但是我们通常使用 `ENTRYPOINT `作为容器的入口,使用` CMD` 给 `ENTRYPOINT `增加默认选项:

```
FROM ubuntu
CMD ["-l"]
ENTRYPOINT ["ls"]
```

然后执行这个容器:
不加参数便会默认有 `-l`参数:

```
命令 # docker run 89dc7e6d0ac1
total 64
drwxr-xr-x 2 root root 4096 Mar 20 05:22 bin
drwxr-xr-x 2 root root 4096 Apr 10 2014 boot
drwxr-xr-x 5 root root 360 Apr 24 02:47 dev
drwxr-xr-x 64 root root 4096 Apr 24 02:47 etc
drwxr-xr-x 2 root root 4096 Apr 10 2014 home
drwxr-xr-x 12 root root 4096 Mar 20 05:21 lib
drwxr-xr-x 2 root root 4096 Mar 20 05:20 lib64
drwxr-xr-x 2 root root 4096 Mar 20 05:19 media
drwxr-xr-x 2 root root 4096 Apr 10 2014 mnt
drwxr-xr-x 2 root root 4096 Mar 20 05:19 opt
dr-xr-xr-x 386 root root 0 Apr 24 02:47 proc
drwx------ 2 root root 4096 Mar 20 05:22 root
drwxr-xr-x 7 root root 4096 Mar 20 05:21 run
drwxr-xr-x 2 root root 4096 Apr 21 22:18 sbin
drwxr-xr-x 2 root root 4096 Mar 20 05:19 srv
dr-xr-xr-x 13 root root 0 Apr 24 02:47 sys
drwxrwxrwt 2 root root 4096 Mar 20 05:22 tmp
drwxr-xr-x 11 root root 4096 Apr 21 22:18 usr
drwxr-xr-x 12 root root 4096 Apr 21 22:18 var
```

加了`/etc/fstab` 参数便会覆盖原有的 -l 参数:

```
命令 # docker run 89dc7e6d0ac1 /etc/fstab
/etc/fstab
```

### EXPOSE 命令

```
EXPOSE [...]
```
命令用来指定对外开放的端口。
例如 `EXPOSE 80 3306`,开放 80 和 3306 端口。

### WORKDIR命令

```
WORKDIR /path/to/work/dir
```
配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。
可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/。

例如:

```
FROM ubuntu
WORKDIR /etc
WORKDIR ..
WORKDIR usr
WORKDIR lib
ENTRYPOINT pwd
```
docker run ID 得到的结果为:`/usr/lib`

### USER命令

```
USER
```
为容器内指定 `CMD`、 `RUN`、 `ENTRYPOINT` 命令运行时的用户名或UID。

### VLOUME 命令

```
VOLUME ['/data']
```
允许容器访问容器的目录、允许容器之间互相访问目录。
`VOLUME` 仅仅是允许将某一个目录暴露在外面,更多的操作还需要依赖 Docker 命令实现。
更多的内容可以参考 [深入理解 Docker Volume(一)](http://dockerone.com/article/128)

### ENV 命令
参考 export 的用法咧:

```
ENV LC_ALL en_US.UTF-8
```

实例
Dockerfile 的写法已经讲述完毕,这儿有一个示例的 Dockerfile:

```
#Dockerfile
FROM centos6-base
#指定centos6系统
MAINTAINER zhou_mfk
#我抄的他的 Dockerfile
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
#创建私钥
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
#修复SSH登录,否则登陆后的用户会被秒退。
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
#创建root用户的ssh文件夹
EXPOSE 22
#开放端口
RUN echo 'root:redhat' | chpasswd
#root用户改密码为redhat
RUN yum install -y yum-priorities && rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
RUN yum install tar gzip gcc vim wget screen -y
#安装epel和安装一些软件
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
#系统环境变量
CMD ["/usr/sbin/sshd", "-D"]
#启动sshd
#End
```

## docker run
### 语法:

```
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
```
### OPTIONS说明:

```
-a, --attach=[] 登录容器(以docker run -d启动的容器)
-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用
--cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities
--cidfile="" 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="" 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU
-d, --detach=false 指定容器运行于前台还是后台
--device=[] 添加主机设备给容器,相当于设备直通
--dns=[] 指定容器的dns服务器
--dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
--entrypoint="" 覆盖image的入口点
--env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
--expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
-h, --hostname="" 指定容器的主机名
-i, --interactive=false 打开STDIN,用于控制台交互
--link=[] 指定容器间的关联,使用其他容器的IP、env等信息
--lxc-conf=[] 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
-m, --memory="" 指定容器的内存上限
--name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
--net="bridge" 容器网络设置,待详述
-P, --publish-all=false 指定容器暴露的端口,待详述
-p, --publish=[] 指定容器暴露的端口,待详述
--privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
--restart="" 指定容器停止后的重启策略,待详述
--rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
-t, --tty=false 分配tty设备,该可以支持终端登录
-u, --user="" 指定容器的用户
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
-w, --workdir="" 指定容器的工作目录
```
详情见:http://blog.csdn.net/one_clouder/article/details/39224767

## docker Build
### 语法:

```
docker build [OPTIONS] PATH | URL | -
```

### OPTIONS说明:

```
--build-arg=[] :设置镜像创建时的变量;
--cpu-shares :设置 cpu 使用权重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配额;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的内存 id;
--disable-content-trust :忽略校验,默认开启;
-f :指定要使用的Dockerfile路径;
--force-rm :设置镜像过程中删除中间容器;
--isolation :使用容器隔离技术;
--label=[] :设置镜像使用的元数据;
-m :设置内存最大值;
--memory-swap :设置Swap的最大值为内存+swap,"-1"表示不限swap;
--no-cache :创建镜像的过程不使用缓存;
--pull :尝试去更新镜像的新版本;
-q :安静模式,成功后只输出镜像ID;
--rm :设置镜像成功后删除中间容器;
--shm-size :设置/dev/shm的大小,默认值是64M;
--ulimit :Ulimit配置。
```
## docker commit
### 语法:

```
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
```
### OPTIONS说明:

```
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
```