1.RestFul风格是一种URL规则,传递参数的时候不用?改用/
@RestMapping(“/list/{id}”)通过@PathVariable()可以接收url中传过来的参数,@RestMapping(“/list/{id}”)中接收参数使用大括号加上变量名称@PathVariable(“id”)中的变量名称要和@RestMapping(“/list/{id}”)中的变量名称相同
2. Mysql中建表时给字段添加注释:①CREATE TABLE groups(gid INT PRIMARY KEY AUTO_INCREMENT COMMENT '设置主键自增')②查看表注释:SHOW CREATE TABLE communication_group③查看列注释:SHOW FULL COLUMNS FROM groups
3. 这个::是java 8里引入lambda后的一种用法,表示引用,比如静态方法的引用String::valueOf;
比如构造器的引用,ArrayList::new
4.各种校验:
//联系电话校验
String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(16[([0-3]|[5-9])])|(17[([0-3]|[5-9])])|(18[0,5-9]))\\d{8}$";
//联系邮箱校验
String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
5. @JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段,若这个字段存在则不会忽略。这个注解还可以指定要忽略的字段(不管是空还是非空)。使用方法如下@JsonIgnoreProperties({ "internalId", "secretKey" }),@JsonIgnore此注解用于属性或者方法上(最好是属性上),序列化和反序列化就会忽略该属性(不管该属性是空还是非空),以上的三个注解都是在序列化和反序列化的时候起作用。
@JsonInclude()注解:该注解只对javaBean序列化为json对象时起作用,反序列化的时候不起作用
使用jackson进行序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null;这样在某些前端组件上应用该json对象会报错。(例如:echarts)
下面总结了两种方法,解决了当属性为null时不参与序列化:
方法一:
1.实体上使用如下注解 @JsonInclude(Include.NON_NULL) 将该标记放在属性上,如果该属性为NULL则不参与序列化 ;如果放在类上边,那对这个类的全部属性起作用。具体取值有:
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化
注:使用了该注解,那么在import时需要把一下两个类引入到源文件中
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
2.代码上使用如下方法:
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
User user = new User(1,"",null);
String outJson = mapper.writeValueAsString(user);
System.out.println(outJson);
通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化 。具体取值有:
//Include.Include.ALWAYS 默认
//Include.NON_DEFAULT 属性为默认值不序列化
//Include.NON_EMPTY 属性为 空(“”) 或者为 NULL 都不序列化
//Include.NON_NULL 属性为NULL 不序列化
6. 学习JackJson
7. MySql相关
①当某一列发生变化需要修改的时候执行如下面的语句(前提是列名没有发生变化,只是数据类型和约束发生了变化):
ALTER TABLE HRSC_ORDER_BATCH MODIFY COLUMN FAIL_REAS INT(3) COMMENT '失败原因【批量派出失败原因:字典值';
②如果想在一个已经建好的表中添加一列,可以用诸如:
alter table t1 add column addr varchar(20) not null;
这条语句会向已有的表t1中加入一列addr,这一列在表的最后一列位置。如果我们希望添加在指定的一列,可以用:
alter table t1 add column addr varchar(20) not null COMMENT ‘注释的东西’ after user1;
注意,上面这个命令的意思是说添加addr列到user1这一列后面。如果想添加到第一列的话,可以用:
alter table t1 add column addr varchar(20) not null first;
将表web1.new_table change中,列名def改为unit
alter table web1.new_table change def unit char;
将表web1.new_table change中,列名def的列删除
alter table web1.new_table drop column def ;
if等的用法:
8.@Value("${db.driverclass}"):获取配置文件(.properties结尾)的db.driverclass的值,并自动注入到类的某个setter方法上
有的时候我们定义了Properties文件,并且使用Spring的PropertyPlaceholderConfigurer类在Spring配置文件中以占位符的方式替换数据库等配置文件,那么万一我们想将这些属性也同时注入到某个bean中呢?
这里做个说明,网上很多资料说的<util:properties>方式我们这里不做介绍,有兴趣的自己去看。我们这里只介绍使用PropertyPlaceholderConfigurer管理起来的方式。
其实很简单,比如你在db.properties中配置的db.driverclass=com.mysql.jdbc.Driver,则在我们的bean的某个set方法上可以用@Value("${db.driverclass}")来完成注入,
也可以在成员变量上注入。
例子代码如:
@Service
public class DatabaseInfo {
private String driverClass; //也可以在这里注入
private void setDriverClass(String dc) {
this.driverClass = dc;
}
}
9. lombok 注解:
lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
Lombok 注解在线帮助文档:http://projectlombok.org/features/index.
下面介绍几个我常用的 lombok 注解:
@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然,这带来的副作用就是不易阅读…不过,还是能看得懂吧,废话不多说,先看一下lombok支持的一些常见的注解。
@NonNull
@Cleanup
@Getter/@Setter
@ToString
@EqualsAndHashCode
@NoArgsConstructor/@RequiredArgsConstructor /@AllArgsConstructor
@Data
@Value
@SneakyThrows
@Synchronized
@Log
@NonNull
这个注解可以用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,举个例子来看看:
//成员方法参数加上@NonNull注解public String getName(@NonNull Person p){
return p.getName();
}
实际效果相当于:
public String getName(@NonNull Person p){
if(p==null){
throw new NullPointerException("person");
}
return p.getName();
}
用在构造方法的参数上效果类似,就不再举例子了。
@Cleanup
这个注解用在变量前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的close()方法,如果该资源有其它关闭方法,可使用@Cleanup(“methodName”)来指定要调用的方法,就用输入输出流来举个例子吧:
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[1024];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
实际效果相当于:
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
}
是不是简化了很多。
@Getter/@Setter
这一对注解从名字上就很好理解,用在成员变量前面,相当于为成员变量生成对应的get和set方法,同时还可以为生成的方法指定访问修饰符,当然,默认为public,直接来看下面的简单的例子:
public class Programmer{
@Getter
@Setter
private String name;
@Setter(AccessLevel.PROTECTED)
private int age;
@Getter(AccessLevel.PUBLIC)
private String language;
}实际效果相当于:
public class Programmer{
private String name;
private int age;
private String language;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
protected void setAge(int age){
this.age = age;
}
public String getLanguage(){