一、定时同步器
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());
}
参考博客:
number1、number2、number3、number4