您的位置:首页 > 其它

近期遇到小知识点总结

2017-07-21 14:51 204 查看
一、定时同步器

Timer是一种工具类,在Java.util包中,线程用其安排以后在后台线程中执行的任务,可安排任务执行一次,也可以定期重复执行。它的构造函数如下:

Timer(boolean isDaemon)
//创建一个新计时器,可以指定其相关的线程作为守护程序运行。

守护线程:当主线程结束后,该线程也结束的线程。

非守护线程:当主线程结束后,该线程仍然继续执行。

isDaemon为true时为守护线程。Timer类有个schedule方法可以创建一个任务,如下:

void  schedule(TimerTask task, Date firstTime, long period)
//安排指定的任务在指定的时间开始进行重复的固定延迟执行。
//第一个参数是指定任务,即TimerTask对象;第二个参数为第一次开启任务时间;第三个参数为时间间隔,即每隔多长时间执行一次

TimeTask是用来创建一个新的线程任务的,它实现了Runnable接口,如果我们要创建一个新的线程任务,只需要继承TimerTask,并重写run方法即可。

参考此博客,具体使用示例亦可参考此博客---->定时器

二、sql语句

alter table 表名 rename column A to B;//修改字段名

alter table 表名 add 字段名 字段类型;

alter table 表名 drop 字段名;

postgresql中json及array类型的字段相关:

select '[1,2,3]'::json->2;  --3
select '{"a":1,"b":2}'::json->'b';  --2
select '[1,2,3]'::json->>2; --3
select '{"a":1,"b":2}'::json->>'b'; --2
-> 和 ->> 查询出的结果肉眼看起来是一样的,区别在于后者是返回text
select '{"a":[1,2,3],"b":[4,5,6]}'::json#>'{a,2}';  --3
select '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}'; --5
create table testjson(id serial,data json);
insert into testjson(data) values('{"a":1,"b":2}'::json);
insert into testjson(data) values('{"a":3,"b":4,"c":5}'::json);
insert into testjson(data) values('{"a":6,"c":7}'::json);
select * from testjson;

select * from testjson where(data->>'a')::int>1;
-- ->>是转换成text然后再::int进行比较

insert into testjson(data) values('{"a":"smallfish"}');

CREATE OR REPLACE FUNCTION json_intext(text) RETURNS json AS $$ --要么创建一个新函数,要么替换现有的定义
SELECT json_in($1::cstring);
$$ LANGUAGE SQL IMMUTABLE;

alter table testjson add arrays double precision[];

insert into testjson(arrays) values('{56.4,45.6}');

insert into testjson(arrays) values(array[3,4,5]);

alter table testjson add twoarray double precision[][];

insert into testjson(twoarray) values(array[[3,4,5],[6,7,8]]);

alter table testjson add source json;

insert into testjson(source) values('{"point1":[1,2],"point2":[3,4],"12":[5,6],"1234":[5,6]}')


三、hibernate save

save方法返回的是Serializable接口,该结果的值就是你插入到数据库后新记录的主键值。如果主键是数值,可以按如下方法:

Serializable result = this.getSession().save(t);
Integer integer = (Integer) result;

Hibernate中Query.uniqueResult();若有多个返回值会抛错,有且只有一个时返回Object,没有值返回null。

四、使用JSONObject.fromObject()、toBean()方法 属性类型为Timestamp时的处理

1.当使用JSONObject.fromObject()及JSONArray.fromObject()而Object中有Timestamp类型的属性时,转换成得json内的时间戳型属性会变成这样:

"createTime":{"date":21,"day":5,"hours":10,"minutes":3,"month":6,"nanos":0,"seconds":51,"time":1500602631000,"timezoneOffset":-480,"year":117}


net.sf.json.JSONObject.fromObject(Object object,JsonConfig jsonConfig)还接受一个JsonConfig对象,我们可以扩展JsonValueProcessor接口,具体解决方法如下:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;
/*** 将Bean中的Timestamp转换为json中的日期字符串*/
public class DateJsonValueProcessor implements JsonValueProcessor {

public static final String Default_DATE_PATTERN ="yyyy-MM-dd";
private DateFormat dateFormat ;

public DateJsonValueProcessor(String datePattern){
try{
dateFormat  = new SimpleDateFormat(datePattern);
}catch(Exception e ){
dateFormat = new SimpleDateFormat(Default_DATE_PATTERN);
}
}

public Object processArrayValue(Object value, JsonConfig jsonConfig) {
if(null!=value){
return process(value);
}else{
return "";
}
//return process(value);
}
public Object processObjectValue(String key, Object value,JsonConfig jsonConfig) {
if(null!=value){
return process(value);
}else{
return "";
}
//return process(value);
}

private Object process(Object value){
return dateFormat.format((Date)value);
}
}


使用:

JsonConfig config = new JsonConfig();
config.registerJsonValueProcessor(Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
JSONObject o = JSONObject.fromObject(user,config);
JsonConfig config = new JsonConfig();
config.registerJsonValueProcessor(Timestamp.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
JSONArray array = JSONArray.fromObject(userList, config);


2.当从Json转换为Bean时会遇到同样的问题,解决方案如下:

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import net.sf.ezmorph.MorphException;
import net.sf.ezmorph.object.AbstractObjectMorpher;

public class TimeStampMorpher extends AbstractObjectMorpher{

private String[] formats = new String[]{"yyyy-MM-dd hh:mm:ss","yyyy-MM-dd"};

public void setFormats(String[] formats) {
this.formats = formats;
}

public TimeStampMorpher() {
}

public TimeStampMorpher(String[] formats) {
this.formats = formats;
}

@Override
public Object morph(Object dateStr) {
if(null == dateStr){
return null;
}
if(Timestamp.class.isAssignableFrom(dateStr.getClass())){
return (Timestamp)dateStr;
}
if(!supports(dateStr.getClass())){
throw new MorphException(dateStr.getClass()+"不是支持的类型!");
}

String strValue = (String)dateStr;
SimpleDateFormat dateParser = null;

for(int i=0,k=formats.length;i<k;i++){
if(null == dateParser){
dateParser = new SimpleDateFormat(formats[i]);
}else{
dateParser.applyPattern(formats[i]);
}
try{
if(!strValue.equals("")){
return new Timestamp(dateParser.parse(strValue.toLowerCase()).getTime());
}
}catch(ParseException e){
e.printStackTrace();
}
}
return new java.sql.Timestamp(System.currentTimeMillis());//返回默认日期
}

@Override
public Class morphsTo() {
return Timestamp.class;
}
public boolean supports(Class claszz){
return String.class.isAssignableFrom(claszz);
}
}


TimeStampMorpher的作用与DataJsonValueProcessor相反,他在Json转换为Bean时,把指定的时间格式转换为Timestamp

使用:

JSONUtils.getMorpherRegistry().registerMorpher(new TimeStampMorpher());
TSysUser u = (TSysUser) JSONObject.toBean(o, TSysUser.class);
JSONUtils.getMorpherRegistry().registerMorpher(new TimeStampMorpher());
List<TSysUser> ul = JSONArray.toList(array, TSysUser.class);
for(TSysUser u:ul){
System.out.println(u.toString());
}

参考博客:
number1number2number3number4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: